diff --git a/libunwind/cmake/config-ix.cmake b/libunwind/cmake/config-ix.cmake --- a/libunwind/cmake/config-ix.cmake +++ b/libunwind/cmake/config-ix.cmake @@ -16,6 +16,25 @@ endif () endif() +# The compiler driver may be implicitly trying to link against libunwind, +# which obviously might not work when building libunwind itself. Try to +# check if -unwindlib=none is supported, and use that if possible. +# +# However, a plain check_c_compiler_flag(-unwindlib=none) would also fail, as +# the tested flag is only added to the compilation command (letting the +# compiler error out if it is unsupported), but not included in the linking +# command (which still fails due to implicitly trying to link against the +# possibly missing libunwind). Therefore, we must add it directly to +# CMAKE_REQUIRED_FLAGS (which is included both when compiling and linking), +# then do a dummy test with check_c_compiler_flag, and revert the change to +# CMAKE_REQUIRED_FLAGS if it didn't work out. +set(CMAKE_REQUIRED_FLAGS_ORIG "${CMAKE_REQUIRED_FLAGS}") +set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -unwindlib=none") +check_c_compiler_flag("" LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG) +if (NOT LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_ORIG}") +endif() + # libunwind is using -nostdlib++ at the link step when available, # otherwise -nodefaultlibs is used. We want all our checks to also # use one of these options, otherwise we may end up with an inconsistency between diff --git a/libunwind/src/CMakeLists.txt b/libunwind/src/CMakeLists.txt --- a/libunwind/src/CMakeLists.txt +++ b/libunwind/src/CMakeLists.txt @@ -83,6 +83,7 @@ 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()