diff options
author | Gregor Jasny <gjasny@googlemail.com> | 2015-12-27 16:33:46 +0100 |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-01-07 13:23:24 -0500 |
commit | ba39d7e9d04b6a8d3d9bccdf07b69cd2d959a083 (patch) | |
tree | a4619cbf9b622f0dc95145913c605ae94f2f47a7 /Source | |
parent | 90b50b2e28d32bcf239d3f6bc4d1114756a78827 (diff) | |
download | cmake-ba39d7e9d04b6a8d3d9bccdf07b69cd2d959a083.tar.gz |
Xcode: Escape all backslashes in strings (#15328)
Before this change backslashes in strings were escaped during compile
flags adds via AppendFlag(). But global flags like OTHER_CPLUSPLUSFLAGS
are not added as flags but as plain strings so they were not escaped
properly.
Now the escaping is performed within cmXCodeObject::PrintString() which
ensures that strings are always encoded.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 31 | ||||
-rw-r--r-- | Source/cmGlobalXCodeGenerator.h | 1 | ||||
-rw-r--r-- | Source/cmXCodeObject.cxx | 4 |
3 files changed, 11 insertions, 25 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 475efa8b6b..344964825f 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -1686,14 +1686,13 @@ cmGlobalXCodeGenerator::AddCommandsToBuildPhase(cmXCodeObject* buildphase, } std::string cdir = this->CurrentLocalGenerator->GetCurrentBinaryDirectory(); - cdir = this->ConvertToRelativeForXCode(cdir.c_str()); + cdir = this->ConvertToRelativeForMake(cdir.c_str()); std::string makecmd = "make -C "; makecmd += cdir; makecmd += " -f "; makecmd += this->ConvertToRelativeForMake( (makefile+"$CONFIGURATION").c_str()); makecmd += " all"; - cmSystemTools::ReplaceString(makecmd, "\\ ", "\\\\ "); buildphase->AddAttribute("shellScript", this->CreateString(makecmd.c_str())); buildphase->AddAttribute("showEnvVarsInLog", @@ -2108,10 +2107,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, this->CurrentLocalGenerator ->GenerateAppleInfoPList(gtgt, "$(EXECUTABLE_NAME)", plist.c_str()); - std::string path = - this->ConvertToRelativeForXCode(plist.c_str()); buildSettings->AddAttribute("INFOPLIST_FILE", - this->CreateString(path.c_str())); + this->CreateString(plist)); } else if(this->XcodeVersion >= 22) { @@ -2157,10 +2154,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, this->CurrentLocalGenerator ->GenerateFrameworkInfoPList(gtgt, "$(EXECUTABLE_NAME)", plist.c_str()); - std::string path = - this->ConvertToRelativeForXCode(plist.c_str()); buildSettings->AddAttribute("INFOPLIST_FILE", - this->CreateString(path.c_str())); + this->CreateString(plist)); } else { @@ -2200,10 +2195,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, this->CurrentLocalGenerator ->GenerateAppleInfoPList(gtgt, "$(EXECUTABLE_NAME)", plist.c_str()); - std::string path = - this->ConvertToRelativeForXCode(plist.c_str()); buildSettings->AddAttribute("INFOPLIST_FILE", - this->CreateString(path.c_str())); + this->CreateString(plist)); } } @@ -3881,12 +3874,6 @@ std::string cmGlobalXCodeGenerator::ConvertToRelativeForMake(const char* p) } //---------------------------------------------------------------------------- -std::string cmGlobalXCodeGenerator::ConvertToRelativeForXCode(const char* p) -{ - return cmSystemTools::ConvertToOutputPath(p); -} - -//---------------------------------------------------------------------------- std::string cmGlobalXCodeGenerator::RelativeToSource(const char* p) { // We force conversion because Xcode breakpoints do not work unless @@ -4022,8 +4009,8 @@ void cmGlobalXCodeGenerator::AppendFlag(std::string& flags, // We escape a flag as follows: // - Place each flag in single quotes '' - // - Escape a single quote as \\' - // - Escape a backslash as \\\\ since it itself is an escape + // - Escape a single quote as \' + // - Escape a backslash as \\ since it itself is an escape // Note that in the code below we need one more level of escapes for // C string syntax in this source file. // @@ -4043,16 +4030,16 @@ void cmGlobalXCodeGenerator::AppendFlag(std::string& flags, { if (this->XcodeVersion >= 40) { - flags += "'\\\\''"; + flags += "'\\''"; } else { - flags += "\\\\'"; + flags += "\\'"; } } else if(*c == '\\') { - flags += "\\\\\\\\"; + flags += "\\\\"; } else { diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h index c8a39dfa2a..b5fd13ca46 100644 --- a/Source/cmGlobalXCodeGenerator.h +++ b/Source/cmGlobalXCodeGenerator.h @@ -99,7 +99,6 @@ private: std::string XCodeEscapePath(const char* p); std::string RelativeToSource(const char* p); std::string RelativeToBinary(const char* p); - std::string ConvertToRelativeForXCode(const char* p); std::string ConvertToRelativeForMake(const char* p); void CreateCustomCommands(cmXCodeObject* buildPhases, cmXCodeObject* sourceBuildPhase, diff --git a/Source/cmXCodeObject.cxx b/Source/cmXCodeObject.cxx index c59c3609ff..5bc34c136c 100644 --- a/Source/cmXCodeObject.cxx +++ b/Source/cmXCodeObject.cxx @@ -255,9 +255,9 @@ void cmXCodeObject::PrintString(std::ostream& os,std::string String) for(std::string::const_iterator i = String.begin(); i != String.end(); ++i) { - if(*i == '"') + if(*i == '"' || *i == '\\') { - // Escape double-quotes. + // Escape double-quotes and backslashes. os << '\\'; } os << *i; |