浏览代码

ENH: add path conversion stuff and rm SYSTEM_PATH

Bill Hoffman 19 年之前
父节点
当前提交
24f08322be
共有 2 个文件被更改,包括 46 次插入12 次删除
  1. 34 7
      Source/cmFileCommand.cxx
  2. 12 5
      Source/cmFileCommand.h

+ 34 - 7
Source/cmFileCommand.cxx

@@ -70,9 +70,13 @@ bool cmFileCommand::InitialPass(std::vector<std::string> const& args)
     {
     return this->HandleRelativePathCommand(args);
     }
-  else if ( subCommand == "SYSTEM_PATH" )
+  else if ( subCommand == "TO_CMAKE_PATH" )
     {
-    return this->HandleSystemPathCommand(args);
+    return this->HandleCMakePathCommand(args, false);
+    }
+  else if ( subCommand == "TO_NATIVE_PATH" )
+    {
+    return this->HandleCMakePathCommand(args, true);
     }
 
   std::string e = "does not recognize sub-command "+subCommand;
@@ -971,8 +975,9 @@ bool cmFileCommand::HandleRemove(std::vector<std::string> const& args,
 }
 
 //----------------------------------------------------------------------------
-bool cmFileCommand::HandleSystemPathCommand(std::vector<std::string>
-                                            const& args)
+bool cmFileCommand::HandleCMakePathCommand(std::vector<std::string>
+                                           const& args, 
+                                           bool nativePath)
 {
   std::vector<std::string>::const_iterator i = args.begin();
   if(args.size() != 3)
@@ -982,17 +987,39 @@ bool cmFileCommand::HandleSystemPathCommand(std::vector<std::string>
     return false;
     }
   i++; // Get rid of subcommand
-  std::vector<std::string> path;
-  cmSystemTools::GetPath(path, i->c_str());
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  char pathSep = ';';
+#else
+  char pathSep = ':';
+#endif
+  std::vector<cmsys::String> path = cmSystemTools::SplitString(i->c_str(), 
+                                                             pathSep);
   i++;
   const char* var =  i->c_str();
   std::string value;
-  for(std::vector<std::string>::iterator j = path.begin();
+  for(std::vector<cmsys::String>::iterator j = path.begin();
       j != path.end(); ++j)
     {
+    if(!nativePath)
+      {
+      cmSystemTools::ConvertToUnixSlashes(*j);
+      }
+    else
+      {
+      *j = cmSystemTools::ConvertToOutputPath(j->c_str());
+      // remove double quotes in the path
+      cmsys::String& s = *j;
+      
+      if(s.size() > 1 && s[0] == '\"' && s[s.size()-1] == '\"')
+        {
+        s = s.substr(1,s.size()-2);
+        }
+      }
     value += *j;
     value += ";";
     }
   this->Makefile->AddDefinition(var, value.c_str());
   return true;
 }
+
+

+ 12 - 5
Source/cmFileCommand.h

@@ -73,7 +73,8 @@ public:
       "  FILE(REMOVE_RECURSE [directory]...)\n"
       "  FILE(MAKE_DIRECTORY [directory]...)\n"
       "  FILE(RELATIVE_PATH variable directory file)\n"
-      "  FILE(SYSTEM_PATH ENVIRONMENT_VARIABLE result)\n"
+      "  FILE(TO_CMAKE_PATH path result)\n"
+      "  FILE(TO_NATIVE_PATH path result)\n"
       "WRITE will write a message into a file called 'filename'. It "
       "overwrites the file if it already exists, and creates the file "
       "if it does not exist.\n"
@@ -101,9 +102,14 @@ public:
       "   /dir/*.py  - match all python files in /dir and subdirectories\n"
       "MAKE_DIRECTORY will create a directory at the specified location\n"
       "RELATIVE_PATH will determine relative path from directory to the given"
-      " file."
-      " SYSTEM_PATH will look up the environment variable named and "
-      "convert its contents into a cmake list of unix style paths. ";
+      " file.\n"
+      "TO_CMAKE_PATH will convert path into a cmake sytle path with unix /. "
+      " The input can be a single path or a system path like \"$ENV{PATH}\". "
+      " Note the double quotes around the ENV call TO_CMAKE_PATH only takes "
+      " one argument.\n"
+      "TO_NATIVE_PATH works just like TO_CMAKE_PATH, but will convert from "
+      " a cmake style path into the native path style \\ for windows and / "
+      "for UNIX.";
     }
   
   cmTypeMacro(cmFileCommand, cmCommand);
@@ -116,7 +122,8 @@ protected:
   bool HandleMakeDirectoryCommand(std::vector<std::string> const& args);
   bool HandleInstallCommand(std::vector<std::string> const& args);
   bool HandleRelativePathCommand(std::vector<std::string> const& args);
-  bool HandleSystemPathCommand(std::vector<std::string> const& args);
+  bool HandleCMakePathCommand(std::vector<std::string> const& args,
+                              bool nativePath);
 };