diff --git a/Source/cmGlobalWatcomWMakeGenerator.cxx b/Source/cmGlobalWatcomWMakeGenerator.cxx index 29a60d4af..dc4089b1b 100644 --- a/Source/cmGlobalWatcomWMakeGenerator.cxx +++ b/Source/cmGlobalWatcomWMakeGenerator.cxx @@ -50,6 +50,7 @@ cmLocalGenerator *cmGlobalWatcomWMakeGenerator::CreateLocalGenerator() lg->SetSilentNoColon(true); lg->SetDefineWindowsNULL(true); lg->SetWindowsShell(true); + lg->SetWatcomWMake(true); lg->SetMakeSilentFlag("-s -h"); lg->SetGlobalGenerator(this); lg->SetIgnoreLibPrefix(true); diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 0b0594cbc..2909b332d 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -40,6 +40,7 @@ cmLocalGenerator::cmLocalGenerator() this->Parent = 0; this->WindowsShell = false; this->WindowsVSIDE = false; + this->WatcomWMake = false; this->MSYSShell = false; this->IgnoreLibPrefix = false; this->UseRelativePaths = false; @@ -2348,6 +2349,10 @@ std::string cmLocalGenerator::EscapeForShell(const char* str, bool makeVars, { flags |= cmsysSystem_Shell_Flag_EchoWindows; } + if(this->WatcomWMake) + { + flags |= cmsysSystem_Shell_Flag_WatcomWMake; + } // Compute the buffer size needed. int size = (this->WindowsShell ? diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index fc59ed5b3..4aa49a762 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -278,6 +278,7 @@ protected: std::map UniqueObjectNamesMap; bool WindowsShell; bool WindowsVSIDE; + bool WatcomWMake; bool ForceUnixPath; bool MSYSShell; bool UseRelativePaths; diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h index 5b9d7fdc2..5fa78f70c 100644 --- a/Source/cmLocalUnixMakefileGenerator3.h +++ b/Source/cmLocalUnixMakefileGenerator3.h @@ -104,6 +104,11 @@ public: */ void SetWindowsShell(bool v) {this->WindowsShell = v;} + /** + * Set to true if the make tool being used is Watcom WMake. + */ + void SetWatcomWMake(bool v) {this->WatcomWMake = 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/kwsys/System.c b/Source/kwsys/System.c index 288513fb4..62807c8a8 100644 --- a/Source/kwsys/System.c +++ b/Source/kwsys/System.c @@ -222,7 +222,7 @@ static int kwsysSystem_Shell__GetArgumentSize(const char* in, } } - /* Check whether this character needs escaping. */ + /* Check whether this character needs escaping for the shell. */ if(isUnix) { /* On Unix a few special characters need escaping even inside a @@ -261,7 +261,7 @@ static int kwsysSystem_Shell__GetArgumentSize(const char* in, } } - /* The dollar sign needs special handling in some environments. */ + /* Check whether this character needs escaping for a make tool. */ if(*c == '$') { if(flags & kwsysSystem_Shell_Flag_Make) @@ -277,6 +277,16 @@ static int kwsysSystem_Shell__GetArgumentSize(const char* in, size += 2; } } + else if(*c == '#') + { + if((flags & kwsysSystem_Shell_Flag_Make) && + (flags & kwsysSystem_Shell_Flag_WatcomWMake)) + { + /* In Watcom WMake makefiles a pound is written $# so we need + one extra character. */ + ++size; + } + } } /* Check whether the argument needs surrounding quotes. */ @@ -333,7 +343,7 @@ static char* kwsysSystem_Shell__GetArgument(const char* in, char* out, } } - /* Check whether this character needs escaping. */ + /* Check whether this character needs escaping for the shell. */ if(isUnix) { /* On Unix a few special characters need escaping even inside a @@ -377,7 +387,7 @@ static char* kwsysSystem_Shell__GetArgument(const char* in, char* out, } } - /* The dollar sign needs special handling in some environments. */ + /* Check whether this character needs escaping for a make tool. */ if(*c == '$') { if(flags & kwsysSystem_Shell_Flag_Make) @@ -405,6 +415,23 @@ static char* kwsysSystem_Shell__GetArgument(const char* in, char* out, *out++ = '$'; } } + else if(*c == '#') + { + if((flags & kwsysSystem_Shell_Flag_Make) && + (flags & kwsysSystem_Shell_Flag_WatcomWMake)) + { + /* In Watcom WMake makefiles a pound is written $#. The make + tool will replace it with just # before passing it to the + shell. */ + *out++ = '$'; + *out++ = '#'; + } + else + { + /* Otherwise a pound is written just #. */ + *out++ = '#'; + } + } else { /* Store this character. */ diff --git a/Source/kwsys/System.h.in b/Source/kwsys/System.h.in index 8c7d2a857..731bec91b 100644 --- a/Source/kwsys/System.h.in +++ b/Source/kwsys/System.h.in @@ -32,6 +32,7 @@ #define kwsysSystem_Shell_Flag_Make kwsys_ns(System_Shell_Flag_Make) #define kwsysSystem_Shell_Flag_VSIDE kwsys_ns(System_Shell_Flag_VSIDE) #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_AllowMakeVariables kwsys_ns(System_Shell_Flag_AllowMakeVariables) #if defined(__cplusplus) @@ -82,12 +83,15 @@ enum kwsysSystem_Shell_Flag_e /** In a windows whell the argument is being passed to "echo". */ kwsysSystem_Shell_Flag_EchoWindows = (1<<2), + /** The target shell is in a Watcom WMake makefile. */ + kwsysSystem_Shell_Flag_WatcomWMake = (1<<3), + /** 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 non-alphanumeric characters that have significance to some makes or shells produce undefined behavior. */ - kwsysSystem_Shell_Flag_AllowMakeVariables = (1<<3) + kwsysSystem_Shell_Flag_AllowMakeVariables = (1<<4) }; #if defined(__cplusplus) @@ -107,6 +111,7 @@ enum kwsysSystem_Shell_Flag_e # undef kwsysSystem_Shell_Flag_Make # undef kwsysSystem_Shell_Flag_VSIDE # undef kwsysSystem_Shell_Flag_EchoWindows +# undef kwsysSystem_Shell_Flag_WatcomWMake # undef kwsysSystem_Shell_Flag_AllowMakeVariables #endif