[CMake][libcxxabi] Fix the -target and -gcc-toolchain flag handling
[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_COMPILE_FLAGS ${var})
279     list(APPEND LIBCXXABI_LINK_FLAGS ${var})
280   endif()
281 endmacro()
282
283 set(LIBCXXABI_C_FLAGS "")
284 set(LIBCXXABI_CXX_FLAGS "")
285 set(LIBCXXABI_COMPILE_FLAGS "")
286 set(LIBCXXABI_LINK_FLAGS "")
287
288 # Configure target flags
289 add_target_flags_if(LIBCXXABI_BUILD_32_BITS "-m32")
290 add_target_flags_if(LIBCXXABI_TARGET_TRIPLE
291           "--target=${LIBCXXABI_TARGET_TRIPLE}")
292 add_target_flags_if(LIBCXXABI_GCC_TOOLCHAIN
293          "--gcc-toolchain=${LIBCXXABI_GCC_TOOLCHAIN}")
294 add_target_flags_if(LIBCXXABI_SYSROOT
295           "--sysroot=${LIBCXXABI_SYSROOT}")
296
297 if (LIBCXXABI_TARGET_TRIPLE)
298   set(TARGET_TRIPLE "${LIBCXXABI_TARGET_TRIPLE}")
299 endif()
300
301 # Configure compiler. Must happen after setting the target flags.
302 include(config-ix)
303
304 if (LIBCXXABI_HAS_NOSTDINCXX_FLAG)
305   list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
306   # Remove -stdlib flags to prevent them from causing an unused flag warning.
307   string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
308   string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
309 endif()
310
311 if (LIBCXXABI_USE_COMPILER_RT)
312   list(APPEND LIBCXXABI_LINK_FLAGS "-rtlib=compiler-rt")
313 endif()
314
315 # Let the library headers know they are currently being used to build the
316 # library.
317 add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)
318
319 # Disable DLL annotations on Windows for static builds.
320 if (WIN32 AND LIBCXXABI_ENABLE_STATIC AND NOT LIBCXXABI_ENABLE_SHARED)
321   add_definitions(-D_LIBCXXABI_DISABLE_DLL_IMPORT_EXPORT)
322 endif()
323
324 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror=return-type)
325
326 # Get warning flags
327 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_W_FLAG -W)
328 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WALL_FLAG -Wall)
329 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCHAR_SUBSCRIPTS_FLAG -Wchar-subscripts)
330 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCONVERSION_FLAG -Wconversion)
331 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISMATCHED_TAGS_FLAG -Wmismatched-tags)
332 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISSING_BRACES_FLAG -Wmissing-braces)
333 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNEWLINE_EOF_FLAG -Wnewline-eof)
334 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_FUNCTION_FLAG -Wunused-function)
335 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHADOW_FLAG -Wshadow)
336 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHORTEN_64_TO_32_FLAG -Wshorten-64-to-32)
337 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_COMPARE_FLAG -Wsign-compare)
338 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_CONVERSION_FLAG -Wsign-conversion)
339 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_ALIASING_FLAG -Wstrict-aliasing=2)
340 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_OVERFLOW_FLAG -Wstrict-overflow=4)
341 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_PARAMETER_FLAG -Wunused-parameter)
342 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_VARIABLE_FLAG -Wunused-variable)
343 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
344 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNDEF_FLAG -Wundef)
345
346 if (LIBCXXABI_ENABLE_WERROR)
347   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror)
348   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WX_FLAG -WX)
349 else()
350   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_ERROR_FLAG -Wno-error)
351   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_NO_WX_FLAG -WX-)
352 endif()
353 if (LIBCXXABI_ENABLE_PEDANTIC)
354   append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_PEDANTIC_FLAG -pedantic)
355 endif()
356
357 # Get feature flags.
358 append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_FSTRICT_ALIASING_FLAG -fstrict-aliasing)
359
360 # Exceptions
361 if (LIBCXXABI_ENABLE_EXCEPTIONS)
362   # Catches C++ exceptions only and tells the compiler to assume that extern C
363   # functions never throw a C++ exception.
364   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc)
365   append_if(LIBCXXABI_C_FLAGS LIBCXXABI_HAS_FUNWIND_TABLES -funwind-tables)
366 else()
367   add_definitions(-D_LIBCXXABI_NO_EXCEPTIONS)
368   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EXCEPTIONS_FLAG -fno-exceptions)
369   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EHS_FLAG -EHs-)
370   append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EHA_FLAG -EHa-)
371 endif()
372
373 # Assert
374 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
375 if (LIBCXXABI_ENABLE_ASSERTIONS)
376   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
377   if (NOT MSVC)
378     list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)
379   endif()
380   # On Release builds cmake automatically defines NDEBUG, so we
381   # explicitly undefine it:
382   if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
383     list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)
384   endif()
385 else()
386   if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
387     list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)
388   endif()
389 endif()
390 # Static library
391 if (NOT LIBCXXABI_ENABLE_SHARED)
392   list(APPEND LIBCXXABI_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC)
393 endif()
394
395 # Threading
396 if (NOT LIBCXXABI_ENABLE_THREADS)
397   if (LIBCXXABI_HAS_PTHREAD_API)
398     message(FATAL_ERROR "LIBCXXABI_HAS_PTHREAD_API can only"
399                         " be set to ON when LIBCXXABI_ENABLE_THREADS"
400                         " is also set to ON.")
401   endif()
402   if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
403     message(FATAL_ERROR "LIBCXXABI_HAS_EXTERNAL_THREAD_API can only"
404                         " be set to ON when LIBCXXABI_ENABLE_THREADS"
405                         " is also set to ON.")
406   endif()
407   if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
408     message(FATAL_ERROR "LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY can only"
409                         " be set to ON when LIBCXXABI_ENABLE_THREADS"
410                         " is also set to ON.")
411   endif()
412   add_definitions(-D_LIBCXXABI_HAS_NO_THREADS)
413 endif()
414
415 if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
416   if (LIBCXXABI_HAS_PTHREAD_API)
417     message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"
418                         " and LIBCXXABI_HAS_PTHREAD_API cannot be both"
419                         " set to ON at the same time.")
420   endif()
421   if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
422     message(FATAL_ERROR "The options LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY"
423                         " and LIBCXXABI_HAS_EXTERNAL_THREAD_API cannot be both"
424                         " set to ON at the same time.")
425   endif()
426 endif()
427
428 set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS OFF)
429 if ((NOT LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
430     OR (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXXABI_ENABLE_SHARED))
431   set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS ON)
432 endif()
433
434 if (LIBCXXABI_HAS_UNDEFINED_SYMBOLS)
435   # Need to allow unresolved symbols if this is to work with shared library builds
436   if (APPLE)
437     list(APPEND LIBCXXABI_LINK_FLAGS "-undefined dynamic_lookup")
438   else()
439     # Relax this restriction from HandleLLVMOptions
440     string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
441   endif()
442 endif()
443
444 if (LIBCXXABI_HAS_PTHREAD_API)
445   add_definitions(-D_LIBCPP_HAS_THREAD_API_PTHREAD)
446 endif()
447
448 if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
449   add_definitions(-D_LIBCPP_HAS_THREAD_API_EXTERNAL)
450 endif()
451
452 if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
453   add_definitions(-D_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
454 endif()
455
456 if (MSVC)
457   add_definitions(-D_CRT_SECURE_NO_WARNINGS)
458 endif()
459
460 # Define LIBCXXABI_USE_LLVM_UNWINDER for conditional compilation.
461 if (LIBCXXABI_USE_LLVM_UNWINDER)
462   add_definitions(-DLIBCXXABI_USE_LLVM_UNWINDER)
463 endif()
464
465 if (LIBCXXABI_SILENT_TERMINATE)
466   add_definitions(-DLIBCXXABI_SILENT_TERMINATE)
467 endif()
468
469 if (LIBCXXABI_BAREMETAL)
470     add_definitions(-DLIBCXXABI_BAREMETAL)
471 endif()
472
473 string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")
474 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")
475 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")
476
477 #===============================================================================
478 # Setup Source Code
479 #===============================================================================
480
481 set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
482     "Specify path to libunwind includes." FORCE)
483 set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
484     "Specify path to libunwind source." FORCE)
485
486 include_directories(include)
487 if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
488   find_path(
489     LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL
490     libunwind.h
491     PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}
492           ${LIBCXXABI_LIBUNWIND_PATH}/include
493           ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES}
494           ${LLVM_MAIN_SRC_DIR}/projects/libunwind/include
495           ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/include
496     NO_DEFAULT_PATH
497   )
498
499   find_path(
500     LIBCXXABI_LIBUNWIND_SOURCES
501     libunwind_ext.h
502     PATHS ${LIBCXXABI_LIBUNWIND_PATH}/src/
503           ${LIBCXXABI_LIBUNWIND_INCLUDES}/../src/
504           ${LLVM_MAIN_SRC_DIR}/projects/libunwind/src/
505           ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/src/
506     NO_DEFAULT_PATH
507   )
508
509   if (LIBCXXABI_LIBUNWIND_SOURCES STREQUAL "LIBCXXABI_LIBUNWIND_SOURCES-NOTFOUND")
510     message(WARNING "LIBCXXABI_LIBUNWIND_SOURCES was not specified and couldn't be infered.")
511     set(LIBCXXABI_LIBUNWIND_SOURCES "")
512   endif()
513
514   if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")
515     set(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL "")
516   endif()
517
518   if (NOT LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "")
519     include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}")
520   endif()
521
522   if (NOT LIBCXXABI_LIBUNWIND_SOURCES STREQUAL "")
523     include_directories("${LIBCXXABI_LIBUNWIND_SOURCES}")
524   endif()
525 endif()
526
527 # Add source code. This also contains all of the logic for deciding linker flags
528 # soname, etc...
529 add_subdirectory(src)
530
531 if (NOT LIBCXXABI_INCLUDE_TESTS OR (LIBCXXABI_STANDALONE_BUILD AND NOT LIBCXXABI_ENABLE_SHARED))
532   # We can't reasonably test the system C++ library with a static libc++abi.
533   # We either need to be able to replace libc++abi at run time (with a shared
534   # libc++abi), or we need to be able to replace the C++ runtime (with a non-
535   # standalone build).
536   message(WARNING "The libc++abi tests aren't valid when libc++abi is built "
537                   "standalone (i.e. outside of llvm/projects/libcxxabi ) and "
538                   "is built without a shared library.  Either build a shared "
539                   "library, build libc++abi at the same time as you build "
540                   "libc++, or do without testing.  No check target will be "
541                   "available!")
542 else()
543   add_subdirectory(test)
544   add_subdirectory(fuzz)
545 endif()