brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 47208fc Raw
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