mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-14 18:36:35 +00:00

We weren't applying the libdir subdir to header directories but this is necessary for correctness when building e.g. ASan variant. This change also updates path construction logic accross all runtimes and ensures they're consistent.
160 lines
6.6 KiB
CMake
160 lines
6.6 KiB
CMake
#===============================================================================
|
|
# Setup Project
|
|
#===============================================================================
|
|
|
|
cmake_minimum_required(VERSION 3.20.0)
|
|
set(LLVM_SUBPROJECT_TITLE "LLVM libgcc")
|
|
|
|
set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
|
|
|
|
# Check if llvm-libgcc is built as a standalone project
|
|
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LLVM_LIBGCC_STANDALONE_BUILD)
|
|
project(llvm-libgcc LANGUAGES C CXX ASM)
|
|
set(COMPILER_RT_STANDALONE_BUILD ON)
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
set(LLVM_LIBGCC_COMPILER_RT_BINARY_DIR "compiler-rt")
|
|
set(LLVM_LIBGCC_LIBUNWIND_BINARY_DIR "libunwind")
|
|
else()
|
|
set(LLVM_LIBGCC_COMPILER_RT_BINARY_DIR "../compiler-rt")
|
|
set(LLVM_LIBGCC_LIBUNWIND_BINARY_DIR "../libunwind")
|
|
endif()
|
|
|
|
# Add path for custom modules
|
|
list(INSERT CMAKE_MODULE_PATH 0
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/../runtimes/cmake/Modules"
|
|
"${LLVM_COMMON_CMAKE_UTILS}"
|
|
"${LLVM_COMMON_CMAKE_UTILS}/Modules"
|
|
)
|
|
|
|
set(LLVM_LIBGCC_LIBUNWIND_PATH "${CMAKE_CURRENT_LIST_DIR}/../libunwind"
|
|
CACHE PATH "Specify path to libunwind source.")
|
|
set(LLVM_LIBGCC_COMPILER_RT_PATH "${CMAKE_CURRENT_LIST_DIR}/../compiler-rt"
|
|
CACHE PATH "Specify path to compiler-rt source.")
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
if(NOT LLVM_LIBGCC_EXPLICIT_OPT_IN)
|
|
message(FATAL_ERROR
|
|
"llvm-libgcc is not for the casual LLVM user. It is intended to be used by distro "
|
|
"managers who want to replace libgcc with compiler-rt and libunwind, but cannot "
|
|
"fully abandon the libgcc family (e.g. because they are dependent on glibc). Such "
|
|
"managers must have worked out their compatibility requirements ahead of using "
|
|
"llvm-libgcc. If you want to build llvm-libgcc, please add -DLLVM_LIBGCC_EXPLICIT_OPT_IN=Yes "
|
|
"to your CMake invocation and try again.")
|
|
endif()
|
|
|
|
if(HAVE_COMPILER_RT)
|
|
message(FATAL_ERROR
|
|
"Attempting to build both compiler-rt and llvm-libgcc will cause irreconcilable "
|
|
"target clashes. Please choose one or the other, but not both.")
|
|
endif()
|
|
|
|
if(HAVE_LIBUNWIND)
|
|
message(FATAL_ERROR
|
|
"Attempting to build both libunwind and llvm-libgcc will cause irreconcilable "
|
|
"target clashes. Please choose one or the other, but not both.")
|
|
endif()
|
|
|
|
#===============================================================================
|
|
# Configure System
|
|
#===============================================================================
|
|
|
|
if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
|
|
set(TARGET_SUBDIR ${LLVM_DEFAULT_TARGET_TRIPLE})
|
|
if(LLVM_LIBGCC_LIBDIR_SUBDIR)
|
|
string(APPEND TARGET_SUBDIR /${LLVM_LIBGCC_LIBDIR_SUBDIR})
|
|
endif()
|
|
set(LLVM_LIBGCC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${TARGET_SUBDIR})
|
|
set(LLVM_LIBGCC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${TARGET_SUBDIR} CACHE PATH
|
|
"Path where built llvm-libgcc libraries should be installed.")
|
|
unset(TARGET_SUBDIR)
|
|
else()
|
|
if(LLVM_LIBRARY_OUTPUT_INTDIR)
|
|
set(LLVM_LIBGCC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
|
|
else()
|
|
set(LLVM_LIBGCC_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LLVM_LIBGCC_LIBDIR_SUFFIX})
|
|
endif()
|
|
set(LLVM_LIBGCC_INSTALL_LIBRARY_DIR lib${LLVM_LIBGCC_LIBDIR_SUFFIX} CACHE PATH
|
|
"Path where built llvm-libgcc libraries should be installed.")
|
|
endif()
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR})
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR})
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR})
|
|
|
|
#===============================================================================
|
|
# Build libraries
|
|
#===============================================================================
|
|
|
|
set(COMPILER_RT_BUILD_BUILTINS ON)
|
|
set(COMPILER_RT_BUILTINS_HIDE_SYMBOLS OFF)
|
|
add_subdirectory(${LLVM_LIBGCC_COMPILER_RT_PATH} ${LLVM_LIBGCC_COMPILER_RT_BINARY_DIR})
|
|
|
|
set(LIBUNWIND_ENABLE_STATIC ON)
|
|
set(LIBUNWIND_ENABLE_SHARED ON)
|
|
set(LIBUNWIND_USE_COMPILER_RT OFF)
|
|
set(LIBUNWIND_HAS_GCC_LIB OFF)
|
|
set(LIBUNWIND_HAS_GCC_S_LIB OFF)
|
|
add_subdirectory(${LLVM_LIBGCC_LIBUNWIND_PATH} ${LLVM_LIBGCC_LIBUNWIND_BINARY_DIR})
|
|
|
|
add_custom_target(gcc_s.ver
|
|
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/gcc_s.ver.in
|
|
COMMAND ${CMAKE_C_COMPILER} -E
|
|
-xc ${CMAKE_CURRENT_SOURCE_DIR}/gcc_s.ver.in
|
|
-o ${CMAKE_CURRENT_BINARY_DIR}/gcc_s.ver
|
|
)
|
|
|
|
add_dependencies(unwind_shared gcc_s.ver)
|
|
|
|
construct_compiler_rt_default_triple()
|
|
|
|
target_link_options(unwind_shared PUBLIC
|
|
-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/gcc_s.ver
|
|
)
|
|
|
|
target_link_libraries(unwind_shared PUBLIC
|
|
$<TARGET_OBJECTS:clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}>
|
|
m
|
|
)
|
|
|
|
#===============================================================================
|
|
# Install Symlinks
|
|
#===============================================================================
|
|
|
|
get_compiler_rt_install_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} install_dir_builtins)
|
|
string(REGEX REPLACE "^lib/" "" install_dir_builtins "${install_dir_builtins}")
|
|
string(FIND "${install_dir_builtins}" "clang" install_path_contains_triple)
|
|
if(install_path_contains_triple EQUAL -1)
|
|
set(builtins_suffix "-${COMPILER_RT_DEFAULT_TARGET_ARCH}")
|
|
else()
|
|
string(PREPEND install_dir_builtins "../")
|
|
endif()
|
|
set(LLVM_LIBGCC_COMPILER_RT ${install_dir_builtins}/libclang_rt.builtins${builtins_suffix}.a)
|
|
|
|
add_custom_target(llvm-libgcc ALL
|
|
DEPENDS unwind_shared unwind_static clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink ${LLVM_LIBGCC_COMPILER_RT} libgcc.a
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink libunwind.a libgcc_eh.a
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink libunwind.so libgcc_s.so.1.0
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink libgcc_s.so.1.0 libgcc_s.so.1
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink libgcc_s.so.1 libgcc_s.so
|
|
)
|
|
|
|
install(TARGETS unwind_shared unwind_static
|
|
LIBRARY DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} COMPONENT llvm-libgcc
|
|
ARCHIVE DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} COMPONENT llvm-libgcc
|
|
RUNTIME DESTINATION ${LLVM_LIBGCC_INSTALL_RUNTIME_DIR} COMPONENT llvm-libgcc)
|
|
|
|
install(TARGETS clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}
|
|
LIBRARY DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR}/${install_dir_builtins} COMPONENT llvm-libgcc
|
|
ARCHIVE DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR}/${install_dir_builtins} COMPONENT llvm-libgcc
|
|
RUNTIME DESTINATION ${LLVM_LIBGCC_INSTALL_RUNTIME_DIR}/${install_dir_builtins} COMPONENT llvm-libgcc)
|
|
|
|
foreach(VAR libgcc.a libgcc_eh.a libgcc_s.so.1.0 libgcc_s.so.1 libgcc_s.so)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${VAR}
|
|
DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR}
|
|
COMPONENT llvm-libgcc)
|
|
endforeach()
|