From 9e14a5dee2b7ec420fcfea49c2f2f41da84e2cbf Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 27 Mar 2015 09:32:53 -0400 Subject: [PATCH 1/2] cmGlobalXCodeGenerator: Simplify ARCHS list with cmJoin --- Source/cmGlobalXCodeGenerator.cxx | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index d340e724f..447f97583 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -21,6 +21,7 @@ #include "cmCustomCommandGenerator.h" #include "cmGeneratorTarget.h" #include "cmGlobalGeneratorFactory.h" +#include "cmAlgorithms.h" #include @@ -3415,16 +3416,7 @@ bool cmGlobalXCodeGenerator this->Architectures); buildSettings->AddAttribute("SDKROOT", this->CreateString(sysroot)); - std::string archString; - const char* sep = ""; - for( std::vector::iterator i = - this->Architectures.begin(); - i != this->Architectures.end(); ++i) - { - archString += sep; - archString += *i; - sep = " "; - } + std::string const& archString = cmJoin(this->Architectures, " "); buildSettings->AddAttribute("ARCHS", this->CreateString(archString.c_str())); } From b76b52c0b4b2f1cd324d6e93d26911e3bc4a8b87 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 27 Mar 2015 10:46:11 -0400 Subject: [PATCH 2/2] Xcode: Set ARCHS only when CMAKE_OSX_ARCHITECTURES is specified (#14736) Teach the Xcode generator that ONLY_ACTIVE_ARCH=YES means to use ARCHS, and that the default of ONLY_ACTIVE_ARCH=NO means to use NATIVE_ARCH and ignore ARCHS. In the latter case there is no reason to generate ARCHS. --- Modules/CompilerId/Xcode-3.pbxproj.in | 1 - Source/cmGlobalXCodeGenerator.cxx | 51 +++++++++++---------------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/Modules/CompilerId/Xcode-3.pbxproj.in b/Modules/CompilerId/Xcode-3.pbxproj.in index 7f686a27b..20f3da312 100644 --- a/Modules/CompilerId/Xcode-3.pbxproj.in +++ b/Modules/CompilerId/Xcode-3.pbxproj.in @@ -79,7 +79,6 @@ 1DEB928A08733DD80010E9CD = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; ONLY_ACTIVE_ARCH = YES; CODE_SIGNING_REQUIRED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 447f97583..f139ad10d 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -3381,44 +3381,33 @@ bool cmGlobalXCodeGenerator this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); const char* osxArch = this->CurrentMakefile->GetDefinition("CMAKE_OSX_ARCHITECTURES"); - if(!osxArch || strlen(osxArch) == 0) - { - if(this->XcodeVersion >= 32) - { - osxArch = "$(ARCHS_STANDARD_32_64_BIT)"; - } - else if(this->XcodeVersion == 31) - { - osxArch = "$(ARCHS_STANDARD_32_BIT)"; - } - else if(this->XcodeVersion <= 30) - { -#ifdef __ppc__ - osxArch = "ppc"; -#endif -#ifdef __i386 - osxArch = "i386"; -#endif - } - buildSettings->AddAttribute("ONLY_ACTIVE_ARCH", - this->CreateString("YES")); - } - const char* sysroot = this->CurrentMakefile->GetDefinition("CMAKE_OSX_SYSROOT"); const char* deploymentTarget = this->CurrentMakefile->GetDefinition("CMAKE_OSX_DEPLOYMENT_TARGET"); - if(osxArch && sysroot) + std::string archs; + if(sysroot) { - // recompute this as it may have been changed since enable language - this->Architectures.clear(); - cmSystemTools::ExpandListArgument(std::string(osxArch), - this->Architectures); + if(osxArch) + { + // recompute this as it may have been changed since enable language + this->Architectures.clear(); + cmSystemTools::ExpandListArgument(std::string(osxArch), + this->Architectures); + archs = cmJoin(this->Architectures, " "); + } buildSettings->AddAttribute("SDKROOT", this->CreateString(sysroot)); - std::string const& archString = cmJoin(this->Architectures, " "); - buildSettings->AddAttribute("ARCHS", - this->CreateString(archString.c_str())); + } + if (archs.empty()) + { + // Tell Xcode to use NATIVE_ARCH instead of ARCHS. + buildSettings->AddAttribute("ONLY_ACTIVE_ARCH", this->CreateString("YES")); + } + else + { + // Tell Xcode to use ARCHS (ONLY_ACTIVE_ARCH defaults to NO). + buildSettings->AddAttribute("ARCHS", this->CreateString(archs.c_str())); } if(deploymentTarget && *deploymentTarget) {