blob: 9584734c0041657080ff311e3a48a521df05bb91 [file] [log] [blame]
Michael J. Spencer626916f2010-12-10 19:47:541# See www/CMake.html for instructions on how to build libcxx with CMake.
2
3#===============================================================================
4# Setup Project
5#===============================================================================
6
7project(libcxx CXX C)
8cmake_minimum_required(VERSION 2.8)
9
10set(PACKAGE_NAME libcxx)
11set(PACKAGE_VERSION trunk-svn)
12set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
13set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
14
15# Add path for custom modules
16set(CMAKE_MODULE_PATH
Michael J. Spencer626916f2010-12-10 19:47:5417 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
18 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
Alexey Samsonov179fa782013-09-30 09:10:0119 ${CMAKE_MODULE_PATH}
Michael J. Spencer626916f2010-12-10 19:47:5420 )
21
22# Require out of source build.
23include(MacroEnsureOutOfSourceBuild)
24MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
25 "${PROJECT_NAME} requires an out of source build. Please create a separate
26 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
27 )
28
Peter Collingbourne4c81b002013-10-03 21:58:2529if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
30 set(LIBCXX_BUILT_STANDALONE 1)
31endif()
32
Michael J. Spencer626916f2010-12-10 19:47:5433#===============================================================================
34# Setup CMake Options
35#===============================================================================
36
37# Define options.
38option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
39option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
40option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
41option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
42option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
Eric Fiselierdfe5e722014-08-16 01:35:3643option(LIBCXX_ENABLE_CXX1Y "Enable -std=c++1y and use of c++1y language features if the compiler supports it." OFF)
Michael J. Spencer626916f2010-12-10 19:47:5444option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
Michael Gottesmanc64c9802013-09-02 07:28:0545option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++ support headers." ON)
Eric Fiselier25a15162014-08-18 05:03:4646if (LIBCXX_BUILT_STANDALONE)
47 set(LLVM_USE_SANITIZER "" CACHE STRING
48 "Define the sanitizer used to build the library and tests")
49endif()
Michael J. Spencer626916f2010-12-10 19:47:5450
Peter Collingbourned0d308f2013-10-06 22:13:1951set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++)
Viktor Kutuzovf2e8c042014-08-08 06:53:3052if (NOT LIBCXX_CXX_ABI)
53 if (NOT DEFINED LIBCXX_BUILT_STANDALONE AND
54 IS_DIRECTORY "${CMAKE_SOURCE_DIR}/projects/libcxxabi")
55 set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
Dan Albert0c6d1a82014-07-26 23:08:3356 set(LIBCXX_LIBCXXABI_INCLUDE_PATHS "${CMAKE_SOURCE_DIR}/projects/libcxxabi/include")
57 set(LIBCXX_CXX_ABI_INTREE 1)
58 else ()
Viktor Kutuzovf2e8c042014-08-08 06:53:3059 set(LIBCXX_CXX_ABI_LIBNAME "none")
Dan Albert0c6d1a82014-07-26 23:08:3360 endif ()
Viktor Kutuzovf2e8c042014-08-08 06:53:3061else ()
62 set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
63endif ()
Michael J. Spencera358fbe2012-11-30 21:02:2964set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
65 "Specify C++ ABI library to use." FORCE)
Howard Hinnant9c07b142013-08-19 21:42:0766set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
Michael J. Spencera358fbe2012-11-30 21:02:2967
Michael J. Spencer626916f2010-12-10 19:47:5468#===============================================================================
69# Configure System
70#===============================================================================
71
72# Get triples.
73include(GetTriple)
74get_host_triple(LIBCXX_HOST_TRIPLE
75 LIBCXX_HOST_ARCH
76 LIBCXX_HOST_VENDOR
77 LIBCXX_HOST_OS
78 )
79set(LIBCXX_HOST_TRIPLE ${LIBCXX_HOST_TRIPLE} CACHE STRING "Host triple.")
80get_target_triple(LIBCXX_TARGET_TRIPLE
81 LIBCXX_TARGET_ARCH
82 LIBCXX_TARGET_VENDOR
83 LIBCXX_TARGET_OS
84 )
85set(LIBCXX_TARGET_TRIPLE ${LIBCXX_TARGET_TRIPLE} CACHE STRING "Target triple.")
86
Michael J. Spencera358fbe2012-11-30 21:02:2987
Michael J. Spencer626916f2010-12-10 19:47:5488# Configure compiler.
89include(config-ix)
Eric Fiselier9071bc02014-10-18 01:15:1790# Configure ABI library
91include(HandleLibCXXABI)
Michael J. Spencer626916f2010-12-10 19:47:5492
93#===============================================================================
94# Setup Compiler Flags
95#===============================================================================
96
97# Get required flags.
98# On all systems the system c++ standard library headers need to be excluded.
99if (MSVC)
100 # MSVC only has -X, which disables all default includes; including the crt.
101 # Thus, we do nothing and hope we don't accidentally include any of the C++
102 # headers.
103else()
104 if (LIBCXX_HAS_NOSTDINCXX_FLAG)
Saleem Abdulrasooleb547812014-03-12 04:11:31105 list(APPEND LIBCXX_CXX_REQUIRED_FLAGS -nostdinc++)
David Fang44ead612014-06-24 20:32:11106 string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
Michael J. Spencer626916f2010-12-10 19:47:54107 endif()
Eric Fiselierdfe5e722014-08-16 01:35:36108 # If c++1y has been enabled then attempt to use it. Fail if it is no supported
109 # by the compiler. Otherwise choose c++11 and ensure the compiler supports it.
110 if (LIBCXX_ENABLE_CXX1Y)
111 if (LIBCXX_HAS_STDCXX1Y_FLAG)
112 set(LIBCXX_STD_VERSION c++1y)
113 else()
114 message(FATAL_ERROR "c++1y was enabled but the compiler does not support it.")
115 endif()
116 else()
117 if (LIBCXX_HAS_STDCXX11_FLAG)
118 set(LIBCXX_STD_VERSION c++11)
119 else()
120 message(FATAL_ERROR "c++11 is required by libc++ but is not supported by the compiler")
121 endif()
Michael J. Spencer626916f2010-12-10 19:47:54122 endif()
Eric Fiselierdfe5e722014-08-16 01:35:36123 # LIBCXX_STD_VERSION should always be set at this point.
124 list(APPEND LIBCXX_CXX_REQUIRED_FLAGS "-std=${LIBCXX_STD_VERSION}")
Michael J. Spencer626916f2010-12-10 19:47:54125endif()
126
127macro(append_if list condition var)
128 if (${condition})
129 list(APPEND ${list} ${var})
130 endif()
131endmacro()
132
133# Get warning flags
Howard Hinnantadb73b12013-10-05 00:07:35134if (NOT MSVC)
135 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WALL_FLAG -Wall)
Saleem Abdulrasooleb547812014-03-12 04:11:31136 list(APPEND LIBCXX_CXX_REQUIRED_FLAGS -Werror=return-type)
Howard Hinnantadb73b12013-10-05 00:07:35137endif()
Marshall Clow0f7afe72013-10-21 15:56:35138
Douglas Gregorf9b6e7e2012-06-07 22:26:00139append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_W_FLAG -W)
140append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG -Wno-unused-parameter)
141append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
142append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_LONG_LONG_FLAG -Wno-long-long)
Michael J. Spencer626916f2010-12-10 19:47:54143if (LIBCXX_ENABLE_WERROR)
Douglas Gregorf9b6e7e2012-06-07 22:26:00144 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WERROR_FLAG -Werror)
145 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WX_FLAG -WX)
Alexey Samsonovf7eb5732013-10-02 07:44:19146else()
147 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_ERROR_FLAG -Wno-error)
148 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_NO_WX_FLAG -WX-)
Michael J. Spencer626916f2010-12-10 19:47:54149endif()
150if (LIBCXX_ENABLE_PEDANTIC)
Douglas Gregorf9b6e7e2012-06-07 22:26:00151 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_PEDANTIC_FLAG -pedantic)
Michael J. Spencer626916f2010-12-10 19:47:54152endif()
153
154# Get feature flags.
155# Exceptions
156if (LIBCXX_ENABLE_EXCEPTIONS)
157 # Catches C++ exceptions only and tells the compiler to assume that extern C
158 # functions never throw a C++ exception.
159 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_EHSC_FLAG -EHsc)
160else()
161 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_NO_EXCEPTIONS)
162 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_EHS_FLAG -EHs-)
163 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_EHA_FLAG -EHa-)
164 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions)
165endif()
166# RTTI
167if (NOT LIBCXX_ENABLE_RTTI)
168 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_NO_RTTI)
169 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_GR_FLAG -GR-)
170 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_FNO_RTTI_FLAG -fno-rtti)
171endif()
172# Assert
Howard Hinnante103a3d2012-08-05 17:37:39173string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
174if (LIBCXX_ENABLE_ASSERTIONS)
Michael J. Spencer626916f2010-12-10 19:47:54175 # MSVC doesn't like _DEBUG on release builds. See PR 4379.
176 if (NOT MSVC)
177 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_DEBUG)
178 endif()
179 # On Release builds cmake automatically defines NDEBUG, so we
180 # explicitly undefine it:
181 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
182 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -UNDEBUG)
183 endif()
184else()
185 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
186 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -DNDEBUG)
187 endif()
188endif()
Howard Hinnant4a0e74f2013-02-25 15:50:36189# Static library
190if (NOT LIBCXX_ENABLE_SHARED)
191 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_BUILD_STATIC)
192endif()
Michael J. Spencer626916f2010-12-10 19:47:54193
194# This is the _ONLY_ place where add_definitions is called.
Marshall Clow0f7afe72013-10-21 15:56:35195if (MSVC)
196 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
197endif()
198
Eric Fiselier25a15162014-08-18 05:03:46199# Configure for sanitizers. If LIBCXX_BUILT_STANDALONE then we have to do
200# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
201if (LIBCXX_BUILT_STANDALONE)
202 # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
203 # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
204 if (LLVM_USE_SANITIZER AND NOT MSVC)
205 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_OMIT_FRAME_POINTER_FLAG
206 "-fno-omit-frame-pointer")
207 if (LLVM_USE_SANITIZER STREQUAL "Address")
208 list(APPEND LIBCXX_CXX_FEATURE_FLAGS "-fsanitize=address")
209 elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
210 list(APPEND LIBCXX_CXX_FEATURE_FLAGS "-fsanitize=memory")
211 if (LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins")
212 list(APPEND LIBCXX_CXX_FEATURE_FLAGS "-fsanitize-memory-track-origins")
213 endif()
Eric Fiselier66d529f2014-10-16 23:21:59214 elseif (LLVM_USE_SANITIZER STREQUAL "Undefined")
215 list(APPEND LIBCXX_CXX_FEATURE_FLAGS
216 "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover")
Eric Fiselier25a15162014-08-18 05:03:46217 else()
218 message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}")
219 endif()
220 elseif(MSVC)
221 message(WARNING "LLVM_USE_SANITIZER is not supported with MSVC")
222 endif()
223endif()
224
Saleem Abdulrasool89a52ff2014-03-12 04:11:28225string(REPLACE ";" " " LIBCXX_CXX_REQUIRED_FLAGS "${LIBCXX_CXX_REQUIRED_FLAGS}")
226set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXX_CXX_REQUIRED_FLAGS}")
227
228string(REPLACE ";" " " LIBCXX_CXX_WARNING_FLAGS "${LIBCXX_CXX_WARNING_FLAGS}")
229set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXX_CXX_WARNING_FLAGS}")
230
231string(REPLACE ";" " " LIBCXX_CXX_FEATURE_FLAGS "${LIBCXX_CXX_FEATURE_FLAGS}")
232set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXX_CXX_FEATURE_FLAGS}")
Michael J. Spencer626916f2010-12-10 19:47:54233
234#===============================================================================
235# Setup Source Code
236#===============================================================================
237
238include_directories(include)
Howard Hinnantc4962b32013-11-15 17:18:57239add_subdirectory(include)
Michael J. Spencer626916f2010-12-10 19:47:54240
241# Add source code. This also contains all of the logic for deciding linker flags
242# soname, etc...
243add_subdirectory(lib)
244
245#===============================================================================
246# Setup Tests
247#===============================================================================
248
249add_subdirectory(test)