-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
473 lines (391 loc) · 17.9 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
project(STP)
cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
if (CMAKE_MAJOR_VERSION GREATER 2)
# FIXME: We need to find a proper way to get the LOCATION property of a target
# when using CMake >= 3.0
cmake_policy(SET CMP0026 OLD) # See cmake --help-policy CMP0026
endif()
# Search paths for custom CMake modules
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules)
set(CMAKE_INSTALL_LIBDIR lib CACHE STRING "Output directory for libraries")
set(STP_TIMESTAMPS ON CACHE BOOL "Enable build with timestamps")
# -----------------------------------------------------------------------------
# Make RelWithDebInfo the default build type if otherwise not set
# -----------------------------------------------------------------------------
set(build_types Debug Release RelWithDebInfo MinSizeRel)
if(NOT CMAKE_BUILD_TYPE)
message(STATUS "You can choose the type of build, options are:${build_types}")
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE String
"Options are ${build_types}"
FORCE
)
# Provide drop down menu options in cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${build_types})
endif()
message(STATUS "Doing a ${CMAKE_BUILD_TYPE} build")
# -----------------------------------------------------------------------------
# Option to enable/disable assertions
# -----------------------------------------------------------------------------
# Filter out definition of NDEBUG from the default build configuration flags.
# We will add this ourselves if we want to disable assertions
foreach (build_config ${build_types})
string(TOUPPER ${build_config} upper_case_build_config)
foreach (language CXX C)
set(VAR_TO_MODIFY "CMAKE_${language}_FLAGS_${upper_case_build_config}")
string(REGEX REPLACE "(^| )[/-]D *NDEBUG($| )"
" "
replacement
"${${VAR_TO_MODIFY}}"
)
#message("Original (${VAR_TO_MODIFY}) is ${${VAR_TO_MODIFY}} replacement is ${replacement}")
set(${VAR_TO_MODIFY} "${replacement}" CACHE STRING "Default flags for ${build_config} configuration" FORCE)
endforeach()
endforeach()
option(ENABLE_ASSERTIONS "Build with assertions enabled" ON)
if (ENABLE_ASSERTIONS)
# NDEBUG was already removed.
else()
# Note this definition doesn't appear in the cache variables.
add_definitions(-DNDEBUG)
endif()
# -----------------------------------------------------------------------------
# Enable LLVM sanitizations.
# Note that check_cxx_compiler_flag doesn't work, a fix is needed here
# -----------------------------------------------------------------------------
macro(add_cxx_flag flagname)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flagname}")
endmacro()
include(MacroPushRequiredVars)
option(SANITIZE "Use Clang sanitizers. This will force using clang++ as the compiler" OFF)
if (SANITIZE)
# Set in Cache so user can tweak it later
SET(CMAKE_CXX_COMPILER "clang++" CACHE FILEPATH "" FORCE)
message("Forcing compiler:${CMAKE_CXX_COMPILER}")
add_cxx_flag("-fsanitize=return")
add_cxx_flag("-fsanitize=bounds")
add_cxx_flag("-fsanitize=integer")
add_cxx_flag("-fsanitize=undefined")
add_cxx_flag("-fsanitize=float-divide-by-zero")
add_cxx_flag("-fsanitize=integer-divide-by-zero")
add_cxx_flag("-fsanitize=null")
add_cxx_flag("-fsanitize=unsigned-integer-overflow")
add_cxx_flag("-fsanitize=address")
add_cxx_flag("-Wno-bitfield-constant-conversion")
endif()
# -----------------------------------------------------------------------------
# Let the user decide if they want to build shared or static client library.
# STP will link against this client library
# -----------------------------------------------------------------------------
option(BUILD_SHARED_LIBS "Build client library as a shared library" ON)
if (WIN32)
# building of shared lib on windows is not done at source level
set(BUILD_SHARED_LIBS OFF)
message(WARNING "Disabling building of shared library on Windows")
else()
option(BUILD_STATIC_BIN "Build a static binary (and no shared libs)" OFF)
if (BUILD_STATIC_BIN)
set(BUILD_SHARED_LIBS OFF)
# Flags for the linker will be set later
endif()
endif()
if (BUILD_SHARED_LIBS)
option(ALSO_BUILD_STATIC_LIB "IF building shared library, also build the static library" ON)
set(STP_SHARED_LIBRARY libstp) # Used for exporting target
if (ALSO_BUILD_STATIC_LIB AND NOT WIN32)
list(APPEND TARGETS_TO_EXPORT libstp_static)
set(STP_STATIC_LIBRARY libstp_static) # Used for exporting target
endif()
else()
set(STP_STATIC_LIBRARY libstp) # Used for exporting target
unset(ALSO_BUILD_STATIC_LIB CACHE) # Hide this option for ccmake and cmake-gui users
endif()
# -----------------------------------------------------------------------------
# Set the appropriate build flags
# -----------------------------------------------------------------------------
include(CheckCXXCompilerFlag)
macro(add_cxx_flag_if_supported flagname)
check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flagname})
if(HAVE_FLAG_${flagname})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flagname}")
endif()
endmacro()
if(BUILD_SHARED_LIBS)
message(STATUS "Building shared library currently broken due to mix of C++/C code")
add_cxx_flag_if_supported("-fPIC")
endif()
check_cxx_compiler_flag("-std=c++11" HAVE_FLAG_STD_CPP11)
check_cxx_compiler_flag("-std=gnu++11" HAVE_FLAG_STD_GNUCPP11)
check_cxx_compiler_flag("-std=gnu++0x" HAVE_FLAG_STD_GNUCPP0X)
check_cxx_compiler_flag("-std=c++0x" HAVE_FLAG_STD_CPP0X)
check_cxx_compiler_flag("-stdlib=libc++" HAVE_FLAG_STDLIB_LIBCPP)
#needed for MiniSat's PRi64 to set stdc++ to 03 temporarily
check_cxx_compiler_flag("-std=c++03" HAVE_FLAG_CPP03)
if(HAVE_FLAG_STD_CPP11)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
elseif(HAVE_FLAG_STD_GNUCPP11)
set(CMAKE_CXX_FLAGS "-std=gnu++11 ${CMAKE_CXX_FLAGS}")
elseif(HAVE_FLAG_STD_GNUCPP0X)
set(CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}")
elseif(HAVE_FLAG_STD_CPP0X)
set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
endif()
if(APPLE AND HAVE_FLAG_STDLIB_LIBCPP)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
endif()
add_cxx_flag_if_supported("-Wall")
add_cxx_flag_if_supported("-Wextra")
add_cxx_flag_if_supported("-pedantic")
add_cxx_flag_if_supported("-Wunused")
add_cxx_flag_if_supported("-Wsign-compare")
add_cxx_flag_if_supported("-Wtype-limits")
add_cxx_flag_if_supported("-Wuninitialized")
add_cxx_flag_if_supported("-Wno-deprecated")
add_cxx_flag_if_supported("-Wstrict-aliasing")
add_cxx_flag_if_supported("-Wpointer-arith")
add_cxx_flag_if_supported("-Wheader-guard")
# add_cxx_flag_if_supported("-fvisibility=hidden")
add_cxx_flag_if_supported("-Wformat-nonliteral")
add_cxx_flag_if_supported("-Winit-self")
add_cxx_flag_if_supported("-Wunreachable-code")
add_definitions("-D__STDC_LIMIT_MACROS")
option(TUNE_NATIVE "Use -mtune=native" OFF)
if(TUNE_NATIVE)
add_cxx_flag_if_supported("-mtune=native")
endif()
if(WIN32)
set(FLEX_PATH_HINT "e:/cygwin/bin" CACHE STRING "Flex path hints, can be null if on your path")
set(BISON_PATH_HINT "e:/cygwin/bin" CACHE STRING "Bison path hints, can be null if on your path")
set(PERL_PATH_HINT "C:/Perl/bin" CACHE STRING "Perl path hints, can be null if on your pat")
set(PHINTS ${PERL_PATH_HINT} ${FLEX_PATH_HINT} ${BISON_PATH_HINT})
if(MSVC)
set(OPTIMIZITION_FLAGS "/GL /Ox /Oi /Ot /Oy")
set(STP_DEFS_COMM ${STP_DEFS_COMM} -D_CRT_SECURE_NO_WARNINGS)
set(STP_INCL_COMM windows/winports windows/winports/msc99hdr ${STP_INCL_COMM})
include_directories(${STP_INCL_COMM})
# stack size of MSVC must be specified
string(REGEX REPLACE "/STACK:[0-9]+" "" CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS})
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:256000000")
# inline is not a keyword in visual studios old C version, allow its redefinition
add_definitions("-D_ALLOW_KEYWORD_MACROS")
else()
# mingw
set(STP_DEFS_COMM ${STP_DEFS_COMM} -DEXT_HASH_MAP)
endif()
add_definitions(${STP_DEFS_COMM})
endif()
# -----------------------------------------------------------------------------
# Determine the locations of C++ hash_set and hash_map
# -----------------------------------------------------------------------------
include(CheckCxxHashSet)
check_cxx_hashset()
include(CheckCxxHashMultiSet)
check_cxx_hashmultiset()
include(CheckCxxHashMap)
check_cxx_hashmap()
# -----------------------------------------------------------------------------
# Add GIT version
# -----------------------------------------------------------------------------
function(SetVersionNumber PREFIX VERSION_MAJOR VERSION_MINOR VERSION_PATCH)
set(${PREFIX}_VERSION_MAJOR ${VERSION_MAJOR} PARENT_SCOPE)
set(${PREFIX}_VERSION_MINOR ${VERSION_MINOR} PARENT_SCOPE)
set(${PREFIX}_VERSION_PATCH ${VERSION_PATCH} PARENT_SCOPE)
set(${PREFIX}_VERSION
"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
PARENT_SCOPE)
endfunction()
find_program (GIT_EXECUTABLE git)
if (GIT_EXECUTABLE)
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA)
MESSAGE(STATUS "GIT hash found: ${GIT_SHA}")
else()
set(GIT_SHA "GIT-hash-notfound")
endif()
set(STP_FULL_VERSION "2.0.99")
string(REPLACE "." ";" STP_FULL_VERSION_LIST ${STP_FULL_VERSION})
SetVersionNumber("PROJECT" ${STP_FULL_VERSION_LIST})
MESSAGE(STATUS "PROJECT_VERSION: ${PROJECT_VERSION}")
MESSAGE(STATUS "PROJECT_VERSION_MAJOR: ${PROJECT_VERSION_MAJOR}")
MESSAGE(STATUS "PROJECT_VERSION_MINOR: ${PROJECT_VERSION_MINOR}")
MESSAGE(STATUS "PROJECT_VERSION_PATCH: ${PROJECT_VERSION_PATCH}")
# -----------------------------------------------------------------------------
# Write out the config.h
# -----------------------------------------------------------------------------
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/include/stp/config.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/include/stp/config.h"
)
# -----------------------------------------------------------------------------
# Set up includes
# -----------------------------------------------------------------------------
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
include_directories("${CMAKE_CURRENT_BINARY_DIR}/include")
# FIXME: External library includes
include_directories(# For extlib-abc and extlib-constbv
${PROJECT_SOURCE_DIR}/lib
)
# -----------------------------------------------------------------------------
# Uncomment these for static compilation under Linux (messes up Valgrind)
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# Find the Boost package components
# -----------------------------------------------------------------------------
if(NOT BUILD_SHARED_LIBS)
message("Trying to use static Boost and Minisat libraries")
set(Boost_USE_STATIC_LIBS ON)
set(Minisat_USE_STATIC_LIBS ON)
set(CryptoMiniSat_USE_STATIC_LIBS ON)
endif()
option(NO_BOOST "Don't try to use boost" OFF)
if (NOT NO_BOOST)
find_package( Boost 1.46 COMPONENTS program_options)
endif()
if(NOT Boost_FOUND)
message(STATUS "Only building executable with few command-line options because the boost program_options library were not available")
else()
include_directories(${Boost_INCLUDE_DIRS})
endif()
# -----------------------------------------------------------------------------
# Find CryptoMiniSat4
# -----------------------------------------------------------------------------
set(cryptominisat4_DIR "" CACHE PATH "Path to directory containing cryptominisat4Config.cmake")
find_package(cryptominisat4 CONFIG)
if (cryptominisat4_FOUND AND HAVE_FLAG_STD_CPP11)
message(STATUS "Found CryptoMiniSat4 and C++11, allowing --cryptominisat4 option")
message(STATUS "CryptoMiniSat4 dynamic lib: ${CRYPTOMINISAT4_LIBRARIES}")
message(STATUS "CryptoMiniSat4 static lib: ${CRYPTOMINISAT4_STATIC_LIBRARIES}")
message(STATUS "CryptoMiniSat4 static lib deps: ${CRYPTOMINISAT4_STATIC_LIBRARIES_DEPS}")
add_definitions(-DUSE_CRYPTOMINISAT4)
include_directories(${CRYPTOMINISAT4_INCLUDE_DIRS})
set(USE_CRYPTOMINISAT4 ON)
else()
message(WARNING "CryptoMiniSat4 (v4.2 or above) or C++11 support not found, not allowing --cryptominisat4 option")
endif()
# -----------------------------------------------------------------------------
# Find Minisat
# -----------------------------------------------------------------------------
find_package(minisat)
if (NOT MINISAT_FOUND)
message(FATAL_ERROR "You must install minisat from https://github.com/niklasso/minisat")
else()
message(STATUS "OK, found Minisat library under ${MINISAT_LIBRARIES} and Minisat include dirs under ${MINISAT_INCLUDE_DIRS}")
endif()
include_directories(${MINISAT_INCLUDE_DIRS})
set(LIBS ${LIBS} ${MINISAT_LIBRARIES})
# -----------------------------------------------------------------------------
# Find Parser and Lexer generators
# -----------------------------------------------------------------------------
find_package(BISON REQUIRED)
find_package(FLEX REQUIRED)
# -----------------------------------------------------------------------------
# Setup library build path (this is **not** the library install path)
# -----------------------------------------------------------------------------
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
# -----------------------------------------------------------------------------
# Provide an export name to be used by targets that wish to export themselves.
# -----------------------------------------------------------------------------
set(STP_EXPORT_NAME "STPTargets")
# -----------------------------------------------------------------------------
# Testing and Python interface options
# -----------------------------------------------------------------------------
option(ENABLE_TESTING "Enable testing" OFF)
option(ENABLE_PYTHON_INTERFACE "Enable Python interface" ON)
if (ENABLE_PYTHON_INTERFACE AND NOT BUILD_SHARED_LIBS)
message(FATAL_ERROR "Python interface requires shared library")
endif()
# Both the testing infrastructure and python interface depend on python
if(ENABLE_TESTING OR ENABLE_PYTHON_INTERFACE)
find_package(PythonInterp REQUIRED)
mark_as_advanced(CLEAR PYTHON_EXECUTABLE) # Make visible in cmake-gui/ccmake
if(NOT PYTHONINTERP_FOUND)
message(FATAL_ERROR "Python cannot be found. Please install it or disable testing and/or python interface")
endif()
endif()
# -----------------------------------------------------------------------------
# Compile all subdirs
# -----------------------------------------------------------------------------
message(STATUS "Final CXX flags ${CMAKE_CXX_FLAGS}")
add_subdirectory(lib)
add_subdirectory(tools)
add_subdirectory(bindings)
# -----------------------------------------------------------------------------
# Add uninstall target for makefiles
# -----------------------------------------------------------------------------
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY
)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
)
# -----------------------------------------------------------------------------
# Add tests if required
# -----------------------------------------------------------------------------
if(ENABLE_TESTING)
message(STATUS "Testing is enabled")
set(UNIT_TEST_EXE_SUFFIX "Tests" CACHE STRING "Suffix for Unit test executable")
add_custom_target(check
COMMENT "top level target to invoke all other tests"
)
add_subdirectory(tests)
else()
message(WARNING "Testing is disabled")
endif()
# -----------------------------------------------------------------------------
# Export our targets so that other CMake based projects can interface with
# the build of STP in the build-tree
# -----------------------------------------------------------------------------
set(STP_TARGETS_FILENAME "STPTargets.cmake")
set(STP_CONFIG_FILENAME "STPConfig.cmake")
set(STP_CONFIG_VERSION_FILENAME "STPConfigVersion.cmake")
# Export targets
if (Boost_FOUND)
export(TARGETS stp stp_simple ${STP_SHARED_LIBRARY} ${STP_STATIC_LIBRARY}
FILE "${PROJECT_BINARY_DIR}/${STP_TARGETS_FILENAME}"
)
else()
export(TARGETS stp_simple ${STP_SHARED_LIBRARY} ${STP_STATIC_LIBRARY}
FILE "${PROJECT_BINARY_DIR}/${STP_TARGETS_FILENAME}"
)
endif()
# Create STPConfig file
set(EXPORT_TYPE "Build-tree")
set(CONF_INCLUDE_DIRS "${PROJECT_BINARY_DIR}/include")
configure_file(STPConfig.cmake.in
"${PROJECT_BINARY_DIR}/${STP_CONFIG_FILENAME}" @ONLY
)
configure_file(STPConfigVersion.cmake.in
"${PROJECT_BINARY_DIR}/${STP_CONFIG_VERSION_FILENAME}" @ONLY
)
# Export this package to the CMake user package registry
# Now the user can just use find_package(STP) on their system
export(PACKAGE STP)
# -----------------------------------------------------------------------------
# Export our targets so that other CMake based projects can interface with
# the build of STP that is installed.
# -----------------------------------------------------------------------------
if(WIN32 AND NOT CYGWIN)
set(DEF_INSTALL_CMAKE_DIR CMake)
else()
set(DEF_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/STP)
endif()
set(STP_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
"Installation directory for STP CMake files"
)
# Create STPConfig file
set(EXPORT_TYPE "installed")
set(CONF_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
configure_file(STPConfig.cmake.in
"${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${STP_CONFIG_FILENAME}" @ONLY
)
install(FILES
"${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${STP_CONFIG_FILENAME}"
"${PROJECT_BINARY_DIR}/${STP_CONFIG_VERSION_FILENAME}"
DESTINATION "${STP_INSTALL_CMAKE_DIR}"
)
# Install the export set for use with the install-tree
install(EXPORT ${STP_EXPORT_NAME} DESTINATION
"${STP_INSTALL_CMAKE_DIR}"
)