diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -19,16 +19,26 @@ set(LIBC_ENABLE_USE_BY_CLANG OFF CACHE BOOL "Whether or not to place libc in a build directory findable by a just built clang") -if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND LIBC_ENABLE_USE_BY_CLANG) +if(LIBC_TARGET_ARCHITECTURE_IS_GPU) + set(LIBC_INCLUDE_DIR ${LLVM_BINARY_DIR}/include/gpu-none-llvm) + set(LIBC_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/gpu-none-llvm) + set(LIBC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/gnu-none-llvm) +elseif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND LIBC_ENABLE_USE_BY_CLANG) + set(LIBC_INCLUDE_DIR ${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}) + set(LIBC_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) set(LIBC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) else() if(NOT LIBC_ENABLE_USE_BY_CLANG) - set(LIBC_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + set(LIBC_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include) + set(LIBC_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib) elseif(LLVM_LIBRARY_OUTPUT_INTDIR) + set(LIBC_INCLUDE_DIR ${LLVM_BINARY_DIR}/include) set(LIBC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) else() + set(LIBC_INCLUDE_DIR ${CMAKE_BINARY_DIR}/include) set(LIBC_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) endif() + set(LIBC_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}) endif() if(LLVM_LIBC_FULL_BUILD OR LIBC_GPU_BUILD OR LIBC_GPU_ARCHITECTURES) diff --git a/libc/cmake/modules/LLVMLibCHeaderRules.cmake b/libc/cmake/modules/LLVMLibCHeaderRules.cmake --- a/libc/cmake/modules/LLVMLibCHeaderRules.cmake +++ b/libc/cmake/modules/LLVMLibCHeaderRules.cmake @@ -18,12 +18,14 @@ message(FATAL_ERROR "'add_header' rules requires the HDR argument specifying a headef file.") endif() - set(dest_file ${CMAKE_CURRENT_BINARY_DIR}/${ADD_HEADER_HDR}) + set(absolute_path ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_HEADER_HDR}) + file(RELATIVE_PATH relative_path ${LIBC_INCLUDE_SOURCE_DIR} ${absolute_path}) + set(dest_file ${LIBC_INCLUDE_DIR}/${relative_path}) set(src_file ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_HEADER_HDR}) add_custom_command( OUTPUT ${dest_file} - COMMAND cp ${src_file} ${dest_file} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src_file} ${dest_file} DEPENDS ${src_file} ) @@ -86,7 +88,9 @@ message(FATAL_ERROR "`add_gen_hdr` rule requires GEN_HDR to be specified.") endif() - set(out_file ${CMAKE_CURRENT_BINARY_DIR}/${ADD_GEN_HDR_GEN_HDR}) + set(absolute_path ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR_GEN_HDR}) + file(RELATIVE_PATH relative_path ${LIBC_INCLUDE_SOURCE_DIR} ${absolute_path}) + set(out_file ${LIBC_INCLUDE_DIR}/${relative_path}) set(in_file ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR_DEF_FILE}) set(fq_data_files "") diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -1,4 +1,6 @@ +set(LIBC_INCLUDE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(LIBC_INCLUDE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + include(LLVMLibCHeaderRules) add_subdirectory(llvm-libc-macros) @@ -522,8 +524,10 @@ endfunction(get_all_install_header_targets) get_all_install_header_targets(all_install_header_targets ${TARGET_PUBLIC_HEADERS}) -add_custom_target(libc-headers) +add_library(libc-headers INTERFACE) add_dependencies(libc-headers ${all_install_header_targets}) +target_include_directories(libc-headers SYSTEM INTERFACE ${LIBC_INCLUDE_DIR}) + foreach(target IN LISTS all_install_header_targets) get_target_property(header_file ${target} HEADER_FILE_PATH) if(NOT header_file) @@ -532,12 +536,7 @@ endif() file(RELATIVE_PATH relative_path ${LIBC_INCLUDE_BINARY_DIR} ${header_file}) get_filename_component(nested_dir ${relative_path} DIRECTORY) - # The GPU headers are installed to 'gpu-none-llvm/' to prevent shadowing the - # system headers. - if(LIBC_TARGET_ARCHITECTURE_IS_GPU) - set(nested_dir gpu-none-llvm/${nested_dir}) - endif() install(FILES ${header_file} - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${nested_dir} + DESTINATION ${LIBC_INSTALL_INCLUDE_DIR}/${nested_dir} COMPONENT libc-headers) endforeach()