blob: 00ea48517821ca158a7c0779917d79aaec910152 [file] [log] [blame]
Michael J. Spencer626916f2010-12-10 19:47:54 +00001# 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
17 ${CMAKE_MODULE_PATH}
18 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
19 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
20 )
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
29#===============================================================================
30# Setup CMake Options
31#===============================================================================
32
33# Define options.
34option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
35option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
36option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
37option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
38option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
39option(LIBCXX_ENABLE_CXX0X "Enable -std=c++0x and use of c++0x language features if the compiler supports it." ON)
40option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
41
42#===============================================================================
43# Configure System
44#===============================================================================
45
46# Get triples.
47include(GetTriple)
48get_host_triple(LIBCXX_HOST_TRIPLE
49 LIBCXX_HOST_ARCH
50 LIBCXX_HOST_VENDOR
51 LIBCXX_HOST_OS
52 )
53set(LIBCXX_HOST_TRIPLE ${LIBCXX_HOST_TRIPLE} CACHE STRING "Host triple.")
54get_target_triple(LIBCXX_TARGET_TRIPLE
55 LIBCXX_TARGET_ARCH
56 LIBCXX_TARGET_VENDOR
57 LIBCXX_TARGET_OS
58 )
59set(LIBCXX_TARGET_TRIPLE ${LIBCXX_TARGET_TRIPLE} CACHE STRING "Target triple.")
60
61# Configure compiler.
62include(config-ix)
63
64#===============================================================================
65# Setup Compiler Flags
66#===============================================================================
67
68# Get required flags.
69# On all systems the system c++ standard library headers need to be excluded.
70if (MSVC)
71 # MSVC only has -X, which disables all default includes; including the crt.
72 # Thus, we do nothing and hope we don't accidentally include any of the C++
73 # headers.
74else()
75 if (LIBCXX_HAS_NOSTDINCXX_FLAG)
76 set(LIBCXX_CXX_REQUIRED_FLAGS -nostdinc++)
77 endif()
78 if (LIBCXX_ENABLE_CXX0X AND LIBCXX_HAS_STDCXX0X_FLAG)
79 list(APPEND LIBCXX_CXX_REQUIRED_FLAGS -std=c++0x)
80 endif()
81endif()
82
83macro(append_if list condition var)
84 if (${condition})
85 list(APPEND ${list} ${var})
86 endif()
87endmacro()
88
89# Get warning flags
Douglas Gregorf9b6e7e2012-06-07 22:26:00 +000090append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WALL_FLAG -Wall)
91append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_W_FLAG -W)
92append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG -Wno-unused-parameter)
93append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
94append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_LONG_LONG_FLAG -Wno-long-long)
Michael J. Spencer626916f2010-12-10 19:47:54 +000095if (LIBCXX_ENABLE_WERROR)
Douglas Gregorf9b6e7e2012-06-07 22:26:00 +000096 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WERROR_FLAG -Werror)
97 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WX_FLAG -WX)
Michael J. Spencer626916f2010-12-10 19:47:54 +000098endif()
99if (LIBCXX_ENABLE_PEDANTIC)
Douglas Gregorf9b6e7e2012-06-07 22:26:00 +0000100 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_PEDANTIC_FLAG -pedantic)
Michael J. Spencer626916f2010-12-10 19:47:54 +0000101endif()
102
103# Get feature flags.
104# Exceptions
105if (LIBCXX_ENABLE_EXCEPTIONS)
106 # Catches C++ exceptions only and tells the compiler to assume that extern C
107 # functions never throw a C++ exception.
108 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_EHSC_FLAG -EHsc)
109else()
110 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_NO_EXCEPTIONS)
111 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_EHS_FLAG -EHs-)
112 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_EHA_FLAG -EHa-)
113 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions)
114endif()
115# RTTI
116if (NOT LIBCXX_ENABLE_RTTI)
117 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_NO_RTTI)
118 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_GR_FLAG -GR-)
119 append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_FNO_RTTI_FLAG -fno-rtti)
120endif()
121# Assert
122if (LLVM_ENABLE_ASSERTIONS)
123 # MSVC doesn't like _DEBUG on release builds. See PR 4379.
124 if (NOT MSVC)
125 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_DEBUG)
126 endif()
127 # On Release builds cmake automatically defines NDEBUG, so we
128 # explicitly undefine it:
129 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
130 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -UNDEBUG)
131 endif()
132else()
133 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
134 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -DNDEBUG)
135 endif()
136endif()
137
138# This is the _ONLY_ place where add_definitions is called.
139add_definitions(
140 ${LIBCXX_CXX_REQUIRED_FLAGS}
141 ${LIBCXX_CXX_WARNING_FLAGS}
142 ${LIBCXX_CXX_FEATURE_FLAGS}
143 )
144
145#===============================================================================
146# Setup Source Code
147#===============================================================================
148
149include_directories(include)
150
151# Add source code. This also contains all of the logic for deciding linker flags
152# soname, etc...
153add_subdirectory(lib)
154
155#===============================================================================
156# Setup Tests
157#===============================================================================
158
159add_subdirectory(test)