Fully Reformat fallback_malloc.cpp
[lldb.git] / libcxxabi / CMakeLists.txt
1 #===============================================================================
2 # Setup Project
3 #===============================================================================
4
5 cmake_minimum_required(VERSION 3.4.3)
6
7 if(POLICY CMP0042)
8   cmake_policy(SET CMP0042 NEW) # Set MACOSX_RPATH=YES by default
9 endif()
10
11 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
12   project(libcxxabi)
13
14   # Rely on llvm-config.
15   set(CONFIG_OUTPUT)
16   if (NOT LLVM_CONFIG_PATH)
17     find_program(LLVM_CONFIG_PATH "llvm-config")
18   endif()
19   if(DEFINED LLVM_PATH)
20     set(LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include")
21     set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree")
22     set(LLVM_MAIN_SRC_DIR ${LLVM_PATH})
23     set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules")
24   elseif(LLVM_CONFIG_PATH)
25     message(STATUS "Found LLVM_CONFIG_PATH as ${LLVM_CONFIG_PATH}")
26     set(CONFIG_COMMAND ${LLVM_CONFIG_PATH}
27       "--includedir"
28       "--prefix"
29       "--src-root")
30     execute_process(
31       COMMAND ${CONFIG_COMMAND}
32       RESULT_VARIABLE HAD_ERROR
33       OUTPUT_VARIABLE CONFIG_OUTPUT
34     )
35     if(NOT HAD_ERROR)
36       string(REGEX REPLACE
37         "[ \t]*[\r\n]+[ \t]*" ";"
38         CONFIG_OUTPUT ${CONFIG_OUTPUT})
39     else()
40       string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
41       message(STATUS "${CONFIG_COMMAND_STR}")
42       message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
43     endif()
44
45     list(GET CONFIG_OUTPUT 0 INCLUDE_DIR)
46     list(GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
47     list(GET CONFIG_OUTPUT 2 MAIN_SRC_DIR)
48
49     set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
50     set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
51     set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
52     set(LLVM_LIT_PATH "${LLVM_PATH}/utils/lit/lit.py")
53
54     # --cmakedir is supported since llvm r291218 (4.0 release)
55     execute_process(
56       COMMAND ${LLVM_CONFIG_PATH} --cmakedir
57       RESULT_VARIABLE HAD_ERROR
58       OUTPUT_VARIABLE CONFIG_OUTPUT
59       ERROR_QUIET)
60     if(NOT HAD_ERROR)
61       string(STRIP "${CONFIG_OUTPUT}" LLVM_CMAKE_PATH)
62     else()
63       set(LLVM_CMAKE_PATH
64           "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
65     endif()
66   else()
67     message(FATAL_ERROR "llvm-config not found and LLVM_MAIN_SRC_DIR not defined. "
68                         "Reconfigure with -DLLVM_CONFIG_PATH=path/to/llvm-config "
69                         "or -DLLVM_PATH=path/to/llvm-source-root.")
70   endif()
71
72   if(EXISTS ${LLVM_CMAKE_PATH})
73     list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
74     include("${LLVM_CMAKE_PATH}/AddLLVM.cmake")
75     include("${LLVM_CMAKE_PATH}/HandleLLVMOptions.cmake")
76   else()
77     message(FATAL_ERROR "Not found: ${LLVM_CMAKE_PATH}")
78   endif()
79
80   set(PACKAGE_NAME libcxxabi)
81   set(PACKAGE_VERSION 5.0.0svn)
82   set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
83   set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org")
84
85   if (NOT DEFINED LLVM_INCLUDE_TESTS)
86     set(LLVM_INCLUDE_TESTS ON)
87   endif()
88
89   if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
90     set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
91   else()
92     # Seek installed Lit.
93     find_program(LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR}/utils/lit
94       DOC "Path to lit.py")
95   endif()
96
97   if(LLVM_LIT)
98     # Define the default arguments to use with 'lit', and an option for the user
99     # to override.
100     set(LIT_ARGS_DEFAULT "-sv")
101     if (MSVC OR XCODE)
102       set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
103     endif()
104     set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
105
106     # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
107     if( WIN32 AND NOT CYGWIN )
108       set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
109     endif()
110   else()
111     set(LLVM_INCLUDE_TESTS OFF)
112   endif()
113
114   set(LIBCXXABI_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
115       "Define suffix of library directory name (32/64)")
116
117   set(LIBCXXABI_STANDALONE_BUILD 1)
118 else()
119   set(LLVM_MAIN_SRC_DIR "${CMAKE_SOURCE_DIR}" CACHE PATH "Path to LLVM source tree")
120   set(LLVM_LIT "${CMAKE_SOURCE_DIR}/utils/lit/lit.py")
121   set(LIBCXXABI_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX})
122 endif()
123
124 #===============================================================================
125 # Setup CMake Options
126 #===============================================================================
127
128 # Define options.
129 option(LIBCXXABI_ENABLE_EXCEPTIONS "Use exceptions." ON)
130 option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
131 option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
132 option(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
133 option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
134 option(LIBCXXABI_ENABLE_STATIC_UNWINDER "Statically link the LLVM unwinder." OFF)
135 option(LIBCXXABI_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
136 option(LIBCXXABI_ENABLE_THREADS "Build with threads enabled" ON)
137 option(LIBCXXABI_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
138 option(LIBCXXABI_HAS_EXTERNAL_THREAD_API
139   "Build libc++abi with an externalized threading API.
140   This option may only be set to ON when LIBCXXABI_ENABLE_THREADS=ON." OFF)
141 option(LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY
142   "Build libc++abi with an externalized threading library.
143    This option may only be set to ON when LIBCXXABI_ENABLE_THREADS=ON" OFF)
144
145 # FIXME: This option should default to off. Unfortunatly GCC 4.9 fails to link
146 # programs to due undefined references to new/delete in libc++abi. Once this
147 # has been fixed or worked around the default value should be changed.
148 option(LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS
149     "Build libc++abi with definitions for operator new/delete. Normally libc++
150     provides these definitions" ON)
151 option(LIBCXXABI_BUILD_32_BITS "Build 32 bit libc++abi." ${LLVM_BUILD_32_BITS})
152 option(LIBCXXABI_INCLUDE_TESTS "Generate build targets for the libc++abi unit tests." ${LLVM_INCLUDE_TESTS})
153 set(LIBCXXABI_TARGET_TRIPLE "" CACHE STRING "Target triple for cross compiling.")
154 set(LIBCXXABI_GCC_TOOLCHAIN "" CACHE PATH "GCC toolchain for cross compiling.")
155 set(LIBCXXABI_SYSROOT "" CACHE PATH "Sysroot for cross compiling.")
156 set(LIBCXXABI_LIBCXX_LIBRARY_PATH "" CACHE PATH "The path to libc++ library.")
157
158 # Default to building a shared library so that the default options still test
159 # the libc++abi that is being built. There are two problems with testing a
160 # static libc++abi. In the case of a standalone build, the tests will link the
161 # system's libc++, which might not have been built against our libc++abi. In the
162 # case of an in tree build, libc++ will prefer a dynamic libc++abi from the
163 # system over a static libc++abi from the output directory.
164 option(LIBCXXABI_ENABLE_SHARED "Build libc++abi as a shared library." ON)
165 option(LIBCXXABI_ENABLE_STATIC "Build libc++abi as a static library." ON)
166
167 option(LIBCXXABI_BAREMETAL "Build libc++abi for baremetal targets." OFF)
168 # The default terminate handler attempts to demangle uncaught exceptions, which
169 # causes extra I/O and demangling code to be pulled in.
170 option(LIBCXXABI_SILENT_TERMINATE "Set this to make the terminate handler default to a silent alternative" OFF)
171
172 if (NOT LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_STATIC)
173   message(FATAL_ERROR "libc++abi must be built as either a shared or static library.")
174 endif()
175
176 if (LLVM_EXTERNAL_LIBCXX_SOURCE_DIR)
177   set(LIBCXXABI_LIBCXX_SRC_DIRS ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR})
178 else()
179   set(LIBCXXABI_LIBCXX_SRC_DIRS
180     "${LLVM_MAIN_SRC_DIR}/projects/libcxx"
181     "${LLVM_MAIN_SRC_DIR}/runtimes/libcxx"
182     )
183 endif()
184
185 set(LIBCXXABI_LIBCXX_INCLUDE_DIRS "")
186 foreach(dir ${LIBCXXABI_LIBCXX_SRC_DIRS})
187   list(APPEND LIBCXXABI_LIBCXX_INCLUDE_DIRS "${dir}/include")
188 endforeach()
189
190 find_path(
191   LIBCXXABI_LIBCXX_INCLUDES
192   vector
193   PATHS ${LIBCXXABI_LIBCXX_INCLUDES}
194         ${LIBCXXABI_LIBCXX_PATH}/include
195         ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES}
196         ${LIBCXXABI_LIBCXX_INCLUDE_DIRS}
197         ${LLVM_INCLUDE_DIR}/c++/v1
198   )
199
200 set(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_INCLUDES}" CACHE PATH
201     "Specify path to libc++ includes." FORCE)
202
203 find_path(
204   LIBCXXABI_LIBCXX_PATH
205   utils/libcxx/test/__init__.py
206   PATHS ${LIBCXXABI_LIBCXX_PATH}
207         ${LIBCXXABI_LIBCXX_INCLUDES}/../
208         ${LIBCXXABI_LIBCXX_SRC_DIRS}
209   NO_DEFAULT_PATH
210   )
211
212 if (LIBCXXABI_LIBCXX_PATH STREQUAL "LIBCXXABI_LIBCXX_PATH-NOTFOUND")
213   message(WARNING "LIBCXXABI_LIBCXX_PATH was not specified and couldn't be infered.")
214   set(LIBCXXABI_LIBCXX_PATH "")
215 endif()
216
217 set(LIBCXXABI_LIBCXX_PATH "${LIBCXXABI_LIBCXX_PATH}" CACHE PATH
218     "Specify path to libc++ source." FORCE)
219
220 #===============================================================================
221 # Configure System
222 #===============================================================================
223
224 # Add path for custom modules
225 set(CMAKE_MODULE_PATH
226   "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
227   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
228   ${CMAKE_MODULE_PATH}
229   )
230
231 set(LIBCXXABI_COMPILER    ${CMAKE_CXX_COMPILER})
232 set(LIBCXXABI_SOURCE_DIR  ${CMAKE_CURRENT_SOURCE_DIR})
233 set(LIBCXXABI_BINARY_DIR  ${CMAKE_CURRENT_BINARY_DIR})
234 set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
235
236 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
237 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
238
239 # By default, for non-standalone builds, libcxx and libcxxabi share a library
240 # directory.
241 if (NOT LIBCXXABI_LIBCXX_LIBRARY_PATH)
242   set(LIBCXXABI_LIBCXX_LIBRARY_PATH "${LIBCXXABI_LIBRARY_DIR}" CACHE PATH
243       "The path to libc++ library.")
244 endif()
245
246 # Check that we can build with 32 bits if requested.
247 if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32)
248   if (LIBCXXABI_BUILD_32_BITS AND NOT LLVM_BUILD_32_BITS) # Don't duplicate the output from LLVM
249     message(STATUS "Building 32 bits executables and libraries.")
250   endif()
251 elseif(LIBCXXABI_BUILD_32_BITS)
252   message(FATAL_ERROR "LIBCXXABI_BUILD_32_BITS=ON is not supported on this platform.")
253 endif()
254
255 #===============================================================================
256 # Setup Compiler Flags
257 #===============================================================================
258
259 # Get required flags.
260 macro(append_if list condition var)
261   if (${condition})
262     list(APPEND ${list} ${var})
263   endif()
264 endmacro()
265
266 macro(add_target_flags_if condition var)
267   if (${condition})
268     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${var}")
269     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${var}")
270     list(APPEND LIBCXXABI_LINK_FLAGS ${var})
271   endif()
272 endmacro()
273
274 set(LIBCXXABI_C_FLAGS "")
275 set(LIBCXXABI_CXX_FLAGS "")
276 set(LIBCXXABI_COMPILE_FLAGS "")
277 set(LIBCXXABI_LINK_FLAGS "")
278
279 # Configure target flags
280 add_target_flags_if(LIBCXXABI_BUILD_32_BITS "-m32")
281 add_target_flags_if(LIBCXXABI_TARGET_TRIPLE
282           "-target ${LIBCXXABI_TARGET_TRIPLE}")
283 add_target_flags_if(LIBCXXABI_GCC_TOOLCHAIN
284          "-gcc-toolchain ${LIBCXXABI_GCC_TOOLCHAIN}")
285 add_target_flags_if(LIBCXXABI_SYSROOT
286           "--sysroot=${LIBCXXABI_SYSROOT}")
287
288 if (LIBCXXABI_TARGET_TRIPLE)
289   set(TARGET_TRIPLE "${LIBCXXABI_TARGET_TRIPLE}")
290 endif()
291
292 # Configure compiler. Must happen after setting the target flags.
293 include(config-ix)
294
295 if (LIBCXXABI_HAS_NOSTDINCXX_FLAG)
296   list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
297   # Remove -stdlib flags to prevent them from causing an unused flag warning.
298   string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
299   string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
300 endif()
301
302 if (LIBCXXABI_USE_COMPILER_RT)
303   list(APPEND LIBCXXABI_LINK_FLAGS "-rtlib=compiler-rt")
304 endif()
305
306 # Let the library headers know they are currently being used to build the
307 # library.
308 add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)
309
310 # Disable DLL annotations on Windows for static builds.
311 if (WIN32 AND LIBCXXABI_ENABLE_STATIC AND NOT LIBCXXABI_ENABLE_SHARED)
312   add_definitions(-D_LIBCXXABI_DISABLE_DLL_IMPORT_EXPORT)
313 endif()
314
315 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror=return-type)
316
317 # Get warning flags
318 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_W_FLAG -W)
319 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WALL_FLAG -Wall)
320 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCHAR_SUBSCRIPTS_FLAG -Wchar-subscripts)
321 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCONVERSION_FLAG -Wconversion)
322 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISMATCHED_TAGS_FLAG -Wmismatched-tags)
323 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISSING_BRACES_FLAG -Wmissing-braces)
324 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNEWLINE_EOF_FLAG -Wnewline-eof)
325 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_FUNCTION_FLAG -Wunused-function)
326 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHADOW_FLAG -Wshadow)
327 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHORTEN_64_TO_32_FLAG -Wshorten-64-to-32)
328 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_COMPARE_FLAG -Wsign-compare)
329 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_CONVERSION_FLAG -Wsign-conversion)
330 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_ALIASING_FLAG -Wstrict-aliasing=2)
331 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_OVERFLOW_FLAG -Wstrict-overflow=4)
332 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_PARAMETER_FLAG -Wunused-parameter)
333 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_VARIABLE_FLAG -Wunused-variable)
334 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
335 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNDEF_FLAG -Wundef)
336
337 if (LIBCXXABI_ENABLE_WERROR)
338   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror)
339   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WX_FLAG -WX)
340 else()
341   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_ERROR_FLAG -Wno-error)
342   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_NO_WX_FLAG -WX-)
343 endif()
344 if (LIBCXXABI_ENABLE_PEDANTIC)
345   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_PEDANTIC_FLAG -pedantic)
346 endif()
347
348 # Get feature flags.
349 append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_FSTRICT_ALIASING_FLAG -fstrict-aliasing)
350
351 # Exceptions
352 if (LIBCXXABI_ENABLE_EXCEPTIONS)
353   # Catches C++ exceptions only and tells the compiler to assume that extern C
354   # functions never throw a C++ exception.
355   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc)
356   append_if(LIBCXXABI_C_FLAGS LIBCXXABI_HAS_FUNWIND_TABLES -funwind-tables)
357 else()
358   add_definitions(-D_LIBCXXABI_NO_EXCEPTIONS)
359   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EXCEPTIONS_FLAG -fno-exceptions)
360   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EHS_FLAG -EHs-)
361   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EHA_FLAG -EHa-)
362 endif()
363
364 # Assert
365 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
366 if (LIBCXXABI_ENABLE_ASSERTIONS)
367   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
368   if (NOT MSVC)
369     list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)
370   endif()
371   # On Release builds cmake automatically defines NDEBUG, so we
372   # explicitly undefine it:
373   if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
374     list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)
375   endif()
376 else()
377   if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
378     list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)
379   endif()
380 endif()
381 # Static library
382 if (NOT LIBCXXABI_ENABLE_SHARED)
383   list(APPEND LIBCXXABI_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC)
384 endif()
385
386 # Threading
387 if (NOT LIBCXXABI_ENABLE_THREADS)
388   if (LIBCXXABI_HAS_PTHREAD_API)
389     message(FATAL_ERROR "LIBCXXABI_HAS_PTHREAD_API can only"
390                         " be set to ON when LIBCXXABI_ENABLE_THREADS"
391                         " is also set to ON.")
392   endif()
393   if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
394     message(FATAL_ERROR "LIBCXXABI_HAS_EXTERNAL_THREAD_API can only"
395                         " be set to ON when LIBCXXABI_ENABLE_THREADS"
396                         " is also set to ON.")
397   endif()
398   if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
399     message(FATAL_ERROR "LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY can only"
400                         " be set to ON when LIBCXXABI_ENABLE_THREADS"
401                         " is also set to ON.")
402   endif()
403   add_definitions(-D_LIBCXXABI_HAS_NO_THREADS)
404 endif()
405
406 if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
407   if (LIBCXXABI_HAS_PTHREAD_API)
408     message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"
409                         " and LIBCXXABI_HAS_PTHREAD_API cannot be both"
410                         " set to ON at the same time.")
411   endif()
412   if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
413     message(FATAL_ERROR "The options LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY"
414                         " and LIBCXXABI_HAS_EXTERNAL_THREAD_API cannot be both"
415                         " set to ON at the same time.")
416   endif()
417 endif()
418
419 set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS OFF)
420 if ((NOT LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
421     OR (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXXABI_ENABLE_SHARED))
422   set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS ON)
423 endif()
424
425 if (LIBCXXABI_HAS_UNDEFINED_SYMBOLS)
426   # Need to allow unresolved symbols if this is to work with shared library builds
427   if (APPLE)
428     list(APPEND LIBCXXABI_LINK_FLAGS "-undefined dynamic_lookup")
429   else()
430     # Relax this restriction from HandleLLVMOptions
431     string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
432   endif()
433 endif()
434
435 if (LIBCXXABI_HAS_PTHREAD_API)
436   add_definitions(-D_LIBCPP_HAS_THREAD_API_PTHREAD)
437 endif()
438
439 if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
440   add_definitions(-D_LIBCPP_HAS_THREAD_API_EXTERNAL)
441 endif()
442
443 if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
444   add_definitions(-D_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
445 endif()
446
447 if (MSVC)
448   add_definitions(-D_CRT_SECURE_NO_WARNINGS)
449 endif()
450
451 # Define LIBCXXABI_USE_LLVM_UNWINDER for conditional compilation.
452 if (LIBCXXABI_USE_LLVM_UNWINDER)
453   add_definitions(-DLIBCXXABI_USE_LLVM_UNWINDER)
454 endif()
455
456 if (LIBCXXABI_SILENT_TERMINATE)
457   add_definitions(-DLIBCXXABI_SILENT_TERMINATE)
458 endif()
459
460 if (LIBCXXABI_BAREMETAL)
461     add_definitions(-DLIBCXXABI_BAREMETAL)
462 endif()
463
464 string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")
465 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")
466 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")
467
468 #===============================================================================
469 # Setup Source Code
470 #===============================================================================
471
472 set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
473     "Specify path to libunwind includes." FORCE)
474 set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
475     "Specify path to libunwind source." FORCE)
476
477 include_directories(include)
478 if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
479   find_path(
480     LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL
481     libunwind.h
482     PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}
483           ${LIBCXXABI_LIBUNWIND_PATH}/include
484           ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES}
485           ${LLVM_MAIN_SRC_DIR}/projects/libunwind/include
486           ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/include
487     NO_DEFAULT_PATH
488   )
489
490   find_path(
491     LIBCXXABI_LIBUNWIND_SOURCES
492     libunwind_ext.h
493     PATHS ${LIBCXXABI_LIBUNWIND_PATH}/src/
494           ${LIBCXXABI_LIBUNWIND_INCLUDES}/../src/
495           ${LLVM_MAIN_SRC_DIR}/projects/libunwind/src/
496           ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/src/
497     NO_DEFAULT_PATH
498   )
499
500   if (LIBCXXABI_LIBUNWIND_SOURCES STREQUAL "LIBCXXABI_LIBUNWIND_SOURCES-NOTFOUND")
501     message(WARNING "LIBCXXABI_LIBUNWIND_SOURCES was not specified and couldn't be infered.")
502     set(LIBCXXABI_LIBUNWIND_SOURCES "")
503   endif()
504
505   if (NOT LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")
506     include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}")
507   endif()
508   if (NOT LIBCXXABI_LIBUNWIND_SOURCES STREQUAL "")
509     include_directories("${LIBCXXABI_LIBUNWIND_SOURCES}")
510   endif()
511 endif()
512
513 # Add source code. This also contains all of the logic for deciding linker flags
514 # soname, etc...
515 add_subdirectory(src)
516
517 if (NOT LIBCXXABI_INCLUDE_TESTS OR (LIBCXXABI_STANDALONE_BUILD AND NOT LIBCXXABI_ENABLE_SHARED))
518   # We can't reasonably test the system C++ library with a static libc++abi.
519   # We either need to be able to replace libc++abi at run time (with a shared
520   # libc++abi), or we need to be able to replace the C++ runtime (with a non-
521   # standalone build).
522   message(WARNING "The libc++abi tests aren't valid when libc++abi is built "
523                   "standalone (i.e. outside of llvm/projects/libcxxabi ) and "
524                   "is built without a shared library.  Either build a shared "
525                   "library, build libc++abi at the same time as you build "
526                   "libc++, or do without testing.  No check target will be "
527                   "available!")
528 else()
529   add_subdirectory(test)
530   add_subdirectory(fuzz)
531 endif()