diff --git a/libunwind/CMakeLists.txt b/libunwind/CMakeLists.txt --- a/libunwind/CMakeLists.txt +++ b/libunwind/CMakeLists.txt @@ -171,6 +171,13 @@ # Get required flags. add_target_flags_if(LIBUNWIND_BUILD_32_BITS "-m32") +# Compiler tests may be failing if the compiler tries to link in the libunwind +# that we're about to build. This gets waived by -unwindlib=none later in +# config-ix below, but the tests for --target etc below 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() @@ -180,6 +187,7 @@ 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 --- a/libunwind/cmake/config-ix.cmake +++ b/libunwind/cmake/config-ix.cmake @@ -5,6 +5,27 @@ include(CheckSymbolExists) include(CheckCSourceCompiles) +# 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. +# (Note, this does succeed for GCC too, where it's treated as the linker +# flag "-u windlib=none", which should be harmless in practice.) +# +# 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() + check_library_exists(c fopen "" LIBUNWIND_HAS_C_LIB) if (NOT LIBUNWIND_USE_COMPILER_RT) 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()