summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorGregor Jasny <gjasny@googlemail.com>2015-12-27 16:33:46 +0100
committerBrad King <brad.king@kitware.com>2016-01-07 13:23:24 -0500
commitba39d7e9d04b6a8d3d9bccdf07b69cd2d959a083 (patch)
treea4619cbf9b622f0dc95145913c605ae94f2f47a7 /Source
parent90b50b2e28d32bcf239d3f6bc4d1114756a78827 (diff)
downloadcmake-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.cxx31
-rw-r--r--Source/cmGlobalXCodeGenerator.h1
-rw-r--r--Source/cmXCodeObject.cxx4
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;