]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/CMakeLists.txt
Vendor import of libc++ release_39 branch r276489:
[FreeBSD/FreeBSD.git] / lib / CMakeLists.txt
1 set(LIBCXX_LIB_CMAKEFILES_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}"  PARENT_SCOPE)
2
3 # Get sources
4 file(GLOB LIBCXX_SOURCES ../src/*.cpp)
5 if(WIN32)
6   file(GLOB LIBCXX_WIN32_SOURCES ../src/support/win32/*.cpp)
7   list(APPEND LIBCXX_SOURCES ${LIBCXX_WIN32_SOURCES})
8 elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
9   file(GLOB LIBCXX_SOLARIS_SOURCES ../src/support/solaris/*.c)
10   list(APPEND LIBCXX_SOURCES ${LIBCXX_SOLARIS_SOURCES})
11 endif()
12
13 # Add all the headers to the project for IDEs.
14 if (LIBCXX_CONFIGURE_IDE)
15   file(GLOB_RECURSE LIBCXX_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/*)
16   if(WIN32)
17     file( GLOB LIBCXX_WIN32_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/support/win32/*.h)
18     list(APPEND LIBCXX_HEADERS ${LIBCXX_WIN32_HEADERS})
19   endif()
20   # Force them all into the headers dir on MSVC, otherwise they end up at
21   # project scope because they don't have extensions.
22   if (MSVC_IDE)
23     source_group("Header Files" FILES ${LIBCXX_HEADERS})
24   endif()
25 endif()
26
27 if(NOT LIBCXX_INSTALL_LIBRARY)
28   set(exclude_from_all EXCLUDE_FROM_ALL)
29 endif()
30
31 if (LIBCXX_ENABLE_SHARED)
32   add_library(cxx SHARED ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS})
33 else()
34   add_library(cxx STATIC ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS})
35 endif()
36
37 if (DEFINED LIBCXX_CXX_ABI_DEPS)
38   add_dependencies(cxx LIBCXX_CXX_ABI_DEPS)
39 endif()
40
41 #if LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path.
42 add_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}")
43
44 add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}")
45
46 add_library_flags_if(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "-Wl,--whole-archive" "-Wl,-Bstatic")
47 add_library_flags("${LIBCXX_CXX_ABI_LIBRARY}")
48 add_library_flags_if(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "-Wl,-Bdynamic" "-Wl,--no-whole-archive")
49
50 if (APPLE AND LLVM_USE_SANITIZER)
51   if ("${LLVM_USE_SANITIZER}" STREQUAL "Address")
52     set(LIBFILE "libclang_rt.asan_osx_dynamic.dylib")
53   elseif("${LLVM_USE_SANITIZER}" STREQUAL "Undefined")
54     set(LIBFILE "libclang_rt.ubsan_osx_dynamic.dylib")
55   else()
56     message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X")
57   endif()
58   if (LIBFILE)
59     execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=lib OUTPUT_VARIABLE LIBDIR RESULT_VARIABLE Result)
60     if (NOT ${Result} EQUAL "0")
61       message(FATAL "Failed to find library resource directory")
62     endif()
63     string(STRIP "${LIBDIR}" LIBDIR)
64     set(LIBDIR "${LIBDIR}/darwin/")
65     if (NOT IS_DIRECTORY "${LIBDIR}")
66       message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER")
67     endif()
68     set(LIBCXX_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}")
69     set(LIBCXX_SANITIZER_LIBRARY "${LIBCXX_SANITIZER_LIBRARY}" PARENT_SCOPE)
70     message(STATUS "Manually linking compiler-rt library: ${LIBCXX_SANITIZER_LIBRARY}")
71     add_library_flags("${LIBCXX_SANITIZER_LIBRARY}")
72     add_link_flags("-Wl,-rpath,${LIBDIR}")
73   endif()
74 endif()
75
76 # Generate library list.
77 add_library_flags_if(LIBCXX_HAS_PTHREAD_LIB pthread)
78 add_library_flags_if(LIBCXX_HAS_C_LIB c)
79 add_library_flags_if(LIBCXX_HAS_M_LIB m)
80 add_library_flags_if(LIBCXX_HAS_RT_LIB rt)
81 add_library_flags_if(LIBCXX_HAS_GCC_S_LIB gcc_s)
82 add_library_flags_if(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB atomic)
83
84 # Setup flags.
85 add_flags_if_supported(-fPIC)
86 add_link_flags_if_supported(-nodefaultlibs)
87
88 if ( APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR
89                 LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"))
90   if (NOT DEFINED LIBCXX_LIBCPPABI_VERSION)
91     set(LIBCXX_LIBCPPABI_VERSION "2") # Default value
92     execute_process(
93       COMMAND xcrun --show-sdk-version
94       OUTPUT_VARIABLE sdk_ver
95       RESULT_VARIABLE res
96       OUTPUT_STRIP_TRAILING_WHITESPACE)
97     if (res EQUAL 0)
98       message(STATUS "Found SDK version ${sdk_ver}")
99       string(REPLACE "10." "" sdk_ver "${sdk_ver}")
100       if (sdk_ver LESS 9)
101         set(LIBCXX_LIBCPPABI_VERSION "")
102       else()
103         set(LIBCXX_LIBCPPABI_VERSION "2")
104       endif()
105     endif()
106   endif()
107
108   if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" )
109     add_definitions(-D__STRICT_ANSI__)
110     add_link_flags(
111       "-compatibility_version 1"
112       "-current_version 1"
113       "-install_name /usr/lib/libc++.1.dylib"
114       "-Wl,-reexport_library,/usr/lib/libc++abi.dylib"
115       "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
116       "/usr/lib/libSystem.B.dylib")
117   else()
118     if ( ${CMAKE_OSX_SYSROOT} )
119       list(FIND ${CMAKE_OSX_ARCHITECTURES} "armv7" OSX_HAS_ARMV7)
120       if (OSX_HAS_ARMV7)
121         set(OSX_RE_EXPORT_LINE
122           "${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib"
123           "-Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++sjlj-abi.exp")
124       else()
125         set(OSX_RE_EXPORT_LINE
126           "-Wl,-reexport_library,${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib")
127       endif()
128     else()
129       set(OSX_RE_EXPORT_LINE "/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++abi${LIBCXX_LIBCPPABI_VERSION}.exp")
130     endif()
131
132     add_link_flags(
133       "-compatibility_version 1"
134       "-install_name /usr/lib/libc++.1.dylib"
135       "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
136       "${OSX_RE_EXPORT_LINE}"
137       "-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/notweak.exp"
138       "-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/weak.exp")
139   endif()
140 endif()
141
142 target_link_libraries(cxx ${LIBCXX_LIBRARIES})
143 split_list(LIBCXX_COMPILE_FLAGS)
144 split_list(LIBCXX_LINK_FLAGS)
145
146 set_target_properties(cxx
147   PROPERTIES
148     COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
149     LINK_FLAGS    "${LIBCXX_LINK_FLAGS}"
150     OUTPUT_NAME   "c++"
151     VERSION       "${LIBCXX_ABI_VERSION}.0"
152     SOVERSION     "${LIBCXX_ABI_VERSION}"
153   )
154
155 if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
156   file(GLOB LIBCXX_EXPERIMENTAL_SOURCES ../src/experimental/*.cpp)
157   if (LIBCXX_ENABLE_FILESYSTEM)
158     file(GLOB LIBCXX_FILESYSTEM_SOURCES ../src/experimental/filesystem/*.cpp)
159   endif()
160   add_library(cxx_experimental STATIC ${LIBCXX_EXPERIMENTAL_SOURCES} ${LIBCXX_FILESYSTEM_SOURCES})
161   target_link_libraries(cxx_experimental cxx)
162
163   set(experimental_flags "${LIBCXX_COMPILE_FLAGS}")
164   check_flag_supported(-std=c++14)
165   if (NOT MSVC AND LIBCXX_SUPPORTS_STD_EQ_CXX14_FLAG)
166     string(REPLACE "-std=c++11" "-std=c++14" experimental_flags "${LIBCXX_COMPILE_FLAGS}")
167   endif()
168   set_target_properties(cxx_experimental
169     PROPERTIES
170       COMPILE_FLAGS "${experimental_flags}"
171       OUTPUT_NAME   "c++experimental"
172   )
173 endif()
174
175 # Generate a linker script inplace of a libc++.so symlink. Rerun this command
176 # after cxx builds.
177 if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
178   # Get the name of the ABI library and handle the case where CXXABI_LIBNAME
179   # is a target name and not a library. Ex cxxabi_shared.
180   set(SCRIPT_ABI_LIBNAME "${LIBCXX_CXX_ABI_LIBRARY}")
181   if (SCRIPT_ABI_LIBNAME STREQUAL "cxxabi_shared")
182     set(SCRIPT_ABI_LIBNAME "c++abi")
183   endif()
184   # Generate a linker script inplace of a libc++.so symlink. Rerun this command
185   # after cxx builds.
186   add_custom_command(TARGET cxx POST_BUILD
187     COMMAND
188       ${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/gen_link_script/gen_link_script.py
189     ARGS
190       "$<TARGET_LINKER_FILE:cxx>"
191       "${SCRIPT_ABI_LIBNAME}"
192     WORKING_DIRECTORY ${LIBCXX_BUILD_DIR}
193   )
194 endif()
195
196 if (LIBCXX_INSTALL_LIBRARY)
197   if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY)
198     set(experimental_lib cxx_experimental)
199   endif()
200   install(TARGETS cxx ${experimental_lib}
201     LIBRARY DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT libcxx
202     ARCHIVE DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT libcxx
203     )
204   # NOTE: This install command must go after the cxx install command otherwise
205   # it will not be executed after the library symlinks are installed.
206   if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
207     # Replace the libc++ filename with $<TARGET_LINKER_FILE:cxx>
208     # after we required CMake 3.0.
209     install(FILES "${LIBCXX_LIBRARY_DIR}/libc++${CMAKE_SHARED_LIBRARY_SUFFIX}"
210       DESTINATION lib${LIBCXX_LIBDIR_SUFFIX}
211       COMPONENT libcxx)
212   endif()
213 endif()
214
215 if (NOT CMAKE_CONFIGURATION_TYPES AND (LIBCXX_INSTALL_LIBRARY OR
216                                        LIBCXX_INSTALL_HEADERS))
217     if(LIBCXX_INSTALL_LIBRARY)
218       set(lib_install_target cxx)
219     endif()
220     if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY)
221       set(experimental_lib_install_target cxx_experimental)
222     endif()
223     if(LIBCXX_INSTALL_HEADERS)
224       set(header_install_target install-libcxx-headers)
225     endif()
226     add_custom_target(install-libcxx
227                       DEPENDS ${lib_install_target}
228                               ${experimental_lib_install_target}
229                               ${header_install_target}
230                       COMMAND "${CMAKE_COMMAND}"
231                       -DCMAKE_INSTALL_COMPONENT=libcxx
232                       -P "${LIBCXX_BINARY_DIR}/cmake_install.cmake")
233 endif()