[clang] macCatalyst: add SDKSettings.json as a dependency file if its potentially needed by the compiler (PR #177748)
Ian Anderson via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 24 02:52:35 PST 2026
https://github.com/ian-twilightcoder updated https://github.com/llvm/llvm-project/pull/177748
>From 5fbb086948974d72b6049876152a009cbb0f2260 Mon Sep 17 00:00:00 2001
From: Alex Lorenz <arphaman at gmail.com>
Date: Sat, 24 Jan 2026 00:44:28 -0800
Subject: [PATCH] macCatalyst: add SDKSettings.json as a dependency file if its
potentially needed by the compiler
---
clang/include/clang/Basic/DarwinSDKInfo.h | 12 +++++++++---
clang/lib/Basic/DarwinSDKInfo.cpp | 8 +++++---
clang/lib/Driver/ToolChains/Darwin.cpp | 14 +++++++++++++-
.../darwin-depfile-sdksettings-maccatalyst.m | 4 ++++
clang/unittests/Basic/DarwinSDKInfoTest.cpp | 10 +++++-----
5 files changed, 36 insertions(+), 12 deletions(-)
create mode 100644 clang/test/Driver/darwin-depfile-sdksettings-maccatalyst.m
diff --git a/clang/include/clang/Basic/DarwinSDKInfo.h b/clang/include/clang/Basic/DarwinSDKInfo.h
index 54e4df5988526..ae44b953e1e4c 100644
--- a/clang/include/clang/Basic/DarwinSDKInfo.h
+++ b/clang/include/clang/Basic/DarwinSDKInfo.h
@@ -181,17 +181,21 @@ class DarwinSDKInfo {
using PlatformInfoStorageType = SmallVector<SDKPlatformInfo, 2>;
DarwinSDKInfo(
- VersionTuple Version, VersionTuple MaximumDeploymentTarget,
+ std::string FilePath, VersionTuple Version,
+ VersionTuple MaximumDeploymentTarget,
PlatformInfoStorageType PlatformInfos,
llvm::DenseMap<OSEnvPair::StorageType,
std::optional<RelatedTargetVersionMapping>>
VersionMappings =
llvm::DenseMap<OSEnvPair::StorageType,
std::optional<RelatedTargetVersionMapping>>())
- : Version(Version), MaximumDeploymentTarget(MaximumDeploymentTarget),
+ : FilePath(FilePath), Version(Version),
+ MaximumDeploymentTarget(MaximumDeploymentTarget),
PlatformInfos(std::move(PlatformInfos)),
VersionMappings(std::move(VersionMappings)) {}
+ StringRef getFilePath() const { return FilePath; }
+
const llvm::VersionTuple &getVersion() const { return Version; }
const SDKPlatformInfo &getCanonicalPlatformInfo() const {
@@ -224,9 +228,11 @@ class DarwinSDKInfo {
}
static std::optional<DarwinSDKInfo>
- parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj);
+ parseDarwinSDKSettingsJSON(std::string FilePath,
+ const llvm::json::Object *Obj);
private:
+ std::string FilePath;
VersionTuple Version;
VersionTuple MaximumDeploymentTarget;
PlatformInfoStorageType PlatformInfos;
diff --git a/clang/lib/Basic/DarwinSDKInfo.cpp b/clang/lib/Basic/DarwinSDKInfo.cpp
index b55ffd1c39a86..4fa2febe0f650 100644
--- a/clang/lib/Basic/DarwinSDKInfo.cpp
+++ b/clang/lib/Basic/DarwinSDKInfo.cpp
@@ -176,7 +176,8 @@ static std::optional<VersionTuple> getVersionKey(const llvm::json::Object &Obj,
}
std::optional<DarwinSDKInfo>
-DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) {
+DarwinSDKInfo::parseDarwinSDKSettingsJSON(std::string FilePath,
+ const llvm::json::Object *Obj) {
auto Version = getVersionKey(*Obj, "Version");
if (!Version)
return std::nullopt;
@@ -226,7 +227,7 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) {
}
}
- return DarwinSDKInfo(std::move(*Version),
+ return DarwinSDKInfo(std::move(FilePath), std::move(*Version),
std::move(*MaximumDeploymentVersion),
std::move(PlatformInfos), std::move(VersionMappings));
}
@@ -247,7 +248,8 @@ clang::parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath) {
return Result.takeError();
if (const auto *Obj = Result->getAsObject()) {
- if (auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(Obj))
+ if (auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(
+ Filepath.str().str(), Obj))
return std::move(SDKInfo);
}
return llvm::make_error<llvm::StringError>("invalid SDKSettings.json",
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index fb75739360328..8c6576364c419 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -1917,7 +1917,7 @@ struct DarwinPlatform {
StringRef PlatformPrefix =
(Platform == DarwinPlatformKind::DriverKit) ? "/System/DriverKit" : "";
return DarwinSDKInfo(
- getOSVersion(), /*MaximumDeploymentTarget=*/
+ "", getOSVersion(), /*MaximumDeploymentTarget=*/
VersionTuple(getOSVersion().getMajor(), 0, 99),
{DarwinSDKInfo::SDKPlatformInfo(llvm::Triple::Apple, OS,
llvm::Triple::UnknownEnvironment,
@@ -3289,6 +3289,18 @@ void Darwin::addClangTargetOptions(
addClangCC1ASTargetOptions(DriverArgs, CC1Args);
+ if (SDKInfo) {
+ // Make the SDKSettings.json an explicit dependency for the compiler
+ // invocation, in case the compiler needs to read it to remap macCatalyst
+ // versions.
+ if ((isTargetMacCatalyst() || TargetVariantTriple) &&
+ !SDKInfo->getFilePath().empty()) {
+ SmallString<64> ExtraDepOpt("-fdepfile-entry=");
+ ExtraDepOpt += SDKInfo->getFilePath();
+ CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
+ }
+ }
+
// Enable compatibility mode for NSItemProviderCompletionHandler in
// Foundation/NSItemProvider.h.
CC1Args.push_back("-fcompatibility-qualified-id-block-type-checking");
diff --git a/clang/test/Driver/darwin-depfile-sdksettings-maccatalyst.m b/clang/test/Driver/darwin-depfile-sdksettings-maccatalyst.m
new file mode 100644
index 0000000000000..176aeb58ed294
--- /dev/null
+++ b/clang/test/Driver/darwin-depfile-sdksettings-maccatalyst.m
@@ -0,0 +1,4 @@
+// RUN: %clang -target x86_64-apple-ios13.1-macabi -isysroot %S/Inputs/MacOSX10.15.sdk -c %s -### 2>&1 \
+// RUN: | FileCheck %s
+
+// CHECK: -fdepfile-entry={{.*}}MacOSX10.15.sdk{{/|\\}}SDKSettings.json
diff --git a/clang/unittests/Basic/DarwinSDKInfoTest.cpp b/clang/unittests/Basic/DarwinSDKInfoTest.cpp
index 61b1b93dcb328..e2735a7a3e7d0 100644
--- a/clang/unittests/Basic/DarwinSDKInfoTest.cpp
+++ b/clang/unittests/Basic/DarwinSDKInfoTest.cpp
@@ -103,7 +103,7 @@ TEST(DarwinSDKInfo, PlatformPrefix) {
SupportedTargets["driverkit"] = std::move(DriverKit);
SDKSettings["SupportedTargets"] = std::move(SupportedTargets);
- auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&SDKSettings);
+ auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON("", &SDKSettings);
ASSERT_TRUE(SDKInfo);
EXPECT_EQ(SDKInfo->getPlatformPrefix(Triple("arm64-apple-macos26.0")),
"/System/macOSSupport");
@@ -133,7 +133,7 @@ TEST(DarwinSDKInfoTest, ParseAndTestMappingMacCatalyst) {
MacOS2iOSMac["macOS_iOSMac"] = std::move(VersionMap);
Obj["VersionMap"] = std::move(MacOS2iOSMac);
- auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj);
+ auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON("", &Obj);
ASSERT_TRUE(SDKInfo);
EXPECT_EQ(SDKInfo->getVersion(), VersionTuple(11, 0));
@@ -180,7 +180,7 @@ TEST(DarwinSDKInfoTest, ParseAndTestMappingIOSDerived) {
IOSToTvOS["iOS_tvOS"] = std::move(VersionMap);
Obj["VersionMap"] = std::move(IOSToTvOS);
- auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj);
+ auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON("", &Obj);
ASSERT_TRUE(SDKInfo);
EXPECT_EQ(SDKInfo->getVersion(), VersionTuple(15, 0));
@@ -226,7 +226,7 @@ TEST(DarwinSDKInfoTest, ParseAndTestMappingIOSDerived) {
TEST(DarwinSDKInfoTest, MissingKeys) {
llvm::json::Object Obj;
- ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj));
+ ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON("", &Obj));
Obj["Version"] = "11.0";
- ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj));
+ ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON("", &Obj));
}
More information about the cfe-commits
mailing list