1*4d6fc14bSjoerginclude(CMakePushCheckState) 2*4d6fc14bSjoerginclude(CheckLibraryExists) 3*4d6fc14bSjoerginclude(CheckCCompilerFlag) 4*4d6fc14bSjoerginclude(CheckCXXCompilerFlag) 5*4d6fc14bSjoerginclude(CheckCSourceCompiles) 6*4d6fc14bSjoerg 7*4d6fc14bSjoergif(WIN32 AND NOT MINGW) 8*4d6fc14bSjoerg # NOTE(compnerd) this is technically a lie, there is msvcrt, but for now, lets 9*4d6fc14bSjoerg # let the default linking take care of that. 10*4d6fc14bSjoerg set(LIBCXX_HAS_C_LIB NO) 11*4d6fc14bSjoergelse() 12*4d6fc14bSjoerg check_library_exists(c fopen "" LIBCXX_HAS_C_LIB) 13*4d6fc14bSjoergendif() 14*4d6fc14bSjoerg 15*4d6fc14bSjoergif (NOT LIBCXX_USE_COMPILER_RT) 16*4d6fc14bSjoerg if(WIN32 AND NOT MINGW) 17*4d6fc14bSjoerg set(LIBCXX_HAS_GCC_S_LIB NO) 18*4d6fc14bSjoerg else() 19*4d6fc14bSjoerg if(ANDROID) 20*4d6fc14bSjoerg check_library_exists(gcc __gcc_personality_v0 "" LIBCXX_HAS_GCC_LIB) 21*4d6fc14bSjoerg else() 22*4d6fc14bSjoerg check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB) 23*4d6fc14bSjoerg endif() 24*4d6fc14bSjoerg endif() 25*4d6fc14bSjoergendif() 26*4d6fc14bSjoerg 27*4d6fc14bSjoerg# libc++ is using -nostdlib++ at the link step when available, 28*4d6fc14bSjoerg# otherwise -nodefaultlibs is used. We want all our checks to also 29*4d6fc14bSjoerg# use one of these options, otherwise we may end up with an inconsistency between 30*4d6fc14bSjoerg# the flags we think we require during configuration (if the checks are 31*4d6fc14bSjoerg# performed without one of those options) and the flags that are actually 32*4d6fc14bSjoerg# required during compilation (which has the -nostdlib++ or -nodefaultlibs). libc is 33*4d6fc14bSjoerg# required for the link to go through. We remove sanitizers from the 34*4d6fc14bSjoerg# configuration checks to avoid spurious link errors. 35*4d6fc14bSjoerg 36*4d6fc14bSjoergcheck_c_compiler_flag(-nostdlib++ LIBCXX_SUPPORTS_NOSTDLIBXX_FLAG) 37*4d6fc14bSjoergif (LIBCXX_SUPPORTS_NOSTDLIBXX_FLAG) 38*4d6fc14bSjoerg set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nostdlib++") 39*4d6fc14bSjoergelse() 40*4d6fc14bSjoerg check_c_compiler_flag(-nodefaultlibs LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG) 41*4d6fc14bSjoerg if (LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG) 42*4d6fc14bSjoerg set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs") 43*4d6fc14bSjoerg endif() 44*4d6fc14bSjoergendif() 45*4d6fc14bSjoerg 46*4d6fc14bSjoergif (LIBCXX_SUPPORTS_NOSTDLIBXX_FLAG OR LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG) 47*4d6fc14bSjoerg if (LIBCXX_HAS_C_LIB) 48*4d6fc14bSjoerg list(APPEND CMAKE_REQUIRED_LIBRARIES c) 49*4d6fc14bSjoerg endif () 50*4d6fc14bSjoerg if (LIBCXX_USE_COMPILER_RT) 51*4d6fc14bSjoerg list(APPEND CMAKE_REQUIRED_FLAGS -rtlib=compiler-rt) 52*4d6fc14bSjoerg find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY) 53*4d6fc14bSjoerg list(APPEND CMAKE_REQUIRED_LIBRARIES "${LIBCXX_BUILTINS_LIBRARY}") 54*4d6fc14bSjoerg elseif (LIBCXX_HAS_GCC_LIB) 55*4d6fc14bSjoerg list(APPEND CMAKE_REQUIRED_LIBRARIES gcc) 56*4d6fc14bSjoerg elseif (LIBCXX_HAS_GCC_S_LIB) 57*4d6fc14bSjoerg list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s) 58*4d6fc14bSjoerg endif () 59*4d6fc14bSjoerg if (MINGW) 60*4d6fc14bSjoerg # Mingw64 requires quite a few "C" runtime libraries in order for basic 61*4d6fc14bSjoerg # programs to link successfully with -nodefaultlibs. 62*4d6fc14bSjoerg if (LIBCXX_USE_COMPILER_RT) 63*4d6fc14bSjoerg set(MINGW_RUNTIME ${LIBCXX_BUILTINS_LIBRARY}) 64*4d6fc14bSjoerg else () 65*4d6fc14bSjoerg set(MINGW_RUNTIME gcc_s gcc) 66*4d6fc14bSjoerg endif() 67*4d6fc14bSjoerg set(MINGW_LIBRARIES mingw32 ${MINGW_RUNTIME} moldname mingwex msvcrt advapi32 68*4d6fc14bSjoerg shell32 user32 kernel32 mingw32 ${MINGW_RUNTIME} 69*4d6fc14bSjoerg moldname mingwex msvcrt) 70*4d6fc14bSjoerg list(APPEND CMAKE_REQUIRED_LIBRARIES ${MINGW_LIBRARIES}) 71*4d6fc14bSjoerg endif() 72*4d6fc14bSjoerg if (CMAKE_C_FLAGS MATCHES -fsanitize OR CMAKE_CXX_FLAGS MATCHES -fsanitize) 73*4d6fc14bSjoerg set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all") 74*4d6fc14bSjoerg endif () 75*4d6fc14bSjoerg if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage) 76*4d6fc14bSjoerg set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters") 77*4d6fc14bSjoerg endif () 78*4d6fc14bSjoergendif () 79*4d6fc14bSjoerg 80*4d6fc14bSjoerg# Check compiler pragmas 81*4d6fc14bSjoergif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") 82*4d6fc14bSjoerg cmake_push_check_state() 83*4d6fc14bSjoerg set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror=unknown-pragmas") 84*4d6fc14bSjoerg check_c_source_compiles(" 85*4d6fc14bSjoerg#pragma comment(lib, \"c\") 86*4d6fc14bSjoergint main() { return 0; } 87*4d6fc14bSjoerg" LIBCXX_HAS_COMMENT_LIB_PRAGMA) 88*4d6fc14bSjoerg cmake_pop_check_state() 89*4d6fc14bSjoergendif() 90*4d6fc14bSjoerg 91*4d6fc14bSjoerg# Check libraries 92*4d6fc14bSjoergif(WIN32 AND NOT MINGW) 93*4d6fc14bSjoerg # TODO(compnerd) do we want to support an emulation layer that allows for the 94*4d6fc14bSjoerg # use of pthread-win32 or similar libraries to emulate pthreads on Windows? 95*4d6fc14bSjoerg set(LIBCXX_HAS_PTHREAD_LIB NO) 96*4d6fc14bSjoerg set(LIBCXX_HAS_M_LIB NO) 97*4d6fc14bSjoerg set(LIBCXX_HAS_RT_LIB NO) 98*4d6fc14bSjoerg set(LIBCXX_HAS_SYSTEM_LIB NO) 99*4d6fc14bSjoerg set(LIBCXX_HAS_ATOMIC_LIB NO) 100*4d6fc14bSjoergelseif(APPLE) 101*4d6fc14bSjoerg check_library_exists(System write "" LIBCXX_HAS_SYSTEM_LIB) 102*4d6fc14bSjoerg set(LIBCXX_HAS_PTHREAD_LIB NO) 103*4d6fc14bSjoerg set(LIBCXX_HAS_M_LIB NO) 104*4d6fc14bSjoerg set(LIBCXX_HAS_RT_LIB NO) 105*4d6fc14bSjoerg set(LIBCXX_HAS_ATOMIC_LIB NO) 106*4d6fc14bSjoergelseif(FUCHSIA) 107*4d6fc14bSjoerg set(LIBCXX_HAS_M_LIB NO) 108*4d6fc14bSjoerg set(LIBCXX_HAS_PTHREAD_LIB NO) 109*4d6fc14bSjoerg set(LIBCXX_HAS_RT_LIB NO) 110*4d6fc14bSjoerg set(LIBCXX_HAS_SYSTEM_LIB NO) 111*4d6fc14bSjoerg check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB) 112*4d6fc14bSjoergelse() 113*4d6fc14bSjoerg check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB) 114*4d6fc14bSjoerg check_library_exists(m ccos "" LIBCXX_HAS_M_LIB) 115*4d6fc14bSjoerg check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB) 116*4d6fc14bSjoerg set(LIBCXX_HAS_SYSTEM_LIB NO) 117*4d6fc14bSjoerg check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB) 118*4d6fc14bSjoergendif() 119