xref: /netbsd-src/external/apache2/llvm/dist/libcxx/cmake/config-ix.cmake (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
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