瀏覽代碼

ENH: Added ConvertToQuotedOutputPath method and used it to properly generate external object references with spaces in the path.

Brad King 20 年之前
父節點
當前提交
03e2878db8
共有 2 個文件被更改,包括 51 次插入3 次删除
  1. 50 3
      Source/cmLocalUnixMakefileGenerator2.cxx
  2. 1 0
      Source/cmLocalUnixMakefileGenerator2.h

+ 50 - 3
Source/cmLocalUnixMakefileGenerator2.cxx

@@ -1995,10 +1995,10 @@ cmLocalUnixMakefileGenerator2
   for(std::vector<std::string>::const_iterator i = objects.begin();
   for(std::vector<std::string>::const_iterator i = objects.begin();
       i != objects.end(); ++i)
       i != objects.end(); ++i)
     {
     {
-    // TODO: Make sure we don't escape spaces and quote.
+    std::string object = this->ConvertToRelativePath(i->c_str());
     ruleFileStream
     ruleFileStream
       << " \\\n"
       << " \\\n"
-      << "\"" << this->ConvertToRelativeOutputPath(i->c_str()) << "\"";
+      << this->ConvertToQuotedOutputPath(object.c_str());
     }
     }
   ruleFileStream
   ruleFileStream
     << "\n";
     << "\n";
@@ -2008,14 +2008,16 @@ cmLocalUnixMakefileGenerator2
   variableNameExternal = this->CreateMakeVariable(target.GetName(),
   variableNameExternal = this->CreateMakeVariable(target.GetName(),
                                                   "_EXTERNAL_OBJECTS");
                                                   "_EXTERNAL_OBJECTS");
   ruleFileStream
   ruleFileStream
+    << "\n"
     << "# External object files for target " << target.GetName() << "\n"
     << "# External object files for target " << target.GetName() << "\n"
     << variableNameExternal.c_str() << " =";
     << variableNameExternal.c_str() << " =";
   for(std::vector<std::string>::const_iterator i = external_objects.begin();
   for(std::vector<std::string>::const_iterator i = external_objects.begin();
       i != external_objects.end(); ++i)
       i != external_objects.end(); ++i)
     {
     {
+    std::string object = this->ConvertToRelativePath(i->c_str());
     ruleFileStream
     ruleFileStream
       << " \\\n"
       << " \\\n"
-      << "\"" << this->ConvertToRelativeOutputPath(i->c_str()) << "\"";
+      << this->ConvertToQuotedOutputPath(object.c_str());
     }
     }
   ruleFileStream
   ruleFileStream
     << "\n"
     << "\n"
@@ -2317,6 +2319,51 @@ cmLocalUnixMakefileGenerator2::ConvertToRelativeOutputPath(const char* p)
   return cmSystemTools::ConvertToOutputPath(relative.c_str());
   return cmSystemTools::ConvertToOutputPath(relative.c_str());
 }
 }
 
 
+//----------------------------------------------------------------------------
+std::string
+cmLocalUnixMakefileGenerator2::ConvertToQuotedOutputPath(const char* p)
+{
+  // Split the path into its components.
+  std::vector<std::string> components;
+  cmSystemTools::SplitPath(p, components);
+
+  // Return an empty path if there are no components.
+  if(components.empty())
+    {
+    return "\"\"";
+    }
+
+  // Begin the quoted result with the root component.
+  std::string result = "\"";
+  result += components[0];
+
+  // Now add the rest of the components separated by the proper slash
+  // direction for this platform.
+  bool first = true;
+  for(unsigned int i=1; i < components.size(); ++i)
+    {
+    // Only the last component can be empty to avoid double slashes.
+    if(components[i].length() > 0 || (i == (components.size()-1)))
+      {
+      if(!first)
+        {
+#if defined(_WIN32) && !defined(__CYGWIN__)
+        result += "\\";
+#else
+        result += "/";
+#endif
+        }
+      result += components[i];
+      first = false;
+      }
+    }
+
+  // Close the quoted result.
+  result += "\"";
+
+  return result;
+}
+
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 void cmLocalUnixMakefileGenerator2::ConfigureOutputPaths()
 void cmLocalUnixMakefileGenerator2::ConfigureOutputPaths()
 {
 {

+ 1 - 0
Source/cmLocalUnixMakefileGenerator2.h

@@ -199,6 +199,7 @@ protected:
   const char* GetSourceFileLanguage(const cmSourceFile& source);
   const char* GetSourceFileLanguage(const cmSourceFile& source);
   std::string ConvertToFullPath(const std::string& localPath);
   std::string ConvertToFullPath(const std::string& localPath);
   std::string ConvertToRelativeOutputPath(const char* p);
   std::string ConvertToRelativeOutputPath(const char* p);
+  std::string ConvertToQuotedOutputPath(const char* p);
   void ConfigureOutputPaths();
   void ConfigureOutputPaths();
   void FormatOutputPath(std::string& path, const char* name);
   void FormatOutputPath(std::string& path, const char* name);