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