blob: 6be1e156ff5c462a6410f0699f3cb63bf731bb73 [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
Logan Chiendbcd7a32015-01-22 13:39:08 +0000167set(LIBCXXABI_C_FLAGS "")
Eric Fiselier5cb50512014-11-18 20:37:53 +0000168set(LIBCXXABI_CXX_FLAGS "")
169set(LIBCXXABI_COMPILE_FLAGS "")
170set(LIBCXXABI_LINK_FLAGS "")
171
172
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000173if (LIBCXXABI_HAS_NOSTDINCXX_FLAG)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000174 list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
175 # Remove -stdlib flags to prevent them from causing an unused flag warning.
176 string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
177 string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000178endif()
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000179
Eric Fiselier5cb50512014-11-18 20:37:53 +0000180
181append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror=return-type)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000182
183# Get warning flags
Eric Fiselier5cb50512014-11-18 20:37:53 +0000184append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_W_FLAG -W)
185append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WALL_FLAG -Wall)
186append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCHAR_SUBSCRIPTS_FLAG -Wchar-subscripts)
187append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCONVERSION_FLAG -Wconversion)
188append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISMATCHED_TAGS_FLAG -Wmismatched-tags)
189append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISSING_BRACES_FLAG -Wmissing-braces)
190append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNEWLINE_EOF_FLAG -Wnewline-eof)
191append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_UNUSED_FUNCTION_FLAG -Wno-unused-function)
192append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHADOW_FLAG -Wshadow)
193append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHORTEN_64_TO_32_FLAG -Wshorten-64-to-32)
194append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_COMPARE_FLAG -Wsign-compare)
195append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_CONVERSION_FLAG -Wsign-conversion)
196append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_ALIASING_FLAG -Wstrict-aliasing=2)
197append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_OVERFLOW_FLAG -Wstrict-overflow=4)
198append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_PARAMETER_FLAG -Wunused-parameter)
199append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_VARIABLE_FLAG -Wunused-variable)
200append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
Dan Albert3c4780e2014-07-10 22:23:03 +0000201
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000202if (LIBCXXABI_ENABLE_WERROR)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000203 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror)
204 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WX_FLAG -WX)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000205else()
Eric Fiselier5cb50512014-11-18 20:37:53 +0000206 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_ERROR_FLAG -Wno-error)
207 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_NO_WX_FLAG -WX-)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000208endif()
209if (LIBCXXABI_ENABLE_PEDANTIC)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000210 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_PEDANTIC_FLAG -pedantic)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000211endif()
212
213# Get feature flags.
214# Exceptions
215# Catches C++ exceptions only and tells the compiler to assume that extern C
216# functions never throw a C++ exception.
Eric Fiselier5cb50512014-11-18 20:37:53 +0000217append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_FSTRICT_ALIASING_FLAG -fstrict-aliasing)
218append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000219
Logan Chiendbcd7a32015-01-22 13:39:08 +0000220append_if(LIBCXXABI_C_FLAGS LIBCXXABI_HAS_FUNWIND_TABLES -funwind-tables)
221
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000222# Assert
223string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
224if (LIBCXXABI_ENABLE_ASSERTIONS)
225 # MSVC doesn't like _DEBUG on release builds. See PR 4379.
226 if (NOT MSVC)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000227 list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000228 endif()
229 # On Release builds cmake automatically defines NDEBUG, so we
230 # explicitly undefine it:
231 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53 +0000232 list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000233 endif()
234else()
235 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53 +0000236 list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000237 endif()
238endif()
239# Static library
240if (NOT LIBCXXABI_ENABLE_SHARED)
Eric Fiselier5cb50512014-11-18 20:37:53 +0000241 list(APPEND LIBCXXABI_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC)
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000242endif()
243
Eric Fiselier559f8672014-11-24 22:42:03 +0000244if (NOT LIBCXXABI_ENABLE_THREADS)
245 add_definitions(-DLIBCXXABI_HAS_NO_THREADS=1)
246endif()
247
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000248# This is the _ONLY_ place where add_definitions is called.
249if (MSVC)
250 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
251endif()
252
Logan Chien4947eb62015-01-22 13:27:36 +0000253# Define LIBCXXABI_USE_LLVM_UNWINDER for conditional compilation.
254if (LIBCXXABI_USE_LLVM_UNWINDER)
255 add_definitions(-DLIBCXXABI_USE_LLVM_UNWINDER=1)
256endif()
257
Dan Albert91014002015-01-16 01:10:09 +0000258append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_TARGET_TRIPLE
259 "-target ${LIBCXXABI_TARGET_TRIPLE}")
Dan Albert1fc24412015-01-16 00:52:11 +0000260append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_GCC_TOOLCHAIN
261 "-gcc-toolchain ${LIBCXXABI_GCC_TOOLCHAIN}")
262append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_SYSROOT
263 "--sysroot ${LIBCXXABI_SYSROOT}")
Eric Fiselier5cb50512014-11-18 20:37:53 +0000264string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")
265set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")
Logan Chiendbcd7a32015-01-22 13:39:08 +0000266set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48 +0000267
268#===============================================================================
269# Setup Source Code
270#===============================================================================
271
272include_directories(include)
273
274# Add source code. This also contains all of the logic for deciding linker flags
275# soname, etc...
276add_subdirectory(src)
Dan Alberta770f9d2014-07-10 02:20:11 +0000277
Dan Albert7c068192014-07-11 15:36:02 +0000278if (LIBCXXABI_USE_LLVM_UNWINDER)
279 add_subdirectory(src/Unwind)
280endif()
281
Dan Alberta770f9d2014-07-10 02:20:11 +0000282if(NOT LIBCXXABI_ENABLE_SHARED)
283 # TODO: Fix the libc++ cmake files so that libc++abi can be statically linked.
284 # As it is now, libc++ will prefer linking against a dynamic libc++abi in the
285 # system library paths over a static libc++abi in the out directory. This
286 # would test the system library rather than the one we just built, which isn't
287 # very helpful.
288 message(WARNING "The libc++abi tests are currently only valid when "
289 "LIBCXXABI_ENABLE_SHARED is on, no check target will be "
290 "available!")
291else()
292 add_subdirectory(test)
293endif()