Răsfoiți Sursa

ENH: Added support for using backslash-style escaping in CMakeLists.txt file arguments. This allows double quotes to be used in arguments.

Brad King 24 ani în urmă
părinte
comite
c5381e8588

+ 1 - 1
Modules/CMakeLists.txt

@@ -1,2 +1,2 @@
 # just install the modules
 # just install the modules
-INSTALL_FILES(/share/CMake/Modules .*\.cmake$)
+INSTALL_FILES(/share/CMake/Modules .*\\.cmake$)

+ 1 - 1
Modules/FindDart.cmake

@@ -7,5 +7,5 @@ FIND_PATH(DART_ROOT README.INSTALL
     ${PROJECT_SOURCE_DIR}/Dart 
     ${PROJECT_SOURCE_DIR}/Dart 
      /usr/share/Dart 
      /usr/share/Dart 
     "C:/Program Files/Dart" 
     "C:/Program Files/Dart" 
-    [HKEY_LOCAL_MACHINE\SOFTWARE\Dart\InstallPath]
+    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Dart\\InstallPath]
     )
     )

+ 2 - 4
Modules/FindJNI.cmake

@@ -10,14 +10,14 @@
         
         
 FIND_LIBRARY(JAVA_AWT_LIBRARY jawt 
 FIND_LIBRARY(JAVA_AWT_LIBRARY jawt 
   PATHS /usr/lib /usr/local/lib
   PATHS /usr/lib /usr/local/lib
-  "[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.3;JavaHome]/lib"
+  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/lib"
 )
 )
 
 
 # add in the include path    
 # add in the include path    
 FIND_PATH(JAVA_INCLUDE_PATH jni.h 
 FIND_PATH(JAVA_INCLUDE_PATH jni.h 
   /usr/include 
   /usr/include 
   /usr/local/include
   /usr/local/include
-  "[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.3;JavaHome]/include"
+  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
 )
 )
 
 
 FIND_PATH(JAVA_INCLUDE_PATH2 jni_md.h 
 FIND_PATH(JAVA_INCLUDE_PATH2 jni_md.h 
@@ -26,5 +26,3 @@ FIND_PATH(JAVA_INCLUDE_PATH2 jni_md.h
 )
 )
 
 
 FIND_PATH(JAVE_AWT_INCLUDE_PATH jawt.h ${JAVA_INCLUDE_PATH} )
 FIND_PATH(JAVE_AWT_INCLUDE_PATH jawt.h ${JAVA_INCLUDE_PATH} )
-
-

+ 6 - 6
Modules/FindPythonLibs.cmake

@@ -13,8 +13,8 @@ FIND_LIBRARY(PYTHON_DEBUG_LIBRARY
   PATHS
   PATHS
   /usr/lib
   /usr/lib
   /usr/local/lib
   /usr/local/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath]/libs/Debug
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.0\InstallPath]/libs/Debug
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.1\\InstallPath]/libs/Debug
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.0\\InstallPath]/libs/Debug
 )
 )
 
 
 FIND_LIBRARY(PYTHON_LIBRARY 
 FIND_LIBRARY(PYTHON_LIBRARY 
@@ -24,8 +24,8 @@ FIND_LIBRARY(PYTHON_LIBRARY
   /usr/lib/python2.1/config
   /usr/lib/python2.1/config
   /usr/lib/python2.0/config
   /usr/lib/python2.0/config
   /usr/local/lib
   /usr/local/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath]/libs
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.0\InstallPath]/libs
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.1\\InstallPath]/libs
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.0\\InstallPath]/libs
 )
 )
   
   
 FIND_PATH(PYTHON_INCLUDE_PATH Python.h
 FIND_PATH(PYTHON_INCLUDE_PATH Python.h
@@ -33,7 +33,7 @@ FIND_PATH(PYTHON_INCLUDE_PATH Python.h
   /usr/include/python2.1
   /usr/include/python2.1
   /usr/include/python2.0
   /usr/include/python2.0
   /usr/local/include
   /usr/local/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.0\InstallPath]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.1\\InstallPath]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.0\\InstallPath]/include
 )
 )
 
 

+ 20 - 20
Modules/FindTCL.cmake

@@ -30,10 +30,10 @@ FIND_LIBRARY(TCL_LIBRARY
   /usr/lib 
   /usr/lib 
   /usr/local/lib
   /usr/local/lib
   "C:/Program Files/Tcl/lib" 
   "C:/Program Files/Tcl/lib" 
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root]/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.3;Root]/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.2;Root]/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.0;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/lib
   "${TCL_TCLSH_PATH}/../lib"
   "${TCL_TCLSH_PATH}/../lib"
   "${TK_WISH_PATH}/../lib"
   "${TK_WISH_PATH}/../lib"
 )
 )
@@ -44,10 +44,10 @@ FIND_LIBRARY(TK_LIBRARY
   /usr/lib 
   /usr/lib 
   /usr/local/lib
   /usr/local/lib
   "C:/Program Files/Tcl/lib" 
   "C:/Program Files/Tcl/lib" 
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root]/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.3;Root]/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.2;Root]/lib
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.0;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/lib
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/lib
   "${TCL_TCLSH_PATH}/../lib"
   "${TCL_TCLSH_PATH}/../lib"
   "${TK_WISH_PATH}/../lib"
   "${TK_WISH_PATH}/../lib"
 )
 )
@@ -56,10 +56,10 @@ FIND_PATH(TCL_INCLUDE_PATH tcl.h
   /usr/include 
   /usr/include 
   /usr/local/include
   /usr/local/include
   "C:/Program Files/Tcl/include" 
   "C:/Program Files/Tcl/include" 
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.3;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.2;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.0;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/include
   "${TCL_TCLSH_PATH}/../include"
   "${TCL_TCLSH_PATH}/../include"
   "${TK_WISH_PATH}/../include"
   "${TK_WISH_PATH}/../include"
 )
 )
@@ -68,10 +68,10 @@ FIND_PATH(TK_INCLUDE_PATH tk.h
   /usr/include 
   /usr/include 
   /usr/local/include
   /usr/local/include
   "C:/Program Files/Tcl/include" 
   "C:/Program Files/Tcl/include" 
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.3;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.2;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.0;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/include
   "${TCL_TCLSH_PATH}/../include"
   "${TCL_TCLSH_PATH}/../include"
   "${TK_WISH_PATH}/../include"
   "${TK_WISH_PATH}/../include"
 )
 )
@@ -80,10 +80,10 @@ FIND_PATH(TK_INTERNAL_PATH tkWinInt.h
   /usr/include 
   /usr/include 
   /usr/local/include
   /usr/local/include
   "C:/Program Files/Tcl/include" 
   "C:/Program Files/Tcl/include" 
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.3;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.2;Root]/include
-  [HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.0;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/include
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/include
   "${TCL_TCLSH_PATH}/../include"
   "${TCL_TCLSH_PATH}/../include"
   "${TK_WISH_PATH}/../include"
   "${TK_WISH_PATH}/../include"
 )
 )

+ 43 - 3
Source/cmSystemTools.cxx

@@ -524,9 +524,9 @@ void cmSystemTools::GetArguments(std::string& line,
                                  std::vector<std::string>& arguments)
                                  std::vector<std::string>& arguments)
 {
 {
   // Match a normal argument (not quoted, no spaces).
   // Match a normal argument (not quoted, no spaces).
-  cmRegularExpression normalArgument("[\t ]*([^\" \t]+)[\t ]*");
+  cmRegularExpression normalArgument("[ \t]*(([^ \t\\]|[\\].)+)[ \t]*");
   // Match a quoted argument (surrounded by double quotes, spaces allowed).
   // Match a quoted argument (surrounded by double quotes, spaces allowed).
-  cmRegularExpression quotedArgument("[\t ]*(\"[^\"]*\")[\t ]*");
+  cmRegularExpression quotedArgument("[ \t]*(\"([^\"\\]|[\\].)*\")[ \t]*");
 
 
   bool done = false;
   bool done = false;
   while(!done)
   while(!done)
@@ -539,6 +539,7 @@ void cmSystemTools::GetArguments(std::string& line,
     if(foundQuoted && foundNormal)
     if(foundQuoted && foundNormal)
       {
       {
       // Both matches were found.  Take the earlier one.
       // Both matches were found.  Take the earlier one.
+      // Favor double-quoted version if there is a tie.
       if(normalArgument.start(1) < quotedArgument.start(1))
       if(normalArgument.start(1) < quotedArgument.start(1))
         {
         {
         arg = normalArgument.match(1);
         arg = normalArgument.match(1);
@@ -570,12 +571,51 @@ void cmSystemTools::GetArguments(std::string& line,
       }
       }
     if(!done)
     if(!done)
       {
       {
-      arguments.push_back(arg);
+      arguments.push_back(cmSystemTools::RemoveEscapes(arg.c_str()));
       line = line.substr(endpos, line.length() - endpos);
       line = line.substr(endpos, line.length() - endpos);
       }
       }
     }
     }
 }
 }
 
 
+
+std::string cmSystemTools::RemoveEscapes(const char* s)
+{
+  std::string result = "";
+  for(const char* ch = s; *ch; ++ch)
+    {
+    if(*ch == '\\')
+      {
+      ++ch;
+      switch (*ch)
+        {
+        case '\\': result.insert(result.end(), '\\'); break;
+        case '"': result.insert(result.end(), '"'); break;
+        case ' ': result.insert(result.end(), ' '); break;
+        case 't': result.insert(result.end(), '\t'); break;
+        case 'n': result.insert(result.end(), '\n'); break;
+        case 'r': result.insert(result.end(), '\r'); break;
+        case '0': result.insert(result.end(), '\0'); break;
+        case '\0':
+          {
+          cmSystemTools::Error("Trailing backslash in argument:\n", s);
+          return result;
+          }
+        default:
+          {
+          std::string chStr(1, *ch);
+          cmSystemTools::Error("Invalid escape sequence \\", chStr.c_str(),
+                               "\nin argument ", s);
+          }
+        }
+      }
+    else
+      {
+      result.insert(result.end(), *ch);
+      }
+    }
+  return result;
+}
+
 void cmSystemTools::Error(const char* m1, const char* m2,
 void cmSystemTools::Error(const char* m1, const char* m2,
                           const char* m3, const char* m4)
                           const char* m3, const char* m4)
 {
 {

+ 7 - 0
Source/cmSystemTools.h

@@ -132,6 +132,13 @@ public:
    */
    */
   static void GetArguments(std::string& line,
   static void GetArguments(std::string& line,
                            std::vector<std::string>& arguments);
                            std::vector<std::string>& arguments);
+  
+  /**
+   * Given a string, replace any escape sequences with the corresponding
+   * characters.
+   */
+  static std::string RemoveEscapes(const char*);
+  
 
 
   /**
   /**
    *  Add the paths from the environment variable PATH to the 
    *  Add the paths from the environment variable PATH to the 

+ 1 - 1
Templates/configure

@@ -2449,7 +2449,7 @@ fi
 	CMAKE_SHLIB_LD_LIBS=""
 	CMAKE_SHLIB_LD_LIBS=""
 	CMAKE_SHLIB_SUFFIX=".so"
 	CMAKE_SHLIB_SUFFIX=".so"
 	CMAKE_DL_LIBS=""
 	CMAKE_DL_LIBS=""
-	CMAKE_SHLIB_BUILD_FLAGS='-shared -Wl,-expect_unresolved,\*'
+	CMAKE_SHLIB_BUILD_FLAGS='-shared -Wl,-expect_unresolved,\\*'
 	CMAKE_SHLIB_LINK_FLAGS=''
 	CMAKE_SHLIB_LINK_FLAGS=''
         CMAKE_SHLIB_RUNTIME_FLAG="-Wl,-rpath,"
         CMAKE_SHLIB_RUNTIME_FLAG="-Wl,-rpath,"
         CMAKE_SHLIB_RUNTIME_SEP=":"
         CMAKE_SHLIB_RUNTIME_SEP=":"

+ 1 - 1
Templates/configure.in

@@ -263,7 +263,7 @@ case $system in
 	CMAKE_SHLIB_LD_LIBS=""
 	CMAKE_SHLIB_LD_LIBS=""
 	CMAKE_SHLIB_SUFFIX=".so"
 	CMAKE_SHLIB_SUFFIX=".so"
 	CMAKE_DL_LIBS=""
 	CMAKE_DL_LIBS=""
-	CMAKE_SHLIB_BUILD_FLAGS='-shared -Wl,-expect_unresolved,\*'
+	CMAKE_SHLIB_BUILD_FLAGS='-shared -Wl,-expect_unresolved,\\*'
 	CMAKE_SHLIB_LINK_FLAGS=''
 	CMAKE_SHLIB_LINK_FLAGS=''
         CMAKE_SHLIB_RUNTIME_FLAG="-Wl,-rpath,"
         CMAKE_SHLIB_RUNTIME_FLAG="-Wl,-rpath,"
         CMAKE_SHLIB_RUNTIME_SEP=":"
         CMAKE_SHLIB_RUNTIME_SEP=":"