Browse Source

ENH: Adding support for # escape in Watcom WMake.

Brad King 19 years ago
parent
commit
54731fa2c8

+ 1 - 0
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);

+ 5 - 0
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 ?

+ 1 - 0
Source/cmLocalGenerator.h

@@ -278,6 +278,7 @@ protected:
   std::map<cmStdString, cmStdString> UniqueObjectNamesMap;
   bool WindowsShell;
   bool WindowsVSIDE;
+  bool WatcomWMake;
   bool ForceUnixPath;
   bool MSYSShell;
   bool UseRelativePaths;

+ 5 - 0
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.

+ 31 - 4
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.  */

+ 6 - 1
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