Issue |
130246
|
Summary |
Cross compiling libcxx fails after version 20
|
Labels |
libc++
|
Assignees |
|
Reporter |
gyatpear
|
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.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs