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/cmake | |
parent | 7e34d5ead17563a2aa734b8adcc0fcff5373aebb (diff) | |
download | llvm-7af584ed87cc6eddb6adbc451c90fb8867469e06.tar.gz |
[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/cmake')
-rw-r--r-- | libunwind/cmake/config-ix.cmake | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/libunwind/cmake/config-ix.cmake b/libunwind/cmake/config-ix.cmake index 78f116c15e0a..ec1073395859 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() |