xref: /openbsd-src/gnu/llvm/libcxx/cmake/config-ix.cmake (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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