Skip to content

Commit b348126

Browse files
authored
[libc] Build native libc-hdrgen when crosscompiling (llvm#77848)
When crosscompiling tools for a different architecture, we need to build native libc-hdrgen which can be achieved using the existing CMake support for crosscompiling tablegen tools.
1 parent 792fa23 commit b348126

File tree

3 files changed

+16
-12
lines changed

3 files changed

+16
-12
lines changed

libc/utils/HdrGen/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ target_include_directories(libc-hdrgen PRIVATE ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_I
1818
target_link_libraries(libc-hdrgen PRIVATE LibcTableGenUtil)
1919

2020
add_subdirectory(PrototypeTestGen)
21+
22+
setup_host_tool(libc-hdrgen LIBC_HDRGEN libc_hdrgen_exe libc_hdrgen_target)

llvm/cmake/modules/CrossCompile.cmake

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ function(llvm_create_cross_target project_name target_name toolchain buildtype)
6767
"-DLLVM_EXTERNAL_${name}_SOURCE_DIR=${LLVM_EXTERNAL_${name}_SOURCE_DIR}")
6868
endforeach()
6969

70+
if("libc" IN_LIST LLVM_ENABLE_PROJECTS)
71+
if(LLVM_LIBC_FULL_BUILD AND NOT LIBC_HDRGEN_EXE)
72+
set(libc_flags -DLLVM_LIBC_FULL_BUILD=ON -DLIBC_HDRGEN_ONLY=ON)
73+
endif()
74+
endif()
75+
7076
add_custom_command(OUTPUT ${${project_name}_${target_name}_BUILD}/CMakeCache.txt
7177
COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
7278
-DCMAKE_MAKE_PROGRAM="${CMAKE_MAKE_PROGRAM}"
@@ -86,7 +92,7 @@ function(llvm_create_cross_target project_name target_name toolchain buildtype)
8692
-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN="${LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN}"
8793
-DLLVM_INCLUDE_BENCHMARKS=OFF
8894
-DLLVM_INCLUDE_TESTS=OFF
89-
${build_type_flags} ${linker_flag} ${external_clang_dir}
95+
${build_type_flags} ${linker_flag} ${external_clang_dir} ${libc_flags}
9096
${ARGN}
9197
WORKING_DIRECTORY ${${project_name}_${target_name}_BUILD}
9298
DEPENDS CREATE_${project_name}_${target_name}

llvm/runtimes/CMakeLists.txt

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -425,18 +425,14 @@ if(runtimes)
425425
endif()
426426
if("libc" IN_LIST LLVM_ENABLE_PROJECTS AND
427427
(LLVM_LIBC_FULL_BUILD OR LIBC_GPU_BUILD OR LIBC_GPU_ARCHITECTURES))
428-
if(TARGET libc-hdrgen)
429-
set(libc_tools libc-hdrgen)
430-
set(libc_cmake_args "-DLIBC_HDRGEN_EXE=$<TARGET_FILE:libc-hdrgen>"
431-
"-DLLVM_LIBC_FULL_BUILD=ON")
432-
list(APPEND extra_deps ${libc_tools})
433-
else()
434-
# We want to build the libc build tools before we can build the libc
435-
# itself. So, the libc project should be included in LLVM_ENABLE_PROJECTS.
436-
# This should have been done in llvm/CMakeLists.txt automatically when
437-
# "libc" is detected in LLVM_ENABLE_RUNTIMES.
438-
message(FATAL_ERROR "libc-hdrgen target missing unexpectedly")
428+
get_host_tool_path(libc-hdrgen LIBC_HDRGEN libc_hdrgen_exe libc_hdrgen_target)
429+
if(NOT libc_hdrgen_exe)
430+
message(FATAL_ERROR "libc-hdrgen executable missing")
439431
endif()
432+
set(libc_cmake_args "-DLIBC_HDRGEN_EXE=${libc_hdrgen_exe}"
433+
"-DLLVM_LIBC_FULL_BUILD=ON")
434+
set(libc_tools libc_hdrgen_target)
435+
list(APPEND extra_deps ${libc_hdrgen_target})
440436
if(LIBC_GPU_BUILD OR LIBC_GPU_ARCHITECTURES)
441437
foreach(dep clang-offload-packager nvptx-arch amdgpu-arch)
442438
if(TARGET ${dep})

0 commit comments

Comments
 (0)