2
2
# Setup Project
3
3
#===============================================================================
4
4
5
- cmake_minimum_required (VERSION 2.8.8 )
5
+ cmake_minimum_required (VERSION 3.4.3 )
6
6
7
7
if (POLICY CMP0042)
8
8
cmake_policy (SET CMP0042 NEW) # Set MACOSX_RPATH=YES by default
9
9
endif ()
10
10
11
+ # Add path for custom modules
12
+ set (CMAKE_MODULE_PATH
13
+ "${CMAKE_CURRENT_SOURCE_DIR} /cmake"
14
+ "${CMAKE_CURRENT_SOURCE_DIR} /cmake/Modules"
15
+ ${CMAKE_MODULE_PATH}
16
+ )
17
+
11
18
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
12
19
project (libunwind)
13
20
14
21
# Rely on llvm-config.
15
22
set (CONFIG_OUTPUT)
16
- find_program (LLVM_CONFIG "llvm-config" )
23
+ if (NOT LLVM_CONFIG_PATH)
24
+ find_program (LLVM_CONFIG_PATH "llvm-config" )
25
+ endif ()
17
26
if (DEFINED LLVM_PATH)
18
27
set (LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include" )
19
28
set (LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree" )
20
29
set (LLVM_MAIN_SRC_DIR ${LLVM_PATH} )
21
30
set (LLVM_CMAKE_PATH "${LLVM_PATH} /cmake/modules" )
22
- elseif (LLVM_CONFIG )
23
- message (STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG } " )
24
- set (CONFIG_COMMAND ${LLVM_CONFIG } "--includedir" "--prefix" "--src-root" )
31
+ elseif (LLVM_CONFIG_PATH )
32
+ message (STATUS "Found LLVM_CONFIG_PATH as ${LLVM_CONFIG_PATH } " )
33
+ set (CONFIG_COMMAND ${LLVM_CONFIG_PATH } "--includedir" "--prefix" "--src-root" )
25
34
execute_process (COMMAND ${CONFIG_COMMAND}
26
35
RESULT_VARIABLE HAD_ERROR
27
36
OUTPUT_VARIABLE CONFIG_OUTPUT)
28
37
if (NOT HAD_ERROR)
29
38
string (REGEX REPLACE "[ \t ]*[\r\n ]+[ \t ]*" ";"
30
39
CONFIG_OUTPUT ${CONFIG_OUTPUT} )
31
- else ()
40
+ else ()
32
41
string (REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND} " )
33
42
message (STATUS "${CONFIG_COMMAND_STR} " )
34
43
message (FATAL_ERROR "llvm-config failed with status ${HAD_ERROR} " )
35
- endif ()
44
+ endif ()
36
45
37
46
list (GET CONFIG_OUTPUT 0 INCLUDE_DIR)
38
47
list (GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
@@ -41,51 +50,63 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
41
50
set (LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include" )
42
51
set (LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree" )
43
52
set (LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree" )
44
- set (LLVM_CMAKE_PATH "${LLVM_BINARY_DIR} /share/llvm/cmake" )
45
53
set (LLVM_LIT_PATH "${LLVM_PATH} /utils/lit/lit.py" )
46
- else ()
54
+
55
+ # --cmakedir is supported since llvm r291218 (4.0 release)
56
+ execute_process (
57
+ COMMAND ${LLVM_CONFIG_PATH} --cmakedir
58
+ RESULT_VARIABLE HAD_ERROR
59
+ OUTPUT_VARIABLE CONFIG_OUTPUT
60
+ ERROR_QUIET)
61
+ if (NOT HAD_ERROR)
62
+ string (STRIP "${CONFIG_OUTPUT} " LLVM_CMAKE_PATH)
63
+ else ()
64
+ set (LLVM_CMAKE_PATH
65
+ "${LLVM_BINARY_DIR} /lib${LLVM_LIBDIR_SUFFIX} /cmake/llvm" )
66
+ endif ()
67
+ else ()
47
68
message (FATAL_ERROR "llvm-config not found and LLVM_MAIN_SRC_DIR not defined. "
48
69
"Reconfigure with -DLLVM_CONFIG=path/to/llvm-config "
49
70
"or -DLLVM_PATH=path/to/llvm-source-root." )
50
- endif ()
71
+ endif ()
51
72
52
73
if (EXISTS ${LLVM_CMAKE_PATH} )
53
74
list (APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH} " )
54
75
include ("${LLVM_CMAKE_PATH} /AddLLVM.cmake" )
55
76
include ("${LLVM_CMAKE_PATH} /HandleLLVMOptions.cmake" )
56
- else ()
77
+ else ()
57
78
message (FATAL_ERROR "Not found: ${LLVM_CMAKE_PATH} " )
58
- endif ()
79
+ endif ()
59
80
60
81
set (PACKAGE_NAME libunwind)
61
- set (PACKAGE_VERSION 3.8 .0svn)
82
+ set (PACKAGE_VERSION 5.0 .0svn)
62
83
set (PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION} " )
63
84
set (PACKAGE_BUGREPORT
"[email protected] " )
64
85
65
86
if (EXISTS ${LLVM_MAIN_SRC_DIR} /utils/lit/lit.py)
66
87
set (LLVM_LIT ${LLVM_MAIN_SRC_DIR} /utils/lit/lit.py)
67
- else ()
88
+ else ()
68
89
# Seek installed Lit.
69
90
find_program (LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR} /utils/lit
70
91
DOC "Path to lit.py" )
71
- endif ()
92
+ endif ()
72
93
73
94
if (LLVM_LIT)
74
95
# Define the default arguments to use with 'lit', and an option for the user
75
96
# to override.
76
97
set (LIT_ARGS_DEFAULT "-sv" )
77
98
if (MSVC OR XCODE)
78
99
set (LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar" )
79
- endif ()
100
+ endif ()
80
101
set (LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT} " CACHE STRING "Default options for lit" )
81
102
82
103
# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
83
104
if (WIN32 AND NOT CYGWIN )
84
105
set (LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools" )
85
- endif ()
86
- else ()
106
+ endif ()
107
+ else ()
87
108
set (LLVM_INCLUDE_TESTS OFF )
88
- endif ()
109
+ endif ()
89
110
90
111
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /lib${LLVM_LIBDIR_SUFFIX} )
91
112
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /lib${LLVM_LIBDIR_SUFFIX} )
@@ -97,15 +118,37 @@ endif()
97
118
#===============================================================================
98
119
# Setup CMake Options
99
120
#===============================================================================
121
+ include (HandleCompilerRT)
100
122
101
123
# Define options.
124
+ option (LIBUNWIND_BUILD_32_BITS "Build 32 bit libunwind" ${LLVM_BUILD_32_BITS} )
102
125
option (LIBUNWIND_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON )
103
126
option (LIBUNWIND_ENABLE_PEDANTIC "Compile with pedantic enabled." ON )
104
127
option (LIBUNWIND_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF )
105
128
option (LIBUNWIND_ENABLE_SHARED "Build libunwind as a shared library." ON )
129
+ option (LIBUNWIND_ENABLE_STATIC "Build libunwind as a static library." ON )
130
+ option (LIBUNWIND_ENABLE_CROSS_UNWINDING "Enable cross-platform unwinding support." OFF )
131
+ option (LIBUNWIND_ENABLE_ARM_WMMX "Enable unwinding support for ARM WMMX registers." OFF )
132
+ option (LIBUNWIND_ENABLE_THREADS "Build libunwind with threading support." ON )
133
+ option (LIBUNWIND_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF )
134
+ option (LIBUNWIND_INCLUDE_DOCS "Build the libunwind documentation." ${LLVM_INCLUDE_DOCS} )
135
+
136
+ set (LIBUNWIND_TARGET_TRIPLE "" CACHE STRING "Target triple for cross compiling." )
137
+ set (LIBUNWIND_GCC_TOOLCHAIN "" CACHE PATH "GCC toolchain for cross compiling." )
138
+ set (LIBUNWIND_SYSROOT "" CACHE PATH "Sysroot for cross compiling." )
139
+
140
+ if (NOT LIBUNWIND_ENABLE_SHARED AND NOT LIBUNWIND_ENABLE_STATIC)
141
+ message (FATAL_ERROR "libunwind must be built as either a shared or static library." )
142
+ endif ()
106
143
107
- set (LIBUNWIND_GCC_TOOLCHAIN "" CACHE STRING "GCC toolchain for cross compiling." )
108
- set (LIBUNWIND_SYSROOT "" CACHE STRING "Sysroot for cross compiling." )
144
+ # Check that we can build with 32 bits if requested.
145
+ if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
146
+ if (LIBUNWIND_BUILD_32_BITS AND NOT LLVM_BUILD_32_BITS) # Don't duplicate the output from LLVM
147
+ message (STATUS "Building 32 bits executables and libraries." )
148
+ endif ()
149
+ elseif (LIBUNWIND_BUILD_32_BITS)
150
+ message (FATAL_ERROR "LIBUNWIND_BUILD_32_BITS=ON is not supported on this platform." )
151
+ endif ()
109
152
110
153
#===============================================================================
111
154
# Configure System
@@ -116,17 +159,15 @@ set(CMAKE_MODULE_PATH
116
159
"${CMAKE_CURRENT_SOURCE_DIR} /cmake"
117
160
${CMAKE_MODULE_PATH} )
118
161
119
- # Configure compiler.
120
- include (config-ix)
121
-
122
162
set (LIBUNWIND_COMPILER ${CMAKE_CXX_COMPILER} )
123
163
set (LIBUNWIND_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
124
164
set (LIBUNWIND_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} )
125
165
set (LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR} /lib${LLVM_LIBDIR_SUFFIX} )
126
166
127
- #===============================================================================
128
- # Setup Compiler Flags
129
- #===============================================================================
167
+ set (LIBUNWIND_C_FLAGS "" )
168
+ set (LIBUNWIND_CXX_FLAGS "" )
169
+ set (LIBUNWIND_COMPILE_FLAGS "" )
170
+ set (LIBUNWIND_LINK_FLAGS "" )
130
171
131
172
# Get required flags.
132
173
macro (append_if list condition var)
@@ -135,10 +176,33 @@ macro(append_if list condition var)
135
176
endif ()
136
177
endmacro ()
137
178
138
- set (LIBUNWIND_C_FLAGS "" )
139
- set (LIBUNWIND_CXX_FLAGS "" )
140
- set (LIBUNWIND_COMPILE_FLAGS "" )
141
- set (LIBUNWIND_LINK_FLAGS "" )
179
+ macro (add_target_flags_if condition var)
180
+ if (${condition} )
181
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${var} " )
182
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${var} " )
183
+ list (APPEND LIBUNWIND_COMPILE_FLAGS ${var} )
184
+ list (APPEND LIBUNWIND_LINK_FLAGS ${var} )
185
+ endif ()
186
+ endmacro ()
187
+
188
+ add_target_flags_if(LIBUNWIND_BUILD_32_BITS "-m32" )
189
+ add_target_flags_if(LIBUNWIND_TARGET_TRIPLE
190
+ "--target=${LIBUNWIND_TARGET_TRIPLE} " )
191
+ add_target_flags_if(LIBUNWIND_GCC_TOOLCHAIN
192
+ "--gcc-toolchain=${LIBUNWIND_GCC_TOOLCHAIN} " )
193
+ add_target_flags_if(LIBUNWIND_SYSROOT
194
+ "--sysroot=${LIBUNWIND_SYSROOT} " )
195
+
196
+ # Configure compiler.
197
+ include (config-ix)
198
+
199
+ if (LIBUNWIND_USE_COMPILER_RT)
200
+ list (APPEND LIBUNWIND_LINK_FLAGS "-rtlib=compiler-rt" )
201
+ endif ()
202
+
203
+ #===============================================================================
204
+ # Setup Compiler Flags
205
+ #===============================================================================
142
206
143
207
append_if(LIBUNWIND_COMPILE_FLAGS LIBUNWIND_HAS_WERROR_FLAG -Werror=return-type )
144
208
@@ -189,36 +253,71 @@ if (LIBUNWIND_ENABLE_ASSERTIONS)
189
253
# MSVC doesn't like _DEBUG on release builds. See PR 4379.
190
254
if (NOT MSVC )
191
255
list (APPEND LIBUNWIND_COMPILE_FLAGS -D_DEBUG)
192
- endif ()
256
+ endif ()
193
257
194
258
# On Release builds cmake automatically defines NDEBUG, so we
195
259
# explicitly undefine it:
196
260
if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
197
261
list (APPEND LIBUNWIND_COMPILE_FLAGS -UNDEBUG)
198
- endif ()
262
+ endif ()
199
263
else ()
200
264
if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
201
265
list (APPEND LIBUNWIND_COMPILE_FLAGS -DNDEBUG)
202
- endif ()
203
- endif ()
266
+ endif ()
267
+ endif ()
268
+
269
+ # Cross-unwinding
270
+ if (NOT LIBUNWIND_ENABLE_CROSS_UNWINDING)
271
+ list (APPEND LIBUNWIND_COMPILE_FLAGS -D_LIBUNWIND_IS_NATIVE_ONLY)
272
+ endif ()
273
+
274
+ # Threading-support
275
+ if (NOT LIBUNWIND_ENABLE_THREADS)
276
+ list (APPEND LIBUNWIND_COMPILE_FLAGS -D_LIBUNWIND_HAS_NO_THREADS)
277
+ endif ()
278
+
279
+ # ARM WMMX register support
280
+ if (LIBUNWIND_ENABLE_ARM_WMMX)
281
+ # __ARM_WMMX is a compiler pre-define (as per the ACLE 2.0). Clang does not
282
+ # define this macro for any supported target at present. Therefore, here we
283
+ # provide the option to explicitly enable support for WMMX registers in the
284
+ # unwinder.
285
+ list (APPEND LIBUNWIND_COMPILE_FLAGS -D__ARM_WMMX)
286
+ endif ()
204
287
205
288
# This is the _ONLY_ place where add_definitions is called.
206
289
if (MSVC )
207
290
add_definitions (-D_CRT_SECURE_NO_WARNINGS)
208
- endif ()
209
-
210
- append_if(LIBUNWIND_COMPILE_FLAGS LIBUNWIND_TARGET_TRIPLE
211
- "-target ${LIBUNWIND_TARGET_TRIPLE} " )
212
- append_if(LIBUNWIND_COMPILE_FLAGS LIBUNWIND_GCC_TOOLCHAIN
213
- "-gcc-toolchain ${LIBUNWIND_GCC_TOOLCHAIN} " )
214
- append_if(LIBUNWIND_COMPILE_FLAGS LIBUNWIND_SYSROOT
215
- "--sysroot=${LIBUNWIND_SYSROOT} " )
291
+ endif ()
216
292
217
293
#===============================================================================
218
294
# Setup Source Code
219
295
#===============================================================================
220
296
221
297
include_directories (include )
222
298
299
+ find_path (
300
+ LIBUNWIND_LIBCXX_INCLUDES_INTERNAL
301
+ __libcpp_version
302
+ PATHS ${LLVM_MAIN_SRC_DIR} /projects/libcxx/include
303
+ ${LLVM_MAIN_SRC_DIR} /runtimes/libcxx/include
304
+ NO_DEFAULT_PATH
305
+ )
306
+ if ((NOT LIBUNWIND_STANDALONE_BUILD OR HAVE_LIBCXX) AND
307
+ IS_DIRECTORY "${LIBUNWIND_LIBCXX_INCLUDES_INTERNAL} " )
308
+ set (LIBUNWIND_CXX_INCLUDE_PATHS_DEFAULT "${LIBUNWIND_LIBCXX_INCLUDES_INTERNAL} " )
309
+ endif ()
310
+
311
+ set (LIBUNWIND_CXX_INCLUDE_PATHS "${LIBUNWIND_CXX_INCLUDE_PATHS_DEFAULT} " CACHE PATH
312
+ "Paths to C++ header directories separated by ';'." )
313
+
314
+ if (NOT LIBUNWIND_CXX_INCLUDE_PATHS STREQUAL "" )
315
+ list (APPEND LIBUNWIND_CXX_FLAGS -nostdinc++)
316
+ include_directories ("${LIBUNWIND_CXX_INCLUDE_PATHS} " )
317
+ endif ()
318
+
223
319
add_subdirectory (src)
224
320
321
+ if (LIBUNWIND_INCLUDE_DOCS)
322
+ add_subdirectory (docs)
323
+ endif ()
0 commit comments