<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/130246>130246</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Cross compiling libcxx fails after version 20
</td>
</tr>
<tr>
<th>Labels</th>
<td>
libc++
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
gyatpear
</td>
</tr>
</table>
<pre>
Cross buiding runtime using the following command:
```sh
cmake --no-warn-unused-cli -Wno-dev \
-S "${LLVM_SRC_DIR}/runtimes" \
-B "${BUILD_DIR}/${ARCH}/runtimes" \
-G Ninja \
-D CMAKE_COLOR_DIAGNOSTICS:BOOL=ON \
-D CMAKE_INSTALL_PREFIX:PATH="${INSTALL_PREFIX}" \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_C_COMPILER:PATH="${INSTALL_PREFIX}/bin/clang" \
-D CMAKE_CXX_COMPILER:PATH="${INSTALL_PREFIX}/bin/clang++" \
-D CMAKE_C_COMPILER_FORCED:BOOL=ON \
-D CMAKE_CXX_COMPILER_FORCED:BOOL=ON \
-D CMAKE_C_COMPILER_TARGET="${ARCH}" \
-D CMAKE_CXX_COMPILER_TARGET="${ARCH}" \
-D CMAKE_ASM_COMPILER_TARGET="${ARCH}" \
-D LLVM_APPEND_VC_REV:BOOL=OFF \
-D LLVM_USE_RELATIVE_PATHS_IN_FILES:BOOL=ON \
-D LLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO:BOOL=ON \
-D LLVM_ENABLE_PER_TARGET_RUNTIME_DIR:BOOL=ON \
-D LLVM_INSTALL_TOOLCHAIN_ONLY:BOOL=ON \
-D LLVM_INCLUDE_BENCHMARKS:BOOL=OFF \
-D LLVM_INCLUDE_EXAMPLES:BOOL=OFF \
-D LLVM_INCLUDE_TESTS:BOOL=OFF \
-D LLVM_ENABLE_PROJECTS:STRING="" \
-D LLVM_ENABLE_RUNTIMES:STRING='libcxxabi;libcxx;libunwind' \
-D LLVM_DEFAULT_TARGET_TRIPLE="${ARCH}" \
-D CMAKE_SYSROOT:PATH="${INSTALL_PREFIX}/${ARCH}" \
-D LIBCXX_INCLUDE_BENCHMARKS:BOOL=OFF \
-D LIBCXX_HAS_MUSL_LIBC:BOOL=ON \
-D LIBCXX_ENABLE_SHARED:BOOL=OFF \
-D LIBCXX_ENABLE_STATIC:BOOL=ON \
-D LIBUNWIND_USE_COMPILER_RT:BOOL=ON \
-D LIBUNWIND_ENABLE_SHARED:BOOL=OFF \
-D LINUNWIND_ENABLE_STATIC:BOOL=ON \
-D LIBCXXABI_USE_LLVM_UNWINDER:BOOL=ON \
-D LIBCXXABI_ENABLE_SHARED:BOOL=OFF \
-D LIBCXXABI_ENABLE_STATIC:BOOL=ON \
-D LIBCXXABI_ENABLE_STATIC_ABI_LIBRARY:BOOL=ON \
-D CMAKE_AR:PATH="${INSTALL_PREFIX}/bin/llvm-ar" \
-D CMAKE_RANLIB:PATH="${INSTALL_PREFIX}/bin/llvm-ranlib" \
-D CMAKE_LINKER:PATH="${INSTALL_PREFIX}/bin/ld.lld" \
-D CMAKE_NM:PATH="${INSTALL_PREFIX}/bin/llvm-nm" \
-D CMAKE_OBJDUMP:PATH="${INSTALL_PREFIX}/bin/llvm-objdump" \
-D CMAKE_OBJCOPY:PATH="${INSTALL_PREFIX}/bin/llvm-objcopy" \
-D CMAKE_STRIP:PATH="${INSTALL_PREFIX}/bin/llvm-strip" \
-D CMAKE_FIND_ROOT_PATH:PATH="${INSTALL_PREFIX}/${1}" \
-D CMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-D CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
-D CMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY
```
where `${ARCH}` can be `aarch64-unknown-linux-musl` etc.
This command builds LLVM 19.1.7, but I got this error while building 20.1.0:
```
CMake Error in /source/llvm-project/libcxx/src/CMakeLists.txt:
No known features for CXX compiler
"Clang"
version 20.1.0.
CMake Generate step failed. Build files cannot be regenerated correctly.
```
Having digged into the source, I found
https://github.com/llvm/llvm-project/blob/21b261102504c97fc0b81c101898c0f1c1a7e79c/libcxx/src/CMakeLists.txt#L173
which inserts
https://github.com/llvm/llvm-project/blob/21b261102504c97fc0b81c101898c0f1c1a7e79c/runtimes/cmake/Modules/FindLibcCommonUtils.cmake#L17
During cross compiling, `CMAKE_<LANG>_COMPILE_FEATURES` maybe empty since it cannot actually run any target executables. `target_compile_features` requires `CMAKE_<LANG>_COMPILE_FEATURES` or CMake generate step may fail.
One of the solutions to this problem is, since I have known what my compiler supported, I added `-D CMAKE_CXX_COMPILE_FEATURES=cxx_std_17 -D CMAKE_CXX17_COMPILE_FEATURES=cxx_std_17` to the command line.
However, I do not think this is the final solution.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8WElz4jzX_TVmo4LywLhgYTwkftrYlDH9JCuXbAtQt5D4JDkJ__4reSBDv2Hot-pNscCKzvG5V-de-wKFwDuK0FwbLbSR24OV3DM-352gPCLIezkrT3OHMyFAXuES0x3gFZX4gEAl1JXcI7BlhLBXdVWwwwHSUrNsTa8_Y735iL2m28UB_kag36es_wo57Ve0EqjsFwSD_r-U9Uv0ArSRo-k2aP_6a6CZpmYOtckiDH8us3XiZG6QaBNXM_1WidBM8ytu8Y5bbILQfQc1i3biPF4leQARpr9gt9x3gbO0f3iZE4dxkrmB_RDF6zRw1pplL-I41Cw3jr6SdKAgWqd2GGarxPODJ82yV3b6qFnuWeeXDUrcH4o6siam9HnlaZabIIKgQN_tdTInXq6C0Etuu6mfY6qZfkEg3V2Q4Dw9_VfEi_rzPf2ZPPPjxPHcW3L8UdM9sHdQaicPXvoxkLNTbsrEXxHY6-XfEtRFYa9WXuRmP50s8X5-CNj3vwFs1l6WeKGdBj-9TJ3cOguizA9C74qVL6Bdb7F5yILIj2-g8CJ7EXrZ6hxvlmyiNFh6dZ1ex3fuSuM4dB7tIMriKHy-CeiEG9fLFl7kPC7t5Mf6lnx1KO_JXq4-J-kqJvXW6U2ALidJ_I_n1JB1mgTRQ2eF706_xbUJ_IKbEJwXb28wx5q1aL43Xyr6immpmZNvWF3Ptzdh2h1PmgSr0LvP1uvndRLH6Y3N4QavBwtVavcfYYN7tNfZcrMOM3V9xSoNos3s-tFOPjWSCzfpIKmdBtdvson-DSK3Lqhz_SfprbD75EVfULcpdJ6e7EVQK2xqvybxrtXoGXh_Cj-i7tL4CZSplTBYJHZypS20Lfi-ZxghL4c-5BfMn9hRGCzuJ-WQEpxfIA6D6MedT1xSDggpL3BGy_uF0sMFwnjxj7tZru5nZfmvsjocL1M78er5r6gLdjxdaliqy91PLCTHlxT7quxUJ8wa4jvaoXG5w35mzpax63XtsXZ7-HwPcmU7P-yHa8g0ee6a1fnh0LyHtpXXVd2Ht_9mGHjdI46AuvzU6sc6KCAFef0vCHmxHw_7Ff1N2SvtE0yrt_6hEkTtQ7IYNFzpHotu2lCTCSlF_dwCxmxgDCaa6YC8kiAAOyaBVJsR54yD1z0mqAGoecXUB8ZA_3Nc0XTbWaphxatRmALN9AWreIG6Uz9y9gsVUl02j1XTF7zQTL8GhlhIMZBvsuEGIGKgjghsEZQVRwJsGQfO05OK4ogJ4o0EoAYXp3337pZeEBeY0VZum4KzxgdEEYcSASHREWwhJqgcgIWKEWwxQULllzKpUszRrt1dgoJxjgpJToM_z-oRvqj8lHi3QyXAVLJ60utS4IAAbFlFy2b3XsqjUJEq3_o7LPdVPijYoc3VnynLCcs10zeN3Bwbhm6O9GExm2wLPZ8ahaEb09m00LdGYcAJmsyKq0k2rdCYWJ3NcLEHmArEpfif6XsfI_16zNVMf8nKitQrPqZliPPCYYcDoxuJiRi0u5TwRqRb8XqEroftxhRYucBRddHUnmY5oa3e7M7vC5nv2ekm8daqPA7wlCOADkd5AgLTAgEsu7OHhawgISc1vgNIT0BCvkMSoDdUVBLmBImBulGznLWmzDq3KnqO_q_Cyrm36lEGrx26--TQAzzVLm19HFME2La1F6kkZlSA2m9YgCNnOUEHgIVKRBNUAPbwBbXl9LqHEhxO5yoCojoeGZeobFwKyxKVSvF_Gtfe1Vpu8faWCVlmxuTTZGdMLm9WcbbF0bUjgikagLaO2Ct6QbzRUjJAm3ZEfzfhYdH8gIIpJOfoB71ybpUzawZ7aG5MhoZljmbTaW8_H8-20DDGhbk1IDRGljEp88lwOx3PjGI20qc9PDeVWS19oo-s2XA62ObbcbEtLDOfjKe6NdKGOjqo3CvDDxjf9bAQFZoblm4Oxz0Cc0RE_WOQaaqSO8_p2sjt8XldJnm1E9pQJ3X1nXkklgS1PxWd3Quasq2PWwC4lYh_aGa9ipP53bVZC1ZV1Wp-mZv_HwAA__-eGDJq">