[clang] [llvm] [Clang][Darwin] Introduce `SubFrameworks` as a SDK default location (PR #115048)
Cyndy Ishida via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 8 13:11:30 PST 2024
https://github.com/cyndyishida updated https://github.com/llvm/llvm-project/pull/115048
>From 9359df8624a75b7c0c361fdfcd9fc9102824dc68 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Tue, 5 Nov 2024 10:48:09 -0800
Subject: [PATCH 1/3] [Clang][Darwin] Introduce `SubFrameworks` as a SDK
default location
* Have clang always append & pass `System/Library/SubFrameworks` when
determining default sdk search paths.
* Teach `clang-installapi` to traverse there for framework input.
* Teach `llvm-readtapi` that the library files (TBD or binary) in there should be considered
private.
resolves: <rdar://137457006>
---
clang/lib/InstallAPI/DirectoryScanner.cpp | 3 ++-
clang/lib/Lex/InitHeaderSearch.cpp | 1 +
clang/test/Driver/darwin-subframeworks.c | 15 +++++++++++++++
llvm/lib/TextAPI/Utils.cpp | 3 +++
llvm/test/tools/llvm-readtapi/stubify-delete.test | 7 +++++--
5 files changed, 26 insertions(+), 3 deletions(-)
create mode 100644 clang/test/Driver/darwin-subframeworks.c
diff --git a/clang/lib/InstallAPI/DirectoryScanner.cpp b/clang/lib/InstallAPI/DirectoryScanner.cpp
index 03a8208c7364e9..be43a96f3d97d1 100644
--- a/clang/lib/InstallAPI/DirectoryScanner.cpp
+++ b/clang/lib/InstallAPI/DirectoryScanner.cpp
@@ -277,7 +277,8 @@ llvm::Error DirectoryScanner::scanForFrameworks(StringRef Directory) {
// Expect a certain directory structure and naming convention to find
// frameworks.
static const char *SubDirectories[] = {"System/Library/Frameworks/",
- "System/Library/PrivateFrameworks/"};
+ "System/Library/PrivateFrameworks/",
+ "System/Library/SubFrameworks"};
// Check if the directory is already a framework.
if (isFramework(Directory)) {
diff --git a/clang/lib/Lex/InitHeaderSearch.cpp b/clang/lib/Lex/InitHeaderSearch.cpp
index 86c2ecdf9e36eb..c1769c84887b5f 100644
--- a/clang/lib/Lex/InitHeaderSearch.cpp
+++ b/clang/lib/Lex/InitHeaderSearch.cpp
@@ -347,6 +347,7 @@ void InitHeaderSearch::AddDefaultIncludePaths(
} else {
AddPath("/System/Library/Frameworks", System, true);
AddPath("/Library/Frameworks", System, true);
+ AddPath("/System/Library/SubFrameworks", System, true);
}
}
return;
diff --git a/clang/test/Driver/darwin-subframeworks.c b/clang/test/Driver/darwin-subframeworks.c
new file mode 100644
index 00000000000000..62d3ab50f44741
--- /dev/null
+++ b/clang/test/Driver/darwin-subframeworks.c
@@ -0,0 +1,15 @@
+// Add default directories before running clang to check default
+// search paths.
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: cp -R %S/Inputs/MacOSX15.1.sdk %t/
+// RUN: mkdir -p %t/MacOSX15.1.sdk/System/Library/Frameworks
+// RUN: mkdir -p %t/MacOSX15.1.sdk/System/Library/SubFrameworks
+// RUN: mkdir -p %t/MacOSX15.1.sdk/usr/include
+
+// RUN: %clang %s -target arm64-apple-darwin13.0 -isysroot %t/MacOSX15.1.sdk -E -v 2>&1 | FileCheck %s
+
+// CHECK: -isysroot [[PATH:[^ ]*/MacOSX15.1.sdk]]
+// CHECK: #include <...> search starts here:
+// CHECK: [[PATH]]/usr/include
+// CHECK: [[PATH]]/System/Library/Frameworks (framework directory)
+// CHECK: [[PATH]]/System/Library/SubFrameworks (framework directory)
diff --git a/llvm/lib/TextAPI/Utils.cpp b/llvm/lib/TextAPI/Utils.cpp
index 8a06d53942a947..68d73eac86691d 100644
--- a/llvm/lib/TextAPI/Utils.cpp
+++ b/llvm/lib/TextAPI/Utils.cpp
@@ -120,6 +120,9 @@ bool llvm::MachO::isPrivateLibrary(StringRef Path, bool IsSymLink) {
if (Path.starts_with("/System/Library/PrivateFrameworks"))
return true;
+ if (Path.starts_with("/System/Library/SubFrameworks"))
+ return true;
+
// Everything in /usr/lib/swift (including sub-directories) are considered
// public.
if (Path.consume_front("/usr/lib/swift/"))
diff --git a/llvm/test/tools/llvm-readtapi/stubify-delete.test b/llvm/test/tools/llvm-readtapi/stubify-delete.test
index 666d740560cbfe..d91b0df06d3d8f 100644
--- a/llvm/test/tools/llvm-readtapi/stubify-delete.test
+++ b/llvm/test/tools/llvm-readtapi/stubify-delete.test
@@ -2,17 +2,20 @@
# Setup a mix of public and private libraries that resemble apple sdk.
; RUN: mkdir -p %t/sysroot/usr/local/lib/ %t/sysroot/usr/lib/
; RUN: mkdir -p %t/sysroot/System/Library/Frameworks/System.framework %t/sysroot/System/Library/PrivateFrameworks/Fat.framework
+; RUN: mkdir -p %t/sysroot/System/Library/SubFrameworks/Fat.framework/Headers
; RUN: yaml2obj %S/Inputs/libSystem.1.yaml -o %t/sysroot/System/Library/Frameworks/System.framework/System
; RUN: yaml2obj %S/Inputs/objc.yaml -o %t/sysroot/usr/lib/libobjc.dylib
; RUN: cp %t/sysroot/usr/lib/libobjc.dylib %t/sysroot/usr/local/lib/libobjc-unstable.dylib
; RUN: yaml2obj %S/Inputs/universal.yaml -o %t/sysroot/System/Library/PrivateFrameworks/Fat.framework/Fat
+; RUN: cp %t/sysroot/System/Library/PrivateFrameworks/Fat.framework/Fat %t/sysroot/System/Library/SubFrameworks/Fat.framework/Fat
+; RUN: touch %t/sysroot/System/Library/SubFrameworks/Fat.framework/Headers/Fat.h
; RUN: llvm-readtapi -stubify %t/sysroot --delete-input --delete-private-libraries 2>&1 | FileCheck %s --allow-empty --implicit-check-not warning: --implicit-check-not error:
# Validate expected files are removed.
; RUN: not test -f %t/sysroot/System/Library/PrivateFrameworks
; RUN: not test -f %t/sysroot/usr/local
; RUN: not test -f %t/sysroot/usr/lib/libobjc.dylib
; RUN: not test -f %t/sysroot/System/Library/Frameworks/System.framework/System
+; RUN: not test -f %t/sysroot/System/Library/SubFrameworks/Fat.framework/Fat
; RUN: test -f %t/sysroot/System/Library/Frameworks/System.framework/System.tbd
; RUN: test -f %t/sysroot/usr/lib/libobjc.tbd
-
-
+; RUN: test -f %t/sysroot/System/Library/SubFrameworks/Fat.framework/Headers/Fat.h
>From 4207ffe204e2391444d17e1944934ba2a415fc88 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Tue, 5 Nov 2024 12:56:42 -0800
Subject: [PATCH 2/3] [llvm-readtapi] Make directory traversal more reslient to
different path styles
---
llvm/tools/llvm-readtapi/llvm-readtapi.cpp | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/llvm/tools/llvm-readtapi/llvm-readtapi.cpp b/llvm/tools/llvm-readtapi/llvm-readtapi.cpp
index 7390d0ec4b79a3..04282d3e4877c1 100644
--- a/llvm/tools/llvm-readtapi/llvm-readtapi.cpp
+++ b/llvm/tools/llvm-readtapi/llvm-readtapi.cpp
@@ -255,16 +255,21 @@ static void stubifyDirectory(const StringRef InputPath, Context &Ctx) {
if (EC)
reportError(IT->path() + ": " + EC.message());
- // Skip header directories (include/Headers/PrivateHeaders) and module
- // files.
+ // Skip header directories (include/Headers/PrivateHeaders).
StringRef Path = IT->path();
- if (Path.ends_with("/include") || Path.ends_with("/Headers") ||
- Path.ends_with("/PrivateHeaders") || Path.ends_with("/Modules") ||
- Path.ends_with(".map") || Path.ends_with(".modulemap")) {
- IT.no_push();
- continue;
+ if (sys::fs::is_directory(Path)) {
+ const StringRef Stem = sys::path::stem(Path);
+ if ((Stem == "include") || (Stem == "Headers") ||
+ (Stem == "PrivateHeaders") || (Stem == "Modules")) {
+ IT.no_push();
+ continue;
+ }
}
+ // Skip module files too.
+ if (Path.ends_with(".map") || Path.ends_with(".modulemap"))
+ continue;
+
// Check if the entry is a symlink. We don't follow symlinks but we record
// their content.
bool IsSymLink;
>From 3f45b4235d2a4244192e0e166b19686329c17fa5 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Fri, 8 Nov 2024 11:29:30 -0800
Subject: [PATCH 3/3] Swap order of search paths.
---
clang/lib/Lex/InitHeaderSearch.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Lex/InitHeaderSearch.cpp b/clang/lib/Lex/InitHeaderSearch.cpp
index c1769c84887b5f..cb3941fa948211 100644
--- a/clang/lib/Lex/InitHeaderSearch.cpp
+++ b/clang/lib/Lex/InitHeaderSearch.cpp
@@ -346,8 +346,8 @@ void InitHeaderSearch::AddDefaultIncludePaths(
AddPath("/System/DriverKit/System/Library/Frameworks", System, true);
} else {
AddPath("/System/Library/Frameworks", System, true);
- AddPath("/Library/Frameworks", System, true);
AddPath("/System/Library/SubFrameworks", System, true);
+ AddPath("/Library/Frameworks", System, true);
}
}
return;
More information about the cfe-commits
mailing list