-
Notifications
You must be signed in to change notification settings - Fork 15.9k
[llvm-libgcc][CMake] Refactor llvm-libgcc #65455
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
eb938ef
1b8a9ba
c790fd0
358ff00
6f7088b
b61aed7
656d900
60eccd0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,19 +1,26 @@ | ||
| cmake_minimum_required(VERSION 3.20.0) | ||
| #=============================================================================== | ||
| # Setup Project | ||
| #=============================================================================== | ||
|
|
||
| if (NOT IS_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../libunwind") | ||
| message(FATAL_ERROR "llvm-libgcc requires being built in a monorepo layout with libunwind available") | ||
| endif() | ||
| cmake_minimum_required(VERSION 3.20.0) | ||
|
|
||
| set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake") | ||
|
|
||
| list(APPEND CMAKE_MODULE_PATH | ||
| # 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" | ||
| ) | ||
|
|
||
| project(llvm-libgcc LANGUAGES C CXX ASM) | ||
| 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 | ||
|
|
@@ -25,18 +32,103 @@ if(NOT LLVM_LIBGCC_EXPLICIT_OPT_IN) | |
| "to your CMake invocation and try again.") | ||
| endif() | ||
|
|
||
| set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib${LLVMLIB_DIR_SUFFIX}") | ||
| set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib${LLVMLIB_DIR_SUFFIX}") | ||
| set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") | ||
| if(HAVE_COMPILER_RT AND (NOT COMPILER_RT_BUILD_BUILTINS OR COMPILER_RT_BUILTINS_HIDE_SYMBOLS)) | ||
| message(FATAL_ERROR | ||
| "llvm-libgcc requires compiler-rt builtins with default symbol visibility, " | ||
| "add -DCOMPILER_RT_BUILD_BUILTINS=Yes -DCOMPILER_RT_BUILTINS_HIDE_SYMBOLS=No " | ||
| "to your CMake invocation and try again.") | ||
| endif() | ||
|
|
||
| #=============================================================================== | ||
| # Configure System | ||
| #=============================================================================== | ||
|
|
||
| if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) | ||
| set(LLVM_LIBGCC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) | ||
| set(LLVM_LIBGCC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH | ||
| "Path where built llvm-libgcc libraries should be installed.") | ||
| if(LIBCXX_LIBDIR_SUBDIR) | ||
| string(APPEND LLVM_LIBGCC_LIBRARY_DIR /${LLVM_LIBGCC_LIBDIR_SUBDIR}) | ||
| string(APPEND LLVM_LIBGCC_INSTALL_LIBRARY_DIR /${LLVM_LIBGCC_LIBDIR_SUBDIR}) | ||
| endif() | ||
| 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}) | ||
|
|
||
| #=============================================================================== | ||
| # Configure System | ||
| #=============================================================================== | ||
|
|
||
| set(COMPILER_RT_BUILD_BUILTINS ON) | ||
| set(COMPILER_RT_BUILTINS_HIDE_SYMBOLS OFF) | ||
|
|
||
| set(COMPILER_RT_BUILD_BUILTINS On) | ||
| set(COMPILER_RT_BUILTINS_HIDE_SYMBOLS Off) | ||
| add_subdirectory("../compiler-rt" "compiler-rt") | ||
| if(NOT HAVE_COMPILER_RT) | ||
|
||
| add_subdirectory(${LLVM_LIBGCC_COMPILER_RT_PATH} "../compiler-rt") | ||
| endif() | ||
|
|
||
| set(LIBUNWIND_ENABLE_STATIC ON) | ||
| set(LIBUNWIND_ENABLE_SHARED ON) | ||
| set(LIBUNWIND_USE_COMPILER_RT ON) | ||
|
|
||
| if(NOT HAVE_LIBUNWIND) | ||
| add_subdirectory(${LLVM_LIBGCC_LIBUNWIND_PATH} "../libunwind") | ||
| endif() | ||
|
|
||
| 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) | ||
|
|
||
| set(LIBUNWIND_ENABLE_STATIC On) | ||
| set(LIBUNWIND_ENABLE_SHARED Off) | ||
| set(LIBUNWIND_HAS_COMMENT_LIB_PRAGMA Off) | ||
| set(LIBUNWIND_USE_COMPILER_RT On) | ||
| add_subdirectory("../libunwind" "libunwind") | ||
| add_custom_target(llvm-libgcc ALL | ||
| DEPENDS unwind_shared | ||
| 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 | ||
| ) | ||
|
|
||
| add_subdirectory(lib) | ||
| 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() | ||
This file was deleted.
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm happy you're able to delete this file.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In the refactored approach, we modify |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this being removed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
libunwind/CMakeLists.txtdoes not contains aproject(libunwind LANGUAGES C CXX ASM). To keep consistent withlibunwind/CMakeLists.txt,project(llvm-libgcc LANGUAGES C CXX ASM)is not added.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
compiler-rt does have it, and I'd prefer to keep this regardless.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now
llvm-libgccuse the same approach ascompiler-rtin 60eccd0.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not following what you mean, sorry. Since this is the driver for compiler-rt and libunwind, it makes sense to me for this project to indicate this information.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
compiler-rt/CMakeLists.txtdetects whethercompiler-rtis built as a subproject ofruntimesor a standalone project. In standalone mode it sets options to detectllvmand declares the project name withproject(CompilerRT C CXX ASM).Now
llvm-libgcc/CMakeLists.txtdoes the same: in standalone mode, it tells addedcompiler-rtthat we are not built as a subproject ofruntimesand we have to detectllvmourselves.Here "standalone" means
cmake -B build -S compiler-rtorcmake -B build -S llvm-libgcc, notcmake -B build -S runtimesnorcmake -B build -S llvm. Even in the wholellvm-projectsource tree, directly usingcompiler-rt/CMakeLists.txtorllvm-libgcc/CMakeLists.txtis "standalone".If included by other
CMakeLists.txt,runtimes/CMakeLists.txtfor example, it does not matter whether there is aproject(CompilerRT C CXX ASM)orproject(llvm-libgcc LANGUAGES C CXX ASM)declaration actually performed. To keep consistent withcompiler-rt,llvm-libgcc/CMakeLists.txtis adjusted correspondingly in 60eccd0.Correspondingly lines from
compiler-rt/CMakeLists.txt:Correspondingly lines in
llvm-libgcc/CMakeLists.txt:And I am a bit confused how should we indicate "this is the driver for
compiler-rtandlibunwind". It is completely acceptable to performproject(llvm-libgcc LANGUAGES C CXX ASM)declaration unconditionally, but does it makes sense in this scenario?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Understood, thanks for highlighting the change to llvm-libgcc/CMakeLists.txt, which I'd missed.