diff options
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator2.cxx | 53 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator2.h | 1 |
2 files changed, 51 insertions, 3 deletions
diff --git a/Source/cmLocalUnixMakefileGenerator2.cxx b/Source/cmLocalUnixMakefileGenerator2.cxx index 996e42e..fea3d75 100644 --- a/Source/cmLocalUnixMakefileGenerator2.cxx +++ b/Source/cmLocalUnixMakefileGenerator2.cxx @@ -1995,10 +1995,10 @@ cmLocalUnixMakefileGenerator2 for(std::vector<std::string>::const_iterator i = objects.begin(); i != objects.end(); ++i) { - // TODO: Make sure we don't escape spaces and quote. + std::string object = this->ConvertToRelativePath(i->c_str()); ruleFileStream << " \\\n" - << "\"" << this->ConvertToRelativeOutputPath(i->c_str()) << "\""; + << this->ConvertToQuotedOutputPath(object.c_str()); } ruleFileStream << "\n"; @@ -2008,14 +2008,16 @@ cmLocalUnixMakefileGenerator2 variableNameExternal = this->CreateMakeVariable(target.GetName(), "_EXTERNAL_OBJECTS"); ruleFileStream + << "\n" << "# External object files for target " << target.GetName() << "\n" << variableNameExternal.c_str() << " ="; for(std::vector<std::string>::const_iterator i = external_objects.begin(); i != external_objects.end(); ++i) { + std::string object = this->ConvertToRelativePath(i->c_str()); ruleFileStream << " \\\n" - << "\"" << this->ConvertToRelativeOutputPath(i->c_str()) << "\""; + << this->ConvertToQuotedOutputPath(object.c_str()); } ruleFileStream << "\n" @@ -2318,6 +2320,51 @@ cmLocalUnixMakefileGenerator2::ConvertToRelativeOutputPath(const char* p) } //---------------------------------------------------------------------------- +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() { // Format the library and executable output paths. diff --git a/Source/cmLocalUnixMakefileGenerator2.h b/Source/cmLocalUnixMakefileGenerator2.h index 90997f1..893dc7f 100644 --- a/Source/cmLocalUnixMakefileGenerator2.h +++ b/Source/cmLocalUnixMakefileGenerator2.h @@ -199,6 +199,7 @@ protected: const char* GetSourceFileLanguage(const cmSourceFile& source); std::string ConvertToFullPath(const std::string& localPath); std::string ConvertToRelativeOutputPath(const char* p); + std::string ConvertToQuotedOutputPath(const char* p); void ConfigureOutputPaths(); void FormatOutputPath(std::string& path, const char* name); |