ENH: Improved escaping in kwsys/System. Added escape of % for NMake. Added escape of ; for the VS IDE.
This commit is contained in:
parent
4e96f4d503
commit
857e2e15dd
|
@ -47,6 +47,7 @@ cmLocalGenerator *cmGlobalNMakeMakefileGenerator::CreateLocalGenerator()
|
|||
lg->SetGlobalGenerator(this);
|
||||
lg->SetIgnoreLibPrefix(true);
|
||||
lg->SetPassMakeflags(true);
|
||||
lg->SetNMake(true);
|
||||
lg->SetUnixCD(false);
|
||||
return lg;
|
||||
}
|
||||
|
|
|
@ -48,6 +48,7 @@ cmLocalGenerator::cmLocalGenerator()
|
|||
this->WindowsVSIDE = false;
|
||||
this->WatcomWMake = false;
|
||||
this->MinGWMake = false;
|
||||
this->NMake = false;
|
||||
this->MSYSShell = false;
|
||||
this->IgnoreLibPrefix = false;
|
||||
this->UseRelativePaths = false;
|
||||
|
@ -2884,6 +2885,10 @@ std::string cmLocalGenerator::EscapeForShell(const char* str, bool makeVars,
|
|||
{
|
||||
flags |= cmsysSystem_Shell_Flag_MinGWMake;
|
||||
}
|
||||
if(this->NMake)
|
||||
{
|
||||
flags |= cmsysSystem_Shell_Flag_NMake;
|
||||
}
|
||||
|
||||
// Compute the buffer size needed.
|
||||
int size = (this->WindowsShell ?
|
||||
|
|
|
@ -341,6 +341,7 @@ protected:
|
|||
bool WindowsVSIDE;
|
||||
bool WatcomWMake;
|
||||
bool MinGWMake;
|
||||
bool NMake;
|
||||
bool ForceUnixPath;
|
||||
bool MSYSShell;
|
||||
bool UseRelativePaths;
|
||||
|
|
|
@ -101,6 +101,11 @@ public:
|
|||
*/
|
||||
void SetMinGWMake(bool v) {this->MinGWMake = v;}
|
||||
|
||||
/**
|
||||
* Set to true if the make tool being used is NMake.
|
||||
*/
|
||||
void SetNMake(bool v) {this->NMake = v;}
|
||||
|
||||
/**
|
||||
* Set to true if the shell being used is the MSYS shell.
|
||||
* This controls if statements in the makefile and the SHELL variable.
|
||||
|
|
|
@ -76,7 +76,8 @@ void cmLocalVisualStudio7Generator::FixGlobalTargets()
|
|||
{
|
||||
std::vector<std::string> no_depends;
|
||||
cmCustomCommandLine force_command;
|
||||
force_command.push_back(";");
|
||||
force_command.push_back("cd");
|
||||
force_command.push_back(".");
|
||||
cmCustomCommandLines force_commands;
|
||||
force_commands.push_back(force_command);
|
||||
const char* no_main_dependency = 0;
|
||||
|
|
|
@ -315,13 +315,23 @@ static int kwsysSystem_Shell__GetArgumentSize(const char* in,
|
|||
{
|
||||
if((flags & kwsysSystem_Shell_Flag_VSIDE) ||
|
||||
((flags & kwsysSystem_Shell_Flag_Make) &&
|
||||
(flags & kwsysSystem_Shell_Flag_MinGWMake)))
|
||||
((flags & kwsysSystem_Shell_Flag_MinGWMake) ||
|
||||
(flags & kwsysSystem_Shell_Flag_NMake))))
|
||||
{
|
||||
/* In the VS IDE or MinGW make a percent is written %% so we
|
||||
need one extra characters. */
|
||||
/* In the VS IDE, NMake, or MinGW make a percent is written %%
|
||||
so we need one extra characters. */
|
||||
size += 1;
|
||||
}
|
||||
}
|
||||
else if(*c == ';')
|
||||
{
|
||||
if(flags & kwsysSystem_Shell_Flag_VSIDE)
|
||||
{
|
||||
/* In a VS IDE a semicolon is written ";" so we need two extra
|
||||
characters. */
|
||||
size += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Check whether the argument needs surrounding quotes. */
|
||||
|
@ -471,9 +481,10 @@ static char* kwsysSystem_Shell__GetArgument(const char* in, char* out,
|
|||
{
|
||||
if((flags & kwsysSystem_Shell_Flag_VSIDE) ||
|
||||
((flags & kwsysSystem_Shell_Flag_Make) &&
|
||||
(flags & kwsysSystem_Shell_Flag_MinGWMake)))
|
||||
((flags & kwsysSystem_Shell_Flag_MinGWMake) ||
|
||||
(flags & kwsysSystem_Shell_Flag_NMake))))
|
||||
{
|
||||
/* In the VS IDE or MinGW make a percent is written %%. */
|
||||
/* In the VS IDE, NMake, or MinGW make a percent is written %%. */
|
||||
*out++ = '%';
|
||||
*out++ = '%';
|
||||
}
|
||||
|
@ -483,6 +494,25 @@ static char* kwsysSystem_Shell__GetArgument(const char* in, char* out,
|
|||
*out++ = '%';
|
||||
}
|
||||
}
|
||||
else if(*c == ';')
|
||||
{
|
||||
if(flags & kwsysSystem_Shell_Flag_VSIDE)
|
||||
{
|
||||
/* In a VS IDE a semicolon is written ";". If this is written
|
||||
in an un-quoted argument it starts a quoted segment,
|
||||
inserts the ; and ends the segment. If it is written in a
|
||||
quoted argument it ends quoting, inserts the ; and restarts
|
||||
quoting. Either way the ; is isolated. */
|
||||
*out++ = '"';
|
||||
*out++ = ';';
|
||||
*out++ = '"';
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise a semicolon is written just ;. */
|
||||
*out++ = ';';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Store this character. */
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#define kwsysSystem_Shell_Flag_EchoWindows kwsys_ns(System_Shell_Flag_EchoWindows)
|
||||
#define kwsysSystem_Shell_Flag_WatcomWMake kwsys_ns(System_Shell_Flag_WatcomWMake)
|
||||
#define kwsysSystem_Shell_Flag_MinGWMake kwsys_ns(System_Shell_Flag_MinGWMake)
|
||||
#define kwsysSystem_Shell_Flag_NMake kwsys_ns(System_Shell_Flag_NMake)
|
||||
#define kwsysSystem_Shell_Flag_AllowMakeVariables kwsys_ns(System_Shell_Flag_AllowMakeVariables)
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
@ -90,6 +91,9 @@ enum kwsysSystem_Shell_Flag_e
|
|||
/** The target shell is in a MinGW Make makefile. */
|
||||
kwsysSystem_Shell_Flag_MinGWMake = (1<<4),
|
||||
|
||||
/** The target shell is in a NMake makefile. */
|
||||
kwsysSystem_Shell_Flag_NMake = (1<<6),
|
||||
|
||||
/** Make variable reference syntax $(MAKEVAR) should not be escaped
|
||||
to allow a build tool to replace it. Replacement values
|
||||
containing spaces, quotes, backslashes, or other
|
||||
|
@ -117,6 +121,7 @@ enum kwsysSystem_Shell_Flag_e
|
|||
# undef kwsysSystem_Shell_Flag_EchoWindows
|
||||
# undef kwsysSystem_Shell_Flag_WatcomWMake
|
||||
# undef kwsysSystem_Shell_Flag_MinGWMake
|
||||
# undef kwsysSystem_Shell_Flag_NMake
|
||||
# undef kwsysSystem_Shell_Flag_AllowMakeVariables
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue