<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/139673>139673</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
runtimes builds may fail due to missing llvm-link despite llvm being enabled
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nolongerwait
</td>
</tr>
</table>
<pre>
Hi, all
llvm-project version: 20.1.4
I'm running a monorepo CMake build using both LLVM_ENABLE_PROJECTS and LLVM_ENABLE_RUNTIMES, and I'm seeing an issue where the compiler-rt runtime fails to build due to a missing llvm-link binary, even though llvm is explicitly listed in LLVM_ENABLE_PROJECTS.
Here is my CMake invocation:
```bash
cmake -G Ninja \
-DCMAKE_C_COMPILER="${TOOLCHAIN_GCC_INSTALL_DIR}/bin/gcc" \
-DCMAKE_CXX_COMPILER="${TOOLCHAIN_GCC_INSTALL_DIR}/bin/g++" \
-DLLVM_ENABLE_PROJECTS="llvm;clang;clang-tools-extra;lld;lldb;openmp" \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind;compiler-rt" \
-DLLVM_TARGETS_TO_BUILD="${LLVM_ARCH}" \
-DLLVM_RUNTIME_TARGETS="default;${LLVM_RUNTIME_ARCH}" \
-DCMAKE_INSTALL_PREFIX="${TOOLCHAIN_TRUNK_LLVM_INSTALL_DIR}" \
-DCLANG_DEFAULT_LINKER=lld \
-DLLVM_USE_LINKER=lld \
-DLLVM_ENABLE_TERMINFO=0 \
-DLLVM_ENABLE_ASSERTIONS=OFF \
-DLLVM_BUILD_TESTS=OFF \
-DLIBOMPTARGET_BUILD_DEVICERTL_BCLIB=OFF \
-DCOMPILER_RT_ENABLE_INTERNAL_SYMBOLIZER=ON \
-DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
-DCMAKE_BUILD_TYPE=Release \
"${TOOLCHAIN_PUBLISH_WORKSPACE}/llvm" &&
ninja install
```
โ Problem
The build fails at this step:
```bash
+ for F in $CC $CXX $TBLGEN $LINK $OPT $AR
+ [[ ! -x /home/*****/trunk_llvm_build/bin/llvm-link ]]
+ echo '/home/*****/trunk_llvm_build/bin/llvm-link'
Missing /home/*****/trunk_llvm_build/bin/llvm-link
+ exit 1
FAILED: compiler-rt/lib/sanitizer_common/symbolizer/RTSanitizerCommonSymbolizerInternal.x86_64.o /home/*****/trunk_llvm_build/runtimes/runtimes-x86_64-unknown-linux-gnu-bins/compiler-rt/lib/sanitizer_common/symbolizer/RTSanitizerCommonSymbolizerInternal.x86_64.o
cd /home/*****/trunk_llvm_build/runtimes/runtimes-x86_64-unknown-linux-gnu-bins/compiler-rt/lib/sanitizer_common/symbolizer/RTSanitizerCommonSymbolizerInternal.x86_64 && FLAGS= CLANG=/home/*****/trunk_llvm_build/./bin/clang /home/qinzetian/code/bytedance/sys/llvm-project/llvm-project/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh /home/*****/trunk_llvm_build/runtimes/runtimes-x86_64-unknown-linux-gnu-bins/compiler-rt/lib/sanitizer_common/symbolizer/RTSanitizerCommonSymbolizerInternal.x86_64.o
```
This occurs in build_symbolizer.sh which expects llvm-link, llvm-ar, opt, etc., to be present before runtime components (e.g., compiler-rt) are built.
Even though llvm is part of LLVM_ENABLE_PROJECTS, these tools apparently haven't been built yet when runtimes starts building.
๐ Question
Should the CMake system enforce that tools like llvm-link are available before attempting to build runtimes, especially compiler-rt?
Or is it the user's responsibility to manually build such tools before running ninja?
๐งช Notes
I can workaround this by manually running ninja llvm-link before full build.
A fully separated two-stage build (build tools โ build runtimes) also avoids the issue, but it would be nice to clarify whether this is expected behavior or a missing dependency declaration.
Thanks in advance for your help!
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUV11z6jgS_TXKiwrKmPD1wIMxduK9DrDgzGT2xSXbDdZElrySTML8-i3JhpAbZqpmb83DrXJhYbWOuo-ko26iFD1wgDkaLdBoeUcaXQo554IJfgD5Rqi-y0Rxmj9S5PqYMIYcDzkeY8eqV0vxO-QaH0EqKjgaeth1-oP-fWsTIXdSYdlwTvkBE1wJLiTUAvtP5BVw1lBW4EaZzkzoEsfxL09psPIWcZButut_BX6yw4QXnzq2z6skegp21hte4HYSBWDn4Jgq1QB-K0EC1iXgXFQ1ZSB7UhtXNK0A7wllCmvRuVA0YP4QXFFlvbHBMcpfcUY5kSczFxyBY12K5lDafkwVhvea0ZxqdsKMKg0FpvxmFP2WkEfjFFW4OnUUUH4UOdEtd8Zm7LRPRlSJHC-vjFXvAa8o_51gNPKR42HcW_pP3rcg9VN__bSJ4mCLhkvkusi9R5NFsl7H_qMXrdIH30-j1S7x4jhdRls0WSI3zChHbnjIc-S6XxFfXn4AE7kL-1zj3qKjRTYsouEiZ4Qfzu-eFoKpHrxrSdBwwVjR_mZouBA18Kr-c_TLzmjRaZa_v5vRtkEy2rYb_ka5Qb3aGDcwE2_7ECS7NFmni-coXl6TYQ28rf9og_8ytPPjDNGOLGBPGqbRcHGFcba8idUuyJnqzTYIo5fbS5Jsn1ffUov4_cp8Aoy91UO6DELvOU7SOFp9s2vMWPF9BM-74C_7O8KTYPsUrcI1Gi6dPzHxdrtgm0TrlaFhHYbfm1lu0yTYJTcMosX6adOy2Bkug18iP9gmcbrw42jxZch566bb5OxBtEqC7cqL091vT4t1HP3HBrVefWG6neHXKHm8sLjdeMnjX1knv20CNFxugQFRcDG6sUab50Uc7R7TX9fbb7uN5wftwbFnwKySOzaPGcztUadc6U5sz5pg2oGLZks0m-CNFBmDCjleUp6ltJU1orEuqcJKQ92pyldhQe4C74XEoVEs5N77vv19eTGvZBE_BCvTMpvAvNebxLy8bTfUXhYLjNwB7r1j5IalqAC5IXK9z0-oZcNfUxNmap28iMWHxqLR0jwtMuSlwMid_BimAXC8p07OfxCrc-ydajxAjhd6URwszV33SUFCRjPkhopwqukfINNcVJUwSOpUZYKZb8gNt8nubOFbg92lN-IaJCes_z4dp-P7vvi7jnfXm7pq9lqsXsNfuXjjJqDmvXfgTS-j3Bj-0zGYS6z4-QPpDigOY-_BKBW2Ymrl-G9F1r_sL3vdXRHzX8r_AE2J7ROF-ZSdNBSE52D9VudN2WVdX__-PxSoXNJaG2zrYvrR2Vflz79udgN-UlAjmFRhkeeNVEb9bsX9VtK8NOkd5FrhK1nx2z9Emqaotc0Mdd43b5NPAq4lKOAaZ7AXEi4ppwlTcOBaYeROoX-wQz4FP8NEtlKuu3wxuJFz1kRqLPY300zrRQnKpLPCXAV1TSRwk5-W5AgcuRPjGLRBa3wCbTJlfvbSXBpEatVyQvmh8wOFDpqFaHaPpkv87waUzVgdb1eKhhU2zW7zWXVSGioMfC9kbvJvcxlZVxh9hau82kRKjoQykjE4c0W0hqrWRrIvufnHlvIxqBpyShg7fSJuGLZerqXhh2rrT6PMTpkoLEHVgiuaUUb1yQBXhDcWpJ1BNXnZOfmxZrZisTfxBb4jwZsgz8MroUGZEgfnhOM3IV-JFA0v2qs3O31M8gnsurJo59o3jLWOdFx79tMJK6iJJKam0G-ipzQ5nK955E7bRuu0yQmmYzRzvzA2w4QpgclR0EJZVmxxZKjMGm2YerPrlwHmNLc1UM6IpPuT2RW6BNmG01Y6kBtnMijJkQqJhbwqmAqogRfA8xMuwGDYmqZ_Pm-Ev9qjRoqjkTObeZxEI3EJrEbu4K6YD4vZcEbuYD6Y3E8Gg8l4MLsr58PhqHDHo8nUGY-zDAakGJHpbL8n-Xg6cWB6R-eu446c0WDojN3xaNbP99PxAPbEHTp5Phns0b0DFaGsb5jvC3m4sxzMB8PZeDK8YyQDpmzx67oc3s4MuaYWlnO7XFlzUOjeMRWe-oDRVDOYXw6O5V7hipxsGnauKb9WlAWomur2LODMVq3AzSko7hrJ5qXWtTJpm5Hc8EB12WT9XFSXXPF70bcOGyHtIjrO3f8FAAD__8UmC5s">