An update will be applied December 9th, between 12PM and 1:00PM EST (UTC -5:00). The site may be slow during that time.

Commit 26673bf4 authored by Brad King's avatar Brad King
Browse files

Xcode: Explicitly specify default native architecture on macOS

When `CMAKE_OSX_ARCHITECTURES` is not specified, we add the Xcode
setting `ONLY_ACTIVE_ARCH = YES` with the intention of targeting the
native architecture of the host.  However, the default `ARCHS` value
chosen by "Xcode 12 Universal Apps" includes multiple architectures.
Add an explicit `ARCHS` setting with value `$(NATIVE_ARCH_ACTUAL)`
to tell Xcode to use the host's native architecture only.

Fixes: #20893
parent ce624cfb
Pipeline #181698 waiting for manual action with stages
in 7 minutes and 16 seconds
...@@ -318,3 +318,17 @@ Other Changes ...@@ -318,3 +318,17 @@ Other Changes
* The :manual:`cmake-file-api(7)` "codemodel" version 2 "target" object gained * The :manual:`cmake-file-api(7)` "codemodel" version 2 "target" object gained
a new ``precompileHeaders`` field in the ``compileGroups`` objects. a new ``precompileHeaders`` field in the ``compileGroups`` objects.
Updates
=======
Changes made since CMake 3.18.0 include the following.
3.18.1
------
* The :generator:`Xcode` generator, when :variable:`CMAKE_OSX_ARCHITECTURES`
is not defined, now selects ``$(NATIVE_ARCH_ACTUAL)`` as the default
architecture (the Xcode ``ARCHS`` setting). This is needed for Xcode 12
to select the host's architecture, which older versions of Xcode did
by default.
...@@ -469,6 +469,12 @@ Id flags: ${testflags} ${CMAKE_${lang}_COMPILER_ID_FLAGS_ALWAYS} ...@@ -469,6 +469,12 @@ Id flags: ${testflags} ${CMAKE_${lang}_COMPILER_ID_FLAGS_ALWAYS}
set(id_clang_cxx_library "CLANG_CXX_LIBRARY = \"${CMAKE_MATCH_3}\";") set(id_clang_cxx_library "CLANG_CXX_LIBRARY = \"${CMAKE_MATCH_3}\";")
endif() endif()
endif() endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_OSX_SYSROOT MATCHES "^$|[Mm][Aa][Cc][Oo][Ss]")
# When targeting macOS, use only the host architecture.
set(id_archs [[ARCHS = "$(NATIVE_ARCH_ACTUAL)";]])
else()
set(id_archs "")
endif()
configure_file(${CMAKE_ROOT}/Modules/CompilerId/Xcode-3.pbxproj.in configure_file(${CMAKE_ROOT}/Modules/CompilerId/Xcode-3.pbxproj.in
${id_dir}/CompilerId${lang}.xcodeproj/project.pbxproj @ONLY) ${id_dir}/CompilerId${lang}.xcodeproj/project.pbxproj @ONLY)
unset(_ENV_MACOSX_DEPLOYMENT_TARGET) unset(_ENV_MACOSX_DEPLOYMENT_TARGET)
......
...@@ -84,6 +84,7 @@ ...@@ -84,6 +84,7 @@
CODE_SIGNING_REQUIRED = NO; CODE_SIGNING_REQUIRED = NO;
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)";
SYMROOT = .; SYMROOT = .;
@id_archs@
@id_toolset@ @id_toolset@
@id_lang_version@ @id_lang_version@
@id_clang_cxx_library@ @id_clang_cxx_library@
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <cm/memory> #include <cm/memory>
#include <cmext/algorithm> #include <cmext/algorithm>
#include <cmext/string_view>
#include "cmsys/RegularExpression.hxx" #include "cmsys/RegularExpression.hxx"
...@@ -3118,6 +3119,14 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects( ...@@ -3118,6 +3119,14 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects(
if (archs.empty()) { if (archs.empty()) {
// Tell Xcode to use NATIVE_ARCH instead of ARCHS. // Tell Xcode to use NATIVE_ARCH instead of ARCHS.
buildSettings->AddAttribute("ONLY_ACTIVE_ARCH", this->CreateString("YES")); buildSettings->AddAttribute("ONLY_ACTIVE_ARCH", this->CreateString("YES"));
// When targeting macOS, use only the host architecture.
if (this->SystemName == "Darwin"_s &&
(!sysroot || !*sysroot ||
cmSystemTools::LowerCase(sysroot).find("macos") !=
std::string::npos)) {
buildSettings->AddAttribute("ARCHS",
this->CreateString("$(NATIVE_ARCH_ACTUAL)"));
}
} else { } else {
// Tell Xcode to use ARCHS (ONLY_ACTIVE_ARCH defaults to NO). // Tell Xcode to use ARCHS (ONLY_ACTIVE_ARCH defaults to NO).
buildSettings->AddAttribute("ARCHS", this->CreateString(archs)); buildSettings->AddAttribute("ARCHS", this->CreateString(archs));
...@@ -3217,7 +3226,8 @@ void cmGlobalXCodeGenerator::ComputeArchitectures(cmMakefile* mf) ...@@ -3217,7 +3226,8 @@ void cmGlobalXCodeGenerator::ComputeArchitectures(cmMakefile* mf)
} }
if (this->Architectures.empty()) { if (this->Architectures.empty()) {
// With no ARCHS we use ONLY_ACTIVE_ARCH. // With no ARCHS we use ONLY_ACTIVE_ARCH and possibly a
// platform-specific default ARCHS placeholder value.
// Look up the arch that Xcode chooses in this case. // Look up the arch that Xcode chooses in this case.
if (const char* arch = mf->GetDefinition("CMAKE_XCODE_ARCHS")) { if (const char* arch = mf->GetDefinition("CMAKE_XCODE_ARCHS")) {
this->ObjectDirArchDefault = arch; this->ObjectDirArchDefault = arch;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment