llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang

@llvm/pr-subscribers-clang-driver

Author: Noah (Noerr)

<details>
<summary>Changes</summary>

On macOS, from-source LLVM/Clang builds fail to compile even trivial programs 
because `DEFAULT_SYSROOT` is empty and Clang cannot find SDK headers or 
libraries:

```
$ clang main.c
ld: library 'System' not found
```

This patch auto-detects the macOS SDK using `xcrun --show-sdk-path` at **cmake 
configure time**, baking the result into `DEFAULT_SYSROOT`. This makes `clang 
hello.c` work out-of-the-box on macOS, matching other platforms.

### Why cmake-time detection instead of runtime detection?

Runtime `xcrun` detection was previously attempted in ecade80d9396 
([D136315](https://reviews.llvm.org/D136315)) but reverted the next day in 
a5f446bc4bb1 because it:
- Broke tests on macOS
- Attempted to run `xcrun` even when cross-compiling to macOS from non-Mac hosts
- Added process-spawning overhead to every clang invocation

The cmake-time approach avoids all of these issues:

| Problem with runtime detection | Cmake-time solution |
|-------------------------------|---------------------|
| Process-spawning overhead every compilation | `xcrun` runs once during LLVM 
build |
| Ran `xcrun` when cross-compiling to macOS from non-Mac hosts | `if(APPLE)` 
only true when building ON macOS |
| Test failures | Semantically equivalent to `-DDEFAULT_SYSROOT=...` which is 
already tested |
| Cross-compilation confusion | `NOT CMAKE_CROSSCOMPILING` skips detection for 
cross-compilers |

### Override behavior preserved

The priority chain in `Darwin.cpp` remains:
1. `--sysroot=` / `-isysroot` CLI flags (highest priority)
2. `SDKROOT` environment variable
3. `DEFAULT_SYSROOT` (this change — lowest priority fallback)

Users can always override the baked-in default.

### Impact beyond command-line builds

This also fixes JIT/runtime compilation scenarios where applications use LLVM 
as a library:
- POCL OpenCL JIT ([pocl/pocl#<!-- 
-->2041](https://github.com/pocl/pocl/issues/2041))
- chipStar HIP runtime compilation
- libtooling projects ([confirmed by @<!-- 
-->planetmarshall](https://github.com/llvm/llvm-project/issues/137352#issuecomment-2713921988))

CMake 4.0 removed its own `CMAKE_OSX_SYSROOT` workaround, stating "compilers 
are expected to choose a default macOS SDK on their own" ([cmake#<!-- 
-->26863](https://gitlab.kitware.com/cmake/cmake/-/issues/26863)). CMake 4.0.2 
re-added a fallback ([MR 
10734](https://gitlab.kitware.com/cmake/cmake/-/merge_requests/10734)), but 
noted this should also be resolved on the LLVM/Clang side.

### Changes

- `clang/CMakeLists.txt` — auto-detect SDK when `DEFAULT_SYSROOT` is empty
- `clang/docs/UsersManual.rst` — document Apple SDK discovery and override 
precedence
- `clang/test/Driver/darwin-default-sysroot.c` — lit test verifying clang finds 
the SDK without `SDKROOT`

### Testing

The lit test is a best-effort end-to-end check: it unsets `SDKROOT` and 
verifies that clang emits `-isysroot` pointing to a macOS SDK. This validates 
the observable result but not the cmake detection logic itself — a proper test 
for that would be a cmake-level test (e.g. `cmake --build` with an empty 
`DEFAULT_SYSROOT` and checking the configure output). The existing 
`check-clang` suite also provides implicit coverage, since many driver tests 
would fail if the sysroot were misconfigured.

Fixes #<!-- -->137352
Fixes #<!-- -->45225


---
Full diff: https://github.com/llvm/llvm-project/pull/185986.diff


3 Files Affected:

- (modified) clang/CMakeLists.txt (+17) 
- (modified) clang/docs/UsersManual.rst (+17) 
- (added) clang/test/Driver/darwin-default-sysroot.c (+8) 


``````````diff
diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt
index f0d10603374b9..cc34ceb6ea26f 100644
--- a/clang/CMakeLists.txt
+++ b/clang/CMakeLists.txt
@@ -222,6 +222,23 @@ set(USE_DEPRECATED_GCC_INSTALL_PREFIX OFF CACHE BOOL 
"Temporary workaround befor
 set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )
 set(DEFAULT_SYSROOT "" CACHE STRING
   "Default <path> to all compiler invocations for --sysroot=<path>." )
+
+# On macOS, auto-detect SDK so that 'clang hello.c' works out-of-the-box.
+if(APPLE AND NOT CMAKE_CROSSCOMPILING AND DEFAULT_SYSROOT STREQUAL "")
+  execute_process(
+    COMMAND xcrun --show-sdk-path
+    OUTPUT_VARIABLE _detected_sysroot
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+    ERROR_QUIET
+    RESULT_VARIABLE _xcrun_result
+  )
+  if(_xcrun_result EQUAL 0 AND EXISTS "${_detected_sysroot}")
+    set(DEFAULT_SYSROOT "${_detected_sysroot}" CACHE STRING
+      "Default <path> to all compiler invocations for --sysroot=<path>." FORCE)
+    message(STATUS "Auto-detected macOS SDK for DEFAULT_SYSROOT: 
${DEFAULT_SYSROOT}")
+  endif()
+endif()
+
 if(GCC_INSTALL_PREFIX AND NOT USE_DEPRECATED_GCC_INSTALL_PREFIX)
   message(FATAL_ERROR "GCC_INSTALL_PREFIX is deprecated and will be removed. 
Use "
     "configuration files 
(https://clang.llvm.org/docs/UsersManual.html#configuration-files)"
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 5d7a124679d87..f77b80aa28b50 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -4786,6 +4786,23 @@ backend.
 Operating System Features and Limitations
 -----------------------------------------
 
+Apple
+^^^^^
+
+On Apple platforms, standard headers and libraries are not provided by
+the base system. Instead, they are part of the Xcode SDK. When building
+LLVM from source on macOS, the SDK location is auto-detected at cmake
+configure time and baked into Clang as the default sysroot.
+
+The SDK location can be overridden in the following ways (highest priority
+first):
+
+- The ``-isysroot`` or ``--sysroot=`` command-line option.
+- The ``SDKROOT`` environment variable, which is set automatically by
+  Xcode tools such as ``xcrun``.
+- The ``DEFAULT_SYSROOT`` cmake option, which can be set explicitly at
+  LLVM build time with ``-DDEFAULT_SYSROOT=/path/to/sdk``.
+
 Windows
 ^^^^^^^
 
diff --git a/clang/test/Driver/darwin-default-sysroot.c 
b/clang/test/Driver/darwin-default-sysroot.c
new file mode 100644
index 0000000000000..726fe063fd7d6
--- /dev/null
+++ b/clang/test/Driver/darwin-default-sysroot.c
@@ -0,0 +1,8 @@
+// REQUIRES: system-darwin
+
+// Check that clang finds the macOS SDK automatically via DEFAULT_SYSROOT,
+// even when SDKROOT is not set in the environment.
+//
+// RUN: env -u SDKROOT %clang -c %s -### 2>&1 | FileCheck %s
+//
+// CHECK: "-isysroot" "{{.*MacOSX[0-9\.]*\.sdk}}"

``````````

</details>


https://github.com/llvm/llvm-project/pull/185986
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to