diff --git a/libunwind/CMakeLists.txt b/libunwind/CMakeLists.txt --- a/libunwind/CMakeLists.txt +++ b/libunwind/CMakeLists.txt @@ -21,7 +21,12 @@ "Specify path to libc++ source.") if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBUNWIND_STANDALONE_BUILD) + # We may have an incomplete toolchain - skip linking testing when doing + # compiler sanity checks and ABI inspections. + set(CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG ${CMAKE_TRY_COMPILE_TARGET_TYPE}) + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) project(libunwind LANGUAGES C CXX ASM) + set(CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG}) set(PACKAGE_NAME libunwind) set(PACKAGE_VERSION 14.0.0git) @@ -171,6 +176,14 @@ # Get required flags. add_target_flags_if(LIBUNWIND_BUILD_32_BITS "-m32") +# Compiler tests may be failing if the compiler implicitly links in libunwind, +# which doesn't exist yet. This gets waived by --unwindlib=none +# later in config-ix below, but the tests for --target etc before that 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 +193,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,25 @@ 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. +# +# 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()