Reverted to correct commit this time.
[lldb.git] / libcxx / CMakeLists.txt
1 # See www/CMake.html for instructions on how to build libcxx with CMake.
2
3 #===============================================================================
4 # Setup Project
5 #===============================================================================
6
7 project(libcxx CXX C)
8 cmake_minimum_required(VERSION 2.8)
9
10 set(PACKAGE_NAME libcxx)
11 set(PACKAGE_VERSION trunk-svn)
12 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
13 set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
14
15 # Add path for custom modules
16 set(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.
23 include(MacroEnsureOutOfSourceBuild)
24 MACRO_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.
34 option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
35 option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
36 option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
37 option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
38 option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
39 option(LIBCXX_ENABLE_CXX0X "Enable -std=c++0x and use of c++0x language features if the compiler supports it." ON)
40 option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
41
42 #===============================================================================
43 # Configure System
44 #===============================================================================
45
46 # Get triples.
47 include(GetTriple)
48 get_host_triple(LIBCXX_HOST_TRIPLE
49   LIBCXX_HOST_ARCH
50   LIBCXX_HOST_VENDOR
51   LIBCXX_HOST_OS
52   )
53 set(LIBCXX_HOST_TRIPLE ${LIBCXX_HOST_TRIPLE} CACHE STRING "Host triple.")
54 get_target_triple(LIBCXX_TARGET_TRIPLE
55   LIBCXX_TARGET_ARCH
56   LIBCXX_TARGET_VENDOR
57   LIBCXX_TARGET_OS
58   )
59 set(LIBCXX_TARGET_TRIPLE ${LIBCXX_TARGET_TRIPLE} CACHE STRING "Target triple.")
60
61 # Configure compiler.
62 include(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.
70 if (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.
74 else()
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()
81 endif()
82
83 macro(append_if list condition var)
84   if (${condition})
85     list(APPEND ${list} ${var})
86   endif()
87 endmacro()
88
89 # Get warning flags
90 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WALL_FLAG -Wall)
91 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_W_FLAG -W)
92 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG -Wno-unused-parameter)
93 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
94 append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_LONG_LONG_FLAG -Wno-long-long)
95 if (LIBCXX_ENABLE_WERROR)
96   append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WERROR_FLAG -Werror)
97   append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WX_FLAG -WX)
98 endif()
99 if (LIBCXX_ENABLE_PEDANTIC)
100   append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_PEDANTIC_FLAG -pedantic)
101 endif()
102
103 # Get feature flags.
104 # Exceptions
105 if (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)
109 else()
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)
114 endif()
115 # RTTI
116 if (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)
120 endif()
121 # Assert
122 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
123 if (LIBCXX_ENABLE_ASSERTIONS)
124   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
125   if (NOT MSVC)
126     list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_DEBUG)
127   endif()
128   # On Release builds cmake automatically defines NDEBUG, so we
129   # explicitly undefine it:
130   if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
131     list(APPEND LIBCXX_CXX_FEATURE_FLAGS -UNDEBUG)
132   endif()
133 else()
134   if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
135     list(APPEND LIBCXX_CXX_FEATURE_FLAGS -DNDEBUG)
136   endif()
137 endif()
138
139 # This is the _ONLY_ place where add_definitions is called.
140 add_definitions(
141  ${LIBCXX_CXX_REQUIRED_FLAGS}
142  ${LIBCXX_CXX_WARNING_FLAGS}
143  ${LIBCXX_CXX_FEATURE_FLAGS}
144  )
145
146 #===============================================================================
147 # Setup Source Code
148 #===============================================================================
149
150 include_directories(include)
151
152 # Add source code. This also contains all of the logic for deciding linker flags
153 # soname, etc...
154 add_subdirectory(lib)
155
156 #===============================================================================
157 # Setup Tests
158 #===============================================================================
159
160 add_subdirectory(test)