146035553Spatrickinclude(CMakePushCheckState) 246035553Spatrickinclude(CheckLibraryExists) 3*4bdff4beSrobertinclude(LLVMCheckCompilerLinkerFlag) 446035553Spatrickinclude(CheckCCompilerFlag) 546035553Spatrickinclude(CheckCXXCompilerFlag) 646035553Spatrickinclude(CheckCSourceCompiles) 746035553Spatrick 8*4bdff4beSrobert# The compiler driver may be implicitly trying to link against libunwind. 9*4bdff4beSrobert# This is normally ok (libcxx relies on an unwinder), but if libunwind is 10*4bdff4beSrobert# built in the same cmake invocation as libcxx and we've got 11*4bdff4beSrobert# LIBCXXABI_USE_LLVM_UNWINDER set, we'd be linking against the just-built 12*4bdff4beSrobert# libunwind (and the compiler implicit -lunwind wouldn't succeed as the newly 13*4bdff4beSrobert# built libunwind isn't installed yet). For those cases, it'd be good to 14*4bdff4beSrobert# link with --uwnindlib=none. Check if that option works. 15*4bdff4beSrobertllvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG) 16*4bdff4beSrobert 1746035553Spatrickif(WIN32 AND NOT MINGW) 1846035553Spatrick # NOTE(compnerd) this is technically a lie, there is msvcrt, but for now, lets 1946035553Spatrick # let the default linking take care of that. 2046035553Spatrick set(LIBCXX_HAS_C_LIB NO) 2146035553Spatrickelse() 2246035553Spatrick check_library_exists(c fopen "" LIBCXX_HAS_C_LIB) 2346035553Spatrickendif() 2446035553Spatrick 2546035553Spatrickif (NOT LIBCXX_USE_COMPILER_RT) 2646035553Spatrick if(WIN32 AND NOT MINGW) 2746035553Spatrick set(LIBCXX_HAS_GCC_S_LIB NO) 2846035553Spatrick else() 29037e7968Spatrick if(ANDROID) 30037e7968Spatrick check_library_exists(gcc __gcc_personality_v0 "" LIBCXX_HAS_GCC_LIB) 31037e7968Spatrick else() 3246035553Spatrick check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB) 3346035553Spatrick endif() 3446035553Spatrick endif() 35037e7968Spatrickendif() 3646035553Spatrick 3776d0caaeSpatrick# libc++ is using -nostdlib++ at the link step when available, 3876d0caaeSpatrick# otherwise -nodefaultlibs is used. We want all our checks to also 3976d0caaeSpatrick# use one of these options, otherwise we may end up with an inconsistency between 4046035553Spatrick# the flags we think we require during configuration (if the checks are 4176d0caaeSpatrick# performed without one of those options) and the flags that are actually 4276d0caaeSpatrick# required during compilation (which has the -nostdlib++ or -nodefaultlibs). libc is 4346035553Spatrick# required for the link to go through. We remove sanitizers from the 4446035553Spatrick# configuration checks to avoid spurious link errors. 4576d0caaeSpatrick 46*4bdff4beSrobertcheck_cxx_compiler_flag(-nostdlib++ CXX_SUPPORTS_NOSTDLIBXX_FLAG) 47*4bdff4beSrobertif (CXX_SUPPORTS_NOSTDLIBXX_FLAG) 4876d0caaeSpatrick set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nostdlib++") 4976d0caaeSpatrickelse() 50*4bdff4beSrobert check_c_compiler_flag(-nodefaultlibs C_SUPPORTS_NODEFAULTLIBS_FLAG) 51*4bdff4beSrobert if (C_SUPPORTS_NODEFAULTLIBS_FLAG) 5246035553Spatrick set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs") 5376d0caaeSpatrick endif() 5476d0caaeSpatrickendif() 5576d0caaeSpatrick 56*4bdff4beSrobertif (CXX_SUPPORTS_NOSTDLIBXX_FLAG OR C_SUPPORTS_NODEFAULTLIBS_FLAG) 5746035553Spatrick if (LIBCXX_HAS_C_LIB) 5846035553Spatrick list(APPEND CMAKE_REQUIRED_LIBRARIES c) 5946035553Spatrick endif () 6046035553Spatrick if (LIBCXX_USE_COMPILER_RT) 61*4bdff4beSrobert include(HandleCompilerRT) 62*4bdff4beSrobert find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY 63*4bdff4beSrobert FLAGS ${LIBCXX_COMPILE_FLAGS}) 64*4bdff4beSrobert if (LIBCXX_BUILTINS_LIBRARY) 6546035553Spatrick list(APPEND CMAKE_REQUIRED_LIBRARIES "${LIBCXX_BUILTINS_LIBRARY}") 66*4bdff4beSrobert else() 67*4bdff4beSrobert message(WARNING "Could not find builtins library from libc++") 68*4bdff4beSrobert endif() 69037e7968Spatrick elseif (LIBCXX_HAS_GCC_LIB) 70037e7968Spatrick list(APPEND CMAKE_REQUIRED_LIBRARIES gcc) 7146035553Spatrick elseif (LIBCXX_HAS_GCC_S_LIB) 7246035553Spatrick list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s) 7346035553Spatrick endif () 7446035553Spatrick if (MINGW) 7546035553Spatrick # Mingw64 requires quite a few "C" runtime libraries in order for basic 7646035553Spatrick # programs to link successfully with -nodefaultlibs. 7746035553Spatrick if (LIBCXX_USE_COMPILER_RT) 7846035553Spatrick set(MINGW_RUNTIME ${LIBCXX_BUILTINS_LIBRARY}) 7946035553Spatrick else () 8046035553Spatrick set(MINGW_RUNTIME gcc_s gcc) 8146035553Spatrick endif() 8246035553Spatrick set(MINGW_LIBRARIES mingw32 ${MINGW_RUNTIME} moldname mingwex msvcrt advapi32 8346035553Spatrick shell32 user32 kernel32 mingw32 ${MINGW_RUNTIME} 8446035553Spatrick moldname mingwex msvcrt) 8546035553Spatrick list(APPEND CMAKE_REQUIRED_LIBRARIES ${MINGW_LIBRARIES}) 8646035553Spatrick endif() 8746035553Spatrick if (CMAKE_C_FLAGS MATCHES -fsanitize OR CMAKE_CXX_FLAGS MATCHES -fsanitize) 8846035553Spatrick set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all") 8946035553Spatrick endif () 9046035553Spatrick if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage) 91*4bdff4beSrobert set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fsanitize-coverage=0") 9246035553Spatrick endif () 9346035553Spatrickendif () 9446035553Spatrick 9546035553Spatrick# Check compiler pragmas 9646035553Spatrickif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") 9746035553Spatrick cmake_push_check_state() 9846035553Spatrick set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror=unknown-pragmas") 9946035553Spatrick check_c_source_compiles(" 10046035553Spatrick#pragma comment(lib, \"c\") 101*4bdff4beSrobertint main(void) { return 0; } 102*4bdff4beSrobert" C_SUPPORTS_COMMENT_LIB_PRAGMA) 10346035553Spatrick cmake_pop_check_state() 10446035553Spatrickendif() 10546035553Spatrick 10646035553Spatrick# Check libraries 10746035553Spatrickif(WIN32 AND NOT MINGW) 10846035553Spatrick # TODO(compnerd) do we want to support an emulation layer that allows for the 10946035553Spatrick # use of pthread-win32 or similar libraries to emulate pthreads on Windows? 11046035553Spatrick set(LIBCXX_HAS_PTHREAD_LIB NO) 11146035553Spatrick set(LIBCXX_HAS_M_LIB NO) 11246035553Spatrick set(LIBCXX_HAS_RT_LIB NO) 11346035553Spatrick set(LIBCXX_HAS_SYSTEM_LIB NO) 114037e7968Spatrick set(LIBCXX_HAS_ATOMIC_LIB NO) 11546035553Spatrickelseif(APPLE) 11646035553Spatrick check_library_exists(System write "" LIBCXX_HAS_SYSTEM_LIB) 11746035553Spatrick set(LIBCXX_HAS_PTHREAD_LIB NO) 11846035553Spatrick set(LIBCXX_HAS_M_LIB NO) 11946035553Spatrick set(LIBCXX_HAS_RT_LIB NO) 120037e7968Spatrick set(LIBCXX_HAS_ATOMIC_LIB NO) 12146035553Spatrickelseif(FUCHSIA) 12246035553Spatrick set(LIBCXX_HAS_M_LIB NO) 12346035553Spatrick set(LIBCXX_HAS_PTHREAD_LIB NO) 12446035553Spatrick set(LIBCXX_HAS_RT_LIB NO) 12546035553Spatrick set(LIBCXX_HAS_SYSTEM_LIB NO) 126037e7968Spatrick check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB) 12746035553Spatrickelse() 12846035553Spatrick check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB) 12946035553Spatrick check_library_exists(m ccos "" LIBCXX_HAS_M_LIB) 13046035553Spatrick check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB) 13146035553Spatrick set(LIBCXX_HAS_SYSTEM_LIB NO) 132037e7968Spatrick check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB) 13346035553Spatrickendif() 134