diff options
author | Martin Storsjö <martin@martin.st> | 2021-09-10 22:14:48 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2021-11-05 10:10:19 +0200 |
commit | 7af584ed87cc6eddb6adbc451c90fb8867469e06 (patch) | |
tree | d1b391c4987f1d6f9293b1e5a32b435fce34a83f /libunwind | |
parent | 7e34d5ead17563a2aa734b8adcc0fcff5373aebb (diff) | |
download | llvm-7af584ed87cc6eddb6adbc451c90fb8867469e06.zip llvm-7af584ed87cc6eddb6adbc451c90fb8867469e06.tar.gz llvm-7af584ed87cc6eddb6adbc451c90fb8867469e06.tar.bz2 |
[libunwind] Try to add --unwindlib=none while configuring and building libunwind
If Clang is set up to link directly against libunwind (via the
--unwindlib option, or the corresponding builtin default option),
configuring libunwind will fail while bootstrapping (before the
initial libunwind is built), because every cmake test will
fail due to -lunwind not being found, and linking the shared library
will fail similarly.
Check if --unwindlib=none is supported, and add it in that case.
Using check_c_compiler_flag on its own doesn't work, because that only
adds the tested flag to the compilation command, and if -lunwind is
missing, the linking step would still fail - instead try adding it
to CMAKE_REQUIRED_FLAGS and restore the variable if it doesn't work.
This avoids having to pass --unwindlib=none while building libunwind.
Differential Revision: https://reviews.llvm.org/D112126
Diffstat (limited to 'libunwind')
-rw-r--r-- | libunwind/CMakeLists.txt | 15 | ||||
-rw-r--r-- | libunwind/cmake/config-ix.cmake | 13 | ||||
-rw-r--r-- | libunwind/src/CMakeLists.txt | 1 |
3 files changed, 26 insertions, 3 deletions
diff --git a/libunwind/CMakeLists.txt b/libunwind/CMakeLists.txt index f16d49a..bec0d1f 100644 --- a/libunwind/CMakeLists.txt +++ b/libunwind/CMakeLists.txt @@ -23,7 +23,11 @@ set(LIBUNWIND_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH "Specify path to libc++ source.") if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBUNWIND_STANDALONE_BUILD) - project(libunwind LANGUAGES C CXX ASM) + # We may have an incomplete toolchain - do language support tests without + # linking. + include(EnableLanguageNolink) + project(libunwind LANGUAGES NONE) + llvm_enable_language_nolink(C CXX ASM) set(PACKAGE_NAME libunwind) set(PACKAGE_VERSION 14.0.0git) @@ -179,6 +183,14 @@ include(HandleLibunwindFlags) # Get required flags. add_target_flags_if(LIBUNWIND_BUILD_32_BITS "-m32") +# Compiler tests may be failing if the compiler implicitly links in libunwind, +# which doesn't exist yet. This gets waived by --unwindlib=none +# later in config-ix below, but the tests for --target etc before that may +# be failing due to it. Only test compilation, not linking, for these +# tests here now. +set(CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG ${CMAKE_TRY_COMPILE_TARGET_TYPE}) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + if(LIBUNWIND_TARGET_TRIPLE) add_target_flags_if_supported("--target=${LIBUNWIND_TARGET_TRIPLE}") endif() @@ -188,6 +200,7 @@ endif() if(LIBUNWIND_SYSROOT) add_target_flags_if_supported("--sysroot=${LIBUNWIND_SYSROOT}") endif() +set(CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG}) # Configure compiler. include(config-ix) diff --git a/libunwind/cmake/config-ix.cmake b/libunwind/cmake/config-ix.cmake index 78f116c..ec10733 100644 --- a/libunwind/cmake/config-ix.cmake +++ b/libunwind/cmake/config-ix.cmake @@ -2,9 +2,18 @@ include(CMakePushCheckState) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) include(CheckLibraryExists) +include(CheckLinkerFlag) include(CheckSymbolExists) include(CheckCSourceCompiles) +# The compiler driver may be implicitly trying to link against libunwind, which +# might not work if libunwind doesn't exist yet. Try to check if +# --unwindlib=none is supported, and use that if possible. +llvm_check_linker_flag("--unwindlib=none" LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG) +if (LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --unwindlib=none") +endif() + check_library_exists(c fopen "" LIBUNWIND_HAS_C_LIB) if (NOT LIBUNWIND_USE_COMPILER_RT) @@ -25,11 +34,11 @@ endif() # required for the link to go through. We remove sanitizers from the # configuration checks to avoid spurious link errors. -check_c_compiler_flag(-nostdlib++ LIBUNWIND_SUPPORTS_NOSTDLIBXX_FLAG) +llvm_check_linker_flag(-nostdlib++ LIBUNWIND_SUPPORTS_NOSTDLIBXX_FLAG) if (LIBUNWIND_SUPPORTS_NOSTDLIBXX_FLAG) set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nostdlib++") else() - check_c_compiler_flag(-nodefaultlibs LIBUNWIND_SUPPORTS_NODEFAULTLIBS_FLAG) + llvm_check_linker_flag(-nodefaultlibs LIBUNWIND_SUPPORTS_NODEFAULTLIBS_FLAG) if (LIBUNWIND_SUPPORTS_NODEFAULTLIBS_FLAG) set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs") endif() diff --git a/libunwind/src/CMakeLists.txt b/libunwind/src/CMakeLists.txt index ce3217f..3b20e97 100644 --- a/libunwind/src/CMakeLists.txt +++ b/libunwind/src/CMakeLists.txt @@ -83,6 +83,7 @@ if (LIBUNWIND_ENABLE_THREADS) endif() # Setup flags. +add_link_flags_if(LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none) if (LIBUNWIND_SUPPORTS_NOSTDLIBXX_FLAG) add_link_flags_if_supported(-nostdlib++) else() |