blob: aaada047caf7ab3d9409d8e5fa91bedb3f65de52 [file] [log] [blame]
Dan Albert0ed2e2f2014-07-03 19:35:48 +00001#===============================================================================
2# Setup Project
3#===============================================================================
4
5cmake_minimum_required(VERSION 2.8.8)
6
7if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
8 project(libcxxabi)
9
10 # Rely on llvm-config.
11 set(CONFIG_OUTPUT)
12 find_program(LLVM_CONFIG "llvm-config")
Dan Albert6bd6b1c2014-08-26 20:50:07 +000013 if(DEFINED LLVM_PATH)
14 set(LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include")
15 set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree")
16 set(LLVM_MAIN_SRC_DIR ${LLVM_PATH})
17 set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules")
18 elseif(LLVM_CONFIG)
Dan Albert0ed2e2f2014-07-03 19:35:48 +000019 message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
20 set(CONFIG_COMMAND ${LLVM_CONFIG}
Dan Albert0ed2e2f2014-07-03 19:35:48 +000021 "--includedir"
Dan Albert0ed2e2f2014-07-03 19:35:48 +000022 "--prefix"
23 "--src-root")
24 execute_process(
25 COMMAND ${CONFIG_COMMAND}
26 RESULT_VARIABLE HAD_ERROR
27 OUTPUT_VARIABLE CONFIG_OUTPUT
28 )
29 if(NOT HAD_ERROR)
30 string(REGEX REPLACE
31 "[ \t]*[\r\n]+[ \t]*" ";"
32 CONFIG_OUTPUT ${CONFIG_OUTPUT})
33 else()
34 string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
35 message(STATUS "${CONFIG_COMMAND_STR}")
36 message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
37 endif()
Dan Albert6bd6b1c2014-08-26 20:50:07 +000038
39 list(GET CONFIG_OUTPUT 0 INCLUDE_DIR)
40 list(GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
41 list(GET CONFIG_OUTPUT 2 MAIN_SRC_DIR)
42
43 set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
44 set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
45 set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
46 set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/share/llvm/cmake")
47 set(LLVM_LIT_PATH "${LLVM_PATH}/utils/lit/lit.py")
Dan Albert0ed2e2f2014-07-03 19:35:48 +000048 else()
Eric Fiselierfe2e6e72014-10-17 16:32:06 +000049 message(FATAL_ERROR "llvm-config not found and LLVM_MAIN_SRC_DIR not defined. "
50 "Reconfigure with -DLLVM_CONFIG=path/to/llvm-config "
51 "or -DLLVM_PATH=path/to/llvm-source-root.")
Dan Albert0ed2e2f2014-07-03 19:35:48 +000052 endif()
53
Dan Albert6bd6b1c2014-08-26 20:50:07 +000054 if(EXISTS ${LLVM_CMAKE_PATH})
Dan Albert0ed2e2f2014-07-03 19:35:48 +000055 list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
Dan Alberta770f9d2014-07-10 02:20:11 +000056 include("${LLVM_CMAKE_PATH}/AddLLVM.cmake")
Nico Weber3c2b2ae2014-07-16 23:53:37 +000057 include("${LLVM_CMAKE_PATH}/HandleLLVMOptions.cmake")
Dan Albert0ed2e2f2014-07-03 19:35:48 +000058 else()
Dan Albert6bd6b1c2014-08-26 20:50:07 +000059 message(FATAL_ERROR "Not found: ${LLVM_CMAKE_PATH}")
Dan Albert0ed2e2f2014-07-03 19:35:48 +000060 endif()
61
62 set(PACKAGE_NAME libcxxabi)
Hans Wennborg9db1d94e2015-01-14 18:30:55 +000063 set(PACKAGE_VERSION 3.7.0svn)
Dan Albert0ed2e2f2014-07-03 19:35:48 +000064 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
65 set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
66
67 if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
68 set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
69 else()
70 # Seek installed Lit.
71 find_program(LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR}/utils/lit
72 DOC "Path to lit.py")
73 endif()
74
75 if(LLVM_LIT)
76 # Define the default arguments to use with 'lit', and an option for the user
77 # to override.
78 set(LIT_ARGS_DEFAULT "-sv")
79 if (MSVC OR XCODE)
80 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
81 endif()
82 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
83
84 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
85 if( WIN32 AND NOT CYGWIN )
86 set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
87 endif()
88 else()
89 set(LLVM_INCLUDE_TESTS OFF)
90 endif()
91
Chandler Carruth24a6b052014-12-29 12:22:04 +000092 set(LIBCXXABI_LIBDIR_SUFFIX "" CACHE STRING
93 "Define suffix of library directory name (32/64)")
94
95 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
96 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
Dan Albert0ed2e2f2014-07-03 19:35:48 +000097
98 set(LIBCXXABI_BUILT_STANDALONE 1)
Dan Alberta770f9d2014-07-10 02:20:11 +000099else()
100 set(LLVM_LIT "${CMAKE_SOURCE_DIR}/utils/lit/lit.py")
Chandler Carruth24a6b052014-12-29 12:22:04 +0000101 set(LIBCXXABI_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX})
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000102endif()
103
104#===============================================================================
105# Setup CMake Options
106#===============================================================================
107
108# Define options.
109option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
110option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
111option(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
Dan Albert7c068192014-07-11 15:36:02 +0000112option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
Eric Fiselier559f8672014-11-24 22:42:03 +0000113option(LIBCXXABI_ENABLE_THREADS "Build with threads enabled" ON)
Dan Albert1fc24412015-01-16 00:52:11 +0000114set(LIBCXXABI_GCC_TOOLCHAIN "" CACHE STRING "GCC toolchain for cross compiling.")
115set(LIBCXXABI_SYSROOT "" CACHE STRING "Sysroot for cross compiling.")
Dan Alberta770f9d2014-07-10 02:20:11 +0000116
117# Default to building a shared library so that the default options still test
118# the libc++abi that is being built. There are two problems with testing a
119# static libc++abi. In the case of a standalone build, the tests will link the
120# system's libc++, which might not have been built against our libc++abi. In the
121# case of an in tree build, libc++ will prefer a dynamic libc++abi from the
122# system over a static libc++abi from the output directory.
123option(LIBCXXABI_ENABLE_SHARED "Build libc++abi as a shared library." ON)
124
125find_path(
126 LIBCXXABI_LIBCXX_INCLUDES
127 vector
128 PATHS ${LIBCXXABI_LIBCXX_INCLUDES}
129 ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES}
130 ${LLVM_MAIN_SRC_DIR}/projects/libcxx/include
131 ${LLVM_INCLUDE_DIR}/c++/v1
132 )
133
134set(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_INCLUDES}" CACHE STRING
135 "Specify path to libc++ includes." FORCE)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000136
137#===============================================================================
138# Configure System
139#===============================================================================
140
141# Add path for custom modules
142set(CMAKE_MODULE_PATH
143 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
144 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
145 ${CMAKE_MODULE_PATH}
146 )
147
148# Configure compiler.
149include(config-ix)
150
Chandler Carruth24a6b052014-12-29 12:22:04 +0000151set(LIBCXXABI_COMPILER ${CMAKE_CXX_COMPILER})
152set(LIBCXXABI_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
153set(LIBCXXABI_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
154set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
155
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000156#===============================================================================
157# Setup Compiler Flags
158#===============================================================================
159
160# Get required flags.
161macro(append_if list condition var)
162 if (${condition})
163 list(APPEND ${list} ${var})
164 endif()
165endmacro()
166
Eric Fiselier5cb50512014-11-18 20:37:53 +0000167set(LIBCXXABI_CXX_FLAGS "")
168set(LIBCXXABI_COMPILE_FLAGS "")
169set(LIBCXXABI_LINK_FLAGS "")
170
171
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000172if (LIBCXXABI_HAS_NOSTDINCXX_FLAG)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000173 list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
174 # Remove -stdlib flags to prevent them from causing an unused flag warning.
175 string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
176 string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000177endif()
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000178
Eric Fiselier5cb50512014-11-18 20:37:53 +0000179
180append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror=return-type)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000181
182# Get warning flags
Eric Fiselier5cb50512014-11-18 20:37:53 +0000183append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_W_FLAG -W)
184append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WALL_FLAG -Wall)
185append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCHAR_SUBSCRIPTS_FLAG -Wchar-subscripts)
186append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCONVERSION_FLAG -Wconversion)
187append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISMATCHED_TAGS_FLAG -Wmismatched-tags)
188append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISSING_BRACES_FLAG -Wmissing-braces)
189append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNEWLINE_EOF_FLAG -Wnewline-eof)
190append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_UNUSED_FUNCTION_FLAG -Wno-unused-function)
191append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHADOW_FLAG -Wshadow)
192append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHORTEN_64_TO_32_FLAG -Wshorten-64-to-32)
193append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_COMPARE_FLAG -Wsign-compare)
194append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_CONVERSION_FLAG -Wsign-conversion)
195append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_ALIASING_FLAG -Wstrict-aliasing=2)
196append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_OVERFLOW_FLAG -Wstrict-overflow=4)
197append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_PARAMETER_FLAG -Wunused-parameter)
198append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_VARIABLE_FLAG -Wunused-variable)
199append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
Dan Albert3c4780e2014-07-10 22:23:03 +0000200
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000201if (LIBCXXABI_ENABLE_WERROR)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000202 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror)
203 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WX_FLAG -WX)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000204else()
Eric Fiselier5cb50512014-11-18 20:37:53 +0000205 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_ERROR_FLAG -Wno-error)
206 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_NO_WX_FLAG -WX-)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000207endif()
208if (LIBCXXABI_ENABLE_PEDANTIC)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000209 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_PEDANTIC_FLAG -pedantic)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000210endif()
211
212# Get feature flags.
213# Exceptions
214# Catches C++ exceptions only and tells the compiler to assume that extern C
215# functions never throw a C++ exception.
Eric Fiselier5cb50512014-11-18 20:37:53 +0000216append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_FSTRICT_ALIASING_FLAG -fstrict-aliasing)
217append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000218
219# Assert
220string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
221if (LIBCXXABI_ENABLE_ASSERTIONS)
222 # MSVC doesn't like _DEBUG on release builds. See PR 4379.
223 if (NOT MSVC)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000224 list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000225 endif()
226 # On Release builds cmake automatically defines NDEBUG, so we
227 # explicitly undefine it:
228 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53 +0000229 list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000230 endif()
231else()
232 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53 +0000233 list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000234 endif()
235endif()
236# Static library
237if (NOT LIBCXXABI_ENABLE_SHARED)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000238 list(APPEND LIBCXXABI_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000239endif()
240
Eric Fiselier559f8672014-11-24 22:42:03 +0000241if (NOT LIBCXXABI_ENABLE_THREADS)
242 add_definitions(-DLIBCXXABI_HAS_NO_THREADS=1)
243endif()
244
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000245# This is the _ONLY_ place where add_definitions is called.
246if (MSVC)
247 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
248endif()
249
Logan Chien4947eb62015-01-22 13:27:36 +0000250# Define LIBCXXABI_USE_LLVM_UNWINDER for conditional compilation.
251if (LIBCXXABI_USE_LLVM_UNWINDER)
252 add_definitions(-DLIBCXXABI_USE_LLVM_UNWINDER=1)
253endif()
254
Dan Albert91014002015-01-16 01:10:09 +0000255append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_TARGET_TRIPLE
256 "-target ${LIBCXXABI_TARGET_TRIPLE}")
Dan Albert1fc24412015-01-16 00:52:11 +0000257append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_GCC_TOOLCHAIN
258 "-gcc-toolchain ${LIBCXXABI_GCC_TOOLCHAIN}")
259append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_SYSROOT
260 "--sysroot ${LIBCXXABI_SYSROOT}")
Eric Fiselier5cb50512014-11-18 20:37:53 +0000261string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")
262set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000263
264#===============================================================================
265# Setup Source Code
266#===============================================================================
267
268include_directories(include)
269
270# Add source code. This also contains all of the logic for deciding linker flags
271# soname, etc...
272add_subdirectory(src)
Dan Alberta770f9d2014-07-10 02:20:11 +0000273
Dan Albert7c068192014-07-11 15:36:02 +0000274if (LIBCXXABI_USE_LLVM_UNWINDER)
275 add_subdirectory(src/Unwind)
276endif()
277
Dan Alberta770f9d2014-07-10 02:20:11 +0000278if(NOT LIBCXXABI_ENABLE_SHARED)
279 # TODO: Fix the libc++ cmake files so that libc++abi can be statically linked.
280 # As it is now, libc++ will prefer linking against a dynamic libc++abi in the
281 # system library paths over a static libc++abi in the out directory. This
282 # would test the system library rather than the one we just built, which isn't
283 # very helpful.
284 message(WARNING "The libc++abi tests are currently only valid when "
285 "LIBCXXABI_ENABLE_SHARED is on, no check target will be "
286 "available!")
287else()
288 add_subdirectory(test)
289endif()