summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2021-09-10 22:14:48 +0300
committerMartin Storsjö <martin@martin.st>2021-11-05 10:10:19 +0200
commit7af584ed87cc6eddb6adbc451c90fb8867469e06 (patch)
treed1b391c4987f1d6f9293b1e5a32b435fce34a83f /cmake
parent7e34d5ead17563a2aa734b8adcc0fcff5373aebb (diff)
downloadllvm-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.cmake17
-rw-r--r--cmake/Modules/EnableLanguageNolink.cmake11
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()