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

Reply via email to