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 /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 'cmake')
-rw-r--r-- | cmake/Modules/CheckLinkerFlag.cmake | 17 | ||||
-rw-r--r-- | cmake/Modules/EnableLanguageNolink.cmake | 11 |
2 files changed, 28 insertions, 0 deletions
diff --git a/cmake/Modules/CheckLinkerFlag.cmake b/cmake/Modules/CheckLinkerFlag.cmake new file mode 100644 index 000000000000..722fe5b1b8ea --- /dev/null +++ b/cmake/Modules/CheckLinkerFlag.cmake @@ -0,0 +1,17 @@ +include(CMakePushCheckState) +include(CheckCCompilerFlag) + +function(llvm_check_linker_flag flag dest) + # If testing a flag with check_c_compiler_flag, it gets added to the compile + # command only, but not to the linker command in that test. If the flag + # is vital for linking to succeed, the test would fail even if it would + # have succeeded if it was included on both commands. + # + # Therefore, try adding the flag to CMAKE_REQUIRED_FLAGS, which gets + # added to both compiling and linking commands in the tests. + + cmake_push_check_state() + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}") + check_c_compiler_flag("" ${dest}) + cmake_pop_check_state() +endfunction() diff --git a/cmake/Modules/EnableLanguageNolink.cmake b/cmake/Modules/EnableLanguageNolink.cmake new file mode 100644 index 000000000000..18668c6d0476 --- /dev/null +++ b/cmake/Modules/EnableLanguageNolink.cmake @@ -0,0 +1,11 @@ +macro(llvm_enable_language_nolink) + # Set CMAKE_TRY_COMPILE_TARGET_TYPE to STATIC_LIBRARY to disable linking + # in the compiler sanity checks. When bootstrapping the toolchain, + # the toolchain itself is still incomplete and sanity checks that include + # linking may fail. + set(__SAVED_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE}) + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + enable_language(${ARGV}) + set(CMAKE_TRY_COMPILE_TARGET_TYPE ${__SAVED_TRY_COMPILE_TARGET_TYPE}) + unset(__SAVED_TRY_COMPILE_TARGET_TYPE) +endmacro() |