diff options
author | Brad King <brad.king@kitware.com> | 2024-02-09 00:50:41 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-02-09 16:32:13 (GMT) |
commit | 40be88a92e65eb237a3b455255514f9a98274467 (patch) | |
tree | 7c6479f199a4e5107089c6fb8041693cf994eb1f /Source | |
parent | 3ece4553c271fdb0d6d9a9846a135c4b78a03d5a (diff) | |
download | CMake-40be88a92e65eb237a3b455255514f9a98274467.zip CMake-40be88a92e65eb237a3b455255514f9a98274467.tar.gz CMake-40be88a92e65eb237a3b455255514f9a98274467.tar.bz2 |
visionOS: Update deployment-target flag for Xcode 15.1 beta
Use the same flags Xcode adds for `XROS_DEPLOYMENT_TARGET`. They are
`-target arm64-apple-xros1.0` and `-target arm64-apple-xros1.0-simulator`,
where `1.0` is the deployment target version.
Fixes: #25188
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmLocalGenerator.cxx | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 04d2f50..86c55f5 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1983,10 +1983,43 @@ void cmLocalGenerator::AddArchitectureFlags(std::string& flags, "CMAKE_" + lang + "_OSX_DEPLOYMENT_TARGET_FLAG"; cmValue deploymentTargetFlag = this->Makefile->GetDefinition(deploymentTargetFlagVar); - if (cmNonempty(deploymentTargetFlag)) { + if (cmNonempty(deploymentTargetFlag) && + // CMAKE_<LANG>_COMPILER_TARGET overrides a --target= for + // CMAKE_OSX_DEPLOYMENT_TARGET, e.g., for visionOS. + (!cmHasLiteralPrefix(*deploymentTarget, "--target=") || + this->Makefile + ->GetDefinition(cmStrCat("CMAKE_", lang, "_COMPILER_TARGET")) + .IsEmpty())) { + std::string flag = *deploymentTargetFlag; + + // Add the deployment target architecture to the flag, if needed. + static const std::string kARCH = "<ARCH>"; + std::string::size_type archPos = flag.find(kARCH); + if (archPos != std::string::npos) { + // This placeholder is meant for visionOS, so default to arm64 + // unless only non-arm64 archs are given. + std::string const arch = + (archs.empty() || cm::contains(archs, "arm64")) ? "arm64" + : archs[0]; + // Replace the placeholder with its value. + flag = cmStrCat(flag.substr(0, archPos), arch, + flag.substr(archPos + kARCH.size())); + } + + // Add the deployment target version to the flag. + static const std::string kVERSION_MIN = "<VERSION_MIN>"; + std::string::size_type verPos = flag.find(kVERSION_MIN); + if (verPos != std::string::npos) { + // Replace the placeholder with its value. + flag = cmStrCat(flag.substr(0, verPos), *deploymentTarget, + flag.substr(verPos + kVERSION_MIN.size())); + } else { + // There is no placeholder, so append the value. + flag = cmStrCat(flag, *deploymentTarget); + } + flags += " "; - flags += *deploymentTargetFlag; - flags += *deploymentTarget; + flags += flag; } } } |