macOS: Suppress default '-arch arm64' with CMAKE_<LANG>_COMPILER_TARGET

Since commit b6c60f14b6 (macOS: Default to arm64 architecture on Apple
Silicon hosts, 2020-09-28, v3.19.0-rc1~63^2) we add `-arch arm64` by
default on Apple Silicon hosts if `CMAKE_OSX_ARCHITECTURES` is not set.
This is necessary to prevent the toolchain from selecting its own
default architecture based on that of the build tool (e.g., `x86_64`).

If `CMAKE_<LANG>_COMPILER_TARGET` is set, its `-target` flag tells the
compiler what architecture to use, so do not add `-arch arm64`.

Fixes: #24599
This commit is contained in:
Brad King 2023-03-15 10:20:27 -04:00
parent 43e973eba2
commit 98e319a88f
6 changed files with 33 additions and 3 deletions

View File

@ -3451,7 +3451,6 @@ std::string cmGeneratorTarget::GetCompilePDBDirectory(
std::vector<std::string> cmGeneratorTarget::GetAppleArchs(
std::string const& config, cm::optional<std::string> lang) const
{
static_cast<void>(lang);
std::vector<std::string> archVec;
if (!this->IsApple()) {
return archVec;
@ -3468,7 +3467,12 @@ std::vector<std::string> cmGeneratorTarget::GetAppleArchs(
if (archs) {
cmExpandList(*archs, archVec);
}
if (archVec.empty()) {
if (archVec.empty() &&
// Fall back to a default architecture if no compiler target is set.
(!lang ||
this->Makefile
->GetDefinition(cmStrCat("CMAKE_", *lang, "_COMPILER_TARGET"))
.IsEmpty())) {
this->Makefile->GetDefExpandList("_CMAKE_APPLE_ARCHS_DEFAULT", archVec);
}
return archVec;

View File

@ -10,11 +10,17 @@ function(run_arch case)
run_cmake(${case})
unset(RunCMake_TEST_OPTIONS)
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_command(${case}-build ${CMAKE_COMMAND} --build . --config Debug)
set(RunCMake_TEST_OUTPUT_MERGE 1)
run_cmake_command(${case}-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
endfunction()
run_arch(default)
if(RunCMake_GENERATOR MATCHES "Makefiles|Ninja")
run_arch(default-target-arm64 -DCMAKE_C_COMPILER_TARGET=arm64-apple-macosx)
run_arch(default-target-x86_64 -DCMAKE_C_COMPILER_TARGET=x86_64-apple-macosx)
endif()
run_arch(arm64-var -DCMAKE_APPLE_SILICON_PROCESSOR=arm64)
run_arch(x86_64-var -DCMAKE_APPLE_SILICON_PROCESSOR=x86_64)

View File

@ -0,0 +1,5 @@
if(NOT actual_stdout MATCHES "[ -]-target=arm64-apple-macosx ")
set(RunCMake_TEST_FAILED "No -target=arm64-apple-macosx flag found!")
elseif(actual_stdout MATCHES " (-arch +[^ ]*)")
set(RunCMake_TEST_FAILED "'${CMAKE_MATCH_1}' flag incorrectly found!")
endif()

View File

@ -0,0 +1,5 @@
enable_language(C)
if(NOT CMAKE_OSX_ARCHITECTURES STREQUAL "")
message(FATAL_ERROR "CMAKE_OSX_ARCHITECTURES is '${CMAKE_OSX_ARCHITECTURES}', not empty ''")
endif()
add_library(arm64 arm64.c)

View File

@ -0,0 +1,5 @@
if(NOT actual_stdout MATCHES "[ -]-target=x86_64-apple-macosx ")
set(RunCMake_TEST_FAILED "No -target=x86_64-apple-macosx flag found!")
elseif(actual_stdout MATCHES " (-arch +[^ ]*)")
set(RunCMake_TEST_FAILED "'${CMAKE_MATCH_1}' flag incorrectly found!")
endif()

View File

@ -0,0 +1,5 @@
enable_language(C)
if(NOT CMAKE_OSX_ARCHITECTURES STREQUAL "")
message(FATAL_ERROR "CMAKE_OSX_ARCHITECTURES is '${CMAKE_OSX_ARCHITECTURES}', not empty ''")
endif()
add_library(x86_64 x86_64.c)