mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-03 01:56:07 +00:00

We add `--unwindlib=none` to `CMAKE_REQUIRED_FLAGS` to make sure that builds with a yet-incomplete toolchain succeed, to avoid linker failures about missing unwindlib. When this option is added to `CMAKE_REQUIRED_FLAGS`, it gets added to both compile and link commands in CMake compile tests. If `--unwindlib=none` is included in compilation commands, it causes warnings about unused arguments, as the flag only is relevant for linking. Due to the warnings in CMake tests, the later CMake test for the `-Werror` option failed (as the tested `-Werror` option caused the preexisting warning due to unused `--unwindlib=none` to become a hard error). Therefore, most CI configurations that build with `LIBCXX_ENABLE_WERROR` didn't actually end up enabling `-Werror` after all. When looking at the CI build log of recent CI builds, they do end up printing: -- Performing Test LIBCXX_SUPPORTS_WERROR_FLAG -- Performing Test LIBCXX_SUPPORTS_WERROR_FLAG - Failed -- Performing Test LIBCXX_SUPPORTS_WX_FLAG -- Performing Test LIBCXX_SUPPORTS_WX_FLAG - Failed Thus while the configurations are meant to error out on warnings, they actually haven't done that, due to the interaction of these options. To fix this, remove the individual cases of adding `--unwindlib=none` into `CMAKE_REQUIRED_FLAGS` in libcxx and libunwind. `runtimes/CMakeLists.txt` still adds `--unwindlib=none` if needed, but not otherwise. (The same issue with enabling `-Werror` does remain if `--unwindlib=none` strictly is needed though - that can be fixed separately afterwards.) These individual cases in libunwind and libcxx were added while standalone builds of the runtimes still were supported - but no longer are necessary now. Differential Revision: https://reviews.llvm.org/D124375
130 lines
5.0 KiB
CMake
130 lines
5.0 KiB
CMake
include(CMakePushCheckState)
|
|
include(CheckLibraryExists)
|
|
include(LLVMCheckCompilerLinkerFlag)
|
|
include(CheckCCompilerFlag)
|
|
include(CheckCXXCompilerFlag)
|
|
include(CheckCSourceCompiles)
|
|
|
|
# The compiler driver may be implicitly trying to link against libunwind.
|
|
# This is normally ok (libcxx relies on an unwinder), but if libunwind is
|
|
# built in the same cmake invocation as libcxx and we've got
|
|
# LIBCXXABI_USE_LLVM_UNWINDER set, we'd be linking against the just-built
|
|
# libunwind (and the compiler implicit -lunwind wouldn't succeed as the newly
|
|
# built libunwind isn't installed yet). For those cases, it'd be good to
|
|
# link with --uwnindlib=none. Check if that option works.
|
|
llvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
|
|
|
if(WIN32 AND NOT MINGW)
|
|
# NOTE(compnerd) this is technically a lie, there is msvcrt, but for now, lets
|
|
# let the default linking take care of that.
|
|
set(LIBCXX_HAS_C_LIB NO)
|
|
else()
|
|
check_library_exists(c fopen "" LIBCXX_HAS_C_LIB)
|
|
endif()
|
|
|
|
if (NOT LIBCXX_USE_COMPILER_RT)
|
|
if(WIN32 AND NOT MINGW)
|
|
set(LIBCXX_HAS_GCC_S_LIB NO)
|
|
else()
|
|
if(ANDROID)
|
|
check_library_exists(gcc __gcc_personality_v0 "" LIBCXX_HAS_GCC_LIB)
|
|
else()
|
|
check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# libc++ 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
|
|
# the flags we think we require during configuration (if the checks are
|
|
# performed without one of those options) and the flags that are actually
|
|
# required during compilation (which has the -nostdlib++ or -nodefaultlibs). libc is
|
|
# required for the link to go through. We remove sanitizers from the
|
|
# configuration checks to avoid spurious link errors.
|
|
|
|
check_cxx_compiler_flag(-nostdlib++ CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
|
if (CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nostdlib++")
|
|
else()
|
|
check_c_compiler_flag(-nodefaultlibs C_SUPPORTS_NODEFAULTLIBS_FLAG)
|
|
if (C_SUPPORTS_NODEFAULTLIBS_FLAG)
|
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs")
|
|
endif()
|
|
endif()
|
|
|
|
if (CXX_SUPPORTS_NOSTDLIBXX_FLAG OR C_SUPPORTS_NODEFAULTLIBS_FLAG)
|
|
if (LIBCXX_HAS_C_LIB)
|
|
list(APPEND CMAKE_REQUIRED_LIBRARIES c)
|
|
endif ()
|
|
if (LIBCXX_USE_COMPILER_RT)
|
|
include(HandleCompilerRT)
|
|
find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY
|
|
FLAGS ${LIBCXX_COMPILE_FLAGS})
|
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "${LIBCXX_BUILTINS_LIBRARY}")
|
|
elseif (LIBCXX_HAS_GCC_LIB)
|
|
list(APPEND CMAKE_REQUIRED_LIBRARIES gcc)
|
|
elseif (LIBCXX_HAS_GCC_S_LIB)
|
|
list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s)
|
|
endif ()
|
|
if (MINGW)
|
|
# Mingw64 requires quite a few "C" runtime libraries in order for basic
|
|
# programs to link successfully with -nodefaultlibs.
|
|
if (LIBCXX_USE_COMPILER_RT)
|
|
set(MINGW_RUNTIME ${LIBCXX_BUILTINS_LIBRARY})
|
|
else ()
|
|
set(MINGW_RUNTIME gcc_s gcc)
|
|
endif()
|
|
set(MINGW_LIBRARIES mingw32 ${MINGW_RUNTIME} moldname mingwex msvcrt advapi32
|
|
shell32 user32 kernel32 mingw32 ${MINGW_RUNTIME}
|
|
moldname mingwex msvcrt)
|
|
list(APPEND CMAKE_REQUIRED_LIBRARIES ${MINGW_LIBRARIES})
|
|
endif()
|
|
if (CMAKE_C_FLAGS MATCHES -fsanitize OR CMAKE_CXX_FLAGS MATCHES -fsanitize)
|
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all")
|
|
endif ()
|
|
if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage)
|
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fsanitize-coverage=0")
|
|
endif ()
|
|
endif ()
|
|
|
|
# Check compiler pragmas
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
cmake_push_check_state()
|
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror=unknown-pragmas")
|
|
check_c_source_compiles("
|
|
#pragma comment(lib, \"c\")
|
|
int main() { return 0; }
|
|
" C_SUPPORTS_COMMENT_LIB_PRAGMA)
|
|
cmake_pop_check_state()
|
|
endif()
|
|
|
|
# Check libraries
|
|
if(WIN32 AND NOT MINGW)
|
|
# TODO(compnerd) do we want to support an emulation layer that allows for the
|
|
# use of pthread-win32 or similar libraries to emulate pthreads on Windows?
|
|
set(LIBCXX_HAS_PTHREAD_LIB NO)
|
|
set(LIBCXX_HAS_M_LIB NO)
|
|
set(LIBCXX_HAS_RT_LIB NO)
|
|
set(LIBCXX_HAS_SYSTEM_LIB NO)
|
|
set(LIBCXX_HAS_ATOMIC_LIB NO)
|
|
elseif(APPLE)
|
|
check_library_exists(System write "" LIBCXX_HAS_SYSTEM_LIB)
|
|
set(LIBCXX_HAS_PTHREAD_LIB NO)
|
|
set(LIBCXX_HAS_M_LIB NO)
|
|
set(LIBCXX_HAS_RT_LIB NO)
|
|
set(LIBCXX_HAS_ATOMIC_LIB NO)
|
|
elseif(FUCHSIA)
|
|
set(LIBCXX_HAS_M_LIB NO)
|
|
set(LIBCXX_HAS_PTHREAD_LIB NO)
|
|
set(LIBCXX_HAS_RT_LIB NO)
|
|
set(LIBCXX_HAS_SYSTEM_LIB NO)
|
|
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
|
|
else()
|
|
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
|
|
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
|
|
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
|
|
set(LIBCXX_HAS_SYSTEM_LIB NO)
|
|
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
|
|
endif()
|