160 lines · plain
1#===============================================================================2# Setup Project3#===============================================================================4 5cmake_minimum_required(VERSION 3.20.0)6set(LLVM_SUBPROJECT_TITLE "LLVM libgcc")7 8set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")9 10# Check if llvm-libgcc is built as a standalone project11if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LLVM_LIBGCC_STANDALONE_BUILD)12 project(llvm-libgcc LANGUAGES C CXX ASM)13 set(COMPILER_RT_STANDALONE_BUILD ON)14 set_property(GLOBAL PROPERTY USE_FOLDERS ON)15 set(LLVM_LIBGCC_COMPILER_RT_BINARY_DIR "compiler-rt")16 set(LLVM_LIBGCC_LIBUNWIND_BINARY_DIR "libunwind")17else()18 set(LLVM_LIBGCC_COMPILER_RT_BINARY_DIR "../compiler-rt")19 set(LLVM_LIBGCC_LIBUNWIND_BINARY_DIR "../libunwind")20endif()21 22# Add path for custom modules23list(INSERT CMAKE_MODULE_PATH 024 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"25 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"26 "${CMAKE_CURRENT_SOURCE_DIR}/../runtimes/cmake/Modules"27 "${LLVM_COMMON_CMAKE_UTILS}"28 "${LLVM_COMMON_CMAKE_UTILS}/Modules"29)30 31set(LLVM_LIBGCC_LIBUNWIND_PATH "${CMAKE_CURRENT_LIST_DIR}/../libunwind"32 CACHE PATH "Specify path to libunwind source.")33set(LLVM_LIBGCC_COMPILER_RT_PATH "${CMAKE_CURRENT_LIST_DIR}/../compiler-rt"34 CACHE PATH "Specify path to compiler-rt source.")35 36include(GNUInstallDirs)37 38if(NOT LLVM_LIBGCC_EXPLICIT_OPT_IN)39 message(FATAL_ERROR40 "llvm-libgcc is not for the casual LLVM user. It is intended to be used by distro "41 "managers who want to replace libgcc with compiler-rt and libunwind, but cannot "42 "fully abandon the libgcc family (e.g. because they are dependent on glibc). Such "43 "managers must have worked out their compatibility requirements ahead of using "44 "llvm-libgcc. If you want to build llvm-libgcc, please add -DLLVM_LIBGCC_EXPLICIT_OPT_IN=Yes "45 "to your CMake invocation and try again.")46endif()47 48if(HAVE_COMPILER_RT)49 message(FATAL_ERROR50 "Attempting to build both compiler-rt and llvm-libgcc will cause irreconcilable "51 "target clashes. Please choose one or the other, but not both.")52endif()53 54if(HAVE_LIBUNWIND)55 message(FATAL_ERROR56 "Attempting to build both libunwind and llvm-libgcc will cause irreconcilable "57 "target clashes. Please choose one or the other, but not both.")58endif()59 60#===============================================================================61# Configure System62#===============================================================================63 64if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)65 set(TARGET_SUBDIR ${LLVM_DEFAULT_TARGET_TRIPLE})66 if(LLVM_LIBGCC_LIBDIR_SUBDIR)67 string(APPEND TARGET_SUBDIR /${LLVM_LIBGCC_LIBDIR_SUBDIR})68 endif()69 set(LLVM_LIBGCC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${TARGET_SUBDIR})70 set(LLVM_LIBGCC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${TARGET_SUBDIR} CACHE PATH71 "Path where built llvm-libgcc libraries should be installed.")72 unset(TARGET_SUBDIR)73else()74 if(LLVM_LIBRARY_OUTPUT_INTDIR)75 set(LLVM_LIBGCC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})76 else()77 set(LLVM_LIBGCC_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LLVM_LIBGCC_LIBDIR_SUFFIX})78 endif()79 set(LLVM_LIBGCC_INSTALL_LIBRARY_DIR lib${LLVM_LIBGCC_LIBDIR_SUFFIX} CACHE PATH80 "Path where built llvm-libgcc libraries should be installed.")81endif()82 83set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR})84set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR})85set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR})86 87#===============================================================================88# Build libraries89#===============================================================================90 91set(COMPILER_RT_BUILD_BUILTINS ON)92set(COMPILER_RT_BUILTINS_HIDE_SYMBOLS OFF)93add_subdirectory(${LLVM_LIBGCC_COMPILER_RT_PATH} ${LLVM_LIBGCC_COMPILER_RT_BINARY_DIR})94 95set(LIBUNWIND_ENABLE_STATIC ON)96set(LIBUNWIND_ENABLE_SHARED ON)97set(LIBUNWIND_USE_COMPILER_RT OFF)98set(LIBUNWIND_HAS_GCC_LIB OFF)99set(LIBUNWIND_HAS_GCC_S_LIB OFF)100add_subdirectory(${LLVM_LIBGCC_LIBUNWIND_PATH} ${LLVM_LIBGCC_LIBUNWIND_BINARY_DIR})101 102add_custom_target(gcc_s.ver103 SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/gcc_s.ver.in104 COMMAND ${CMAKE_C_COMPILER} -E105 -xc ${CMAKE_CURRENT_SOURCE_DIR}/gcc_s.ver.in106 -o ${CMAKE_CURRENT_BINARY_DIR}/gcc_s.ver107)108 109add_dependencies(unwind_shared gcc_s.ver)110 111construct_compiler_rt_default_triple()112 113target_link_options(unwind_shared PUBLIC114 -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/gcc_s.ver115)116 117target_link_libraries(unwind_shared PUBLIC118 $<TARGET_OBJECTS:clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}>119 m120)121 122#===============================================================================123# Install Symlinks124#===============================================================================125 126get_compiler_rt_install_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} install_dir_builtins)127string(REGEX REPLACE "^lib/" "" install_dir_builtins "${install_dir_builtins}")128string(FIND "${install_dir_builtins}" "clang" install_path_contains_triple)129if(install_path_contains_triple EQUAL -1)130 set(builtins_suffix "-${COMPILER_RT_DEFAULT_TARGET_ARCH}")131else()132 string(PREPEND install_dir_builtins "../")133endif()134set(LLVM_LIBGCC_COMPILER_RT ${install_dir_builtins}/libclang_rt.builtins${builtins_suffix}.a)135 136add_custom_target(llvm-libgcc ALL137 DEPENDS unwind_shared unwind_static clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}138 COMMAND ${CMAKE_COMMAND} -E create_symlink ${LLVM_LIBGCC_COMPILER_RT} libgcc.a139 COMMAND ${CMAKE_COMMAND} -E create_symlink libunwind.a libgcc_eh.a140 COMMAND ${CMAKE_COMMAND} -E create_symlink libunwind.so libgcc_s.so.1.0141 COMMAND ${CMAKE_COMMAND} -E create_symlink libgcc_s.so.1.0 libgcc_s.so.1142 COMMAND ${CMAKE_COMMAND} -E create_symlink libgcc_s.so.1 libgcc_s.so143)144 145install(TARGETS unwind_shared unwind_static146 LIBRARY DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} COMPONENT llvm-libgcc147 ARCHIVE DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} COMPONENT llvm-libgcc148 RUNTIME DESTINATION ${LLVM_LIBGCC_INSTALL_RUNTIME_DIR} COMPONENT llvm-libgcc)149 150install(TARGETS clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}151 LIBRARY DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR}/${install_dir_builtins} COMPONENT llvm-libgcc152 ARCHIVE DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR}/${install_dir_builtins} COMPONENT llvm-libgcc153 RUNTIME DESTINATION ${LLVM_LIBGCC_INSTALL_RUNTIME_DIR}/${install_dir_builtins} COMPONENT llvm-libgcc)154 155foreach(VAR libgcc.a libgcc_eh.a libgcc_s.so.1.0 libgcc_s.so.1 libgcc_s.so)156 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${VAR}157 DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR}158 COMPONENT llvm-libgcc)159endforeach()160