diff --git a/Source/cmGlobalNMakeMakefileGenerator.cxx b/Source/cmGlobalNMakeMakefileGenerator.cxx index 88dd81d5b..446881bf2 100644 --- a/Source/cmGlobalNMakeMakefileGenerator.cxx +++ b/Source/cmGlobalNMakeMakefileGenerator.cxx @@ -47,6 +47,7 @@ cmLocalGenerator *cmGlobalNMakeMakefileGenerator::CreateLocalGenerator() lg->SetGlobalGenerator(this); lg->SetIgnoreLibPrefix(true); lg->SetPassMakeflags(true); + lg->SetNMake(true); lg->SetUnixCD(false); return lg; } diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index e7d78cd23..4253848ff 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -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 ? diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 587a6f2b2..12e745162 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -341,6 +341,7 @@ protected: bool WindowsVSIDE; bool WatcomWMake; bool MinGWMake; + bool NMake; bool ForceUnixPath; bool MSYSShell; bool UseRelativePaths; diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h index c6fcb99fa..d3216439b 100644 --- a/Source/cmLocalUnixMakefileGenerator3.h +++ b/Source/cmLocalUnixMakefileGenerator3.h @@ -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. diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index 1c144e279..51ebcbc17 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -76,7 +76,8 @@ void cmLocalVisualStudio7Generator::FixGlobalTargets() { std::vector 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; diff --git a/Source/kwsys/System.c b/Source/kwsys/System.c index ec328f802..de85c3a5d 100644 --- a/Source/kwsys/System.c +++ b/Source/kwsys/System.c @@ -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. */ diff --git a/Source/kwsys/System.h.in b/Source/kwsys/System.h.in index b19026211..e76c499e4 100644 --- a/Source/kwsys/System.h.in +++ b/Source/kwsys/System.h.in @@ -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