forked from msoos/cryptominisat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
458 lines (397 loc) · 17 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
cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR)
set(CPACK_PACKAGE_NAME "cryptominisat")
set(CPACK_PACKAGE_VENDOR "www.msoos.org")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A general-purpose award-winning SAT solver")
set(CPACK_PACKAGE_VERSION_MAJOR "4")
set(CPACK_PACKAGE_VERSION_MINOR "2")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
# -----------------------------------------------------------------------------
# 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()
PROJECT(cryptominisat4)
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()
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) #m4-extra contains some library search cmake stuff
macro(add_cxx_flag flagname)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flagname}")
endmacro()
option(SANITIZE "Use Clang sanitizers. This will force using clang++ as the compiler" OFF)
if (SANITIZE)
#SET (CMAKE_CXX_COMPILER "clang++")
SET (CMAKE_CXX_COMPILER "/home/soos/development/smt/souper/third_party/llvm/RelWithDebInfo/bin/clang++")
#add_cxx_flag("-fsanitize=address")
add_cxx_flag("-fsanitize=integer")
#add_cxx_flag("-fsanitize=undefined")
#add_cxx_flag("-fsanitize=null")
add_cxx_flag("-fsanitize=alignment")
#add_cxx_flag("-fno-sanitize-recover")
add_cxx_flag("-fsanitize=return")
add_cxx_flag("-fsanitize=bounds")
add_cxx_flag("-fsanitize=float-divide-by-zero")
add_cxx_flag("-fsanitize=integer-divide-by-zero")
add_cxx_flag("-fsanitize=unsigned-integer-overflow")
add_cxx_flag("-fsanitize=signed-integer-overflow")
add_cxx_flag("-fsanitize=bool")
add_cxx_flag("-fsanitize=enum")
add_cxx_flag("-fsanitize=float-cast-overflow")
add_cxx_flag("-Wno-bitfield-constant-conversion")
#add_cxx_flag("-Weverything")
add_cxx_flag("-Wshadow")
#add_cxx_flag("-Wshorten-64-to-32")
#add_cxx_flag("-Wweak-vtables")
add_cxx_flag("-Wextra-semi")
#add_cxx_flag("-Wsign-conversion")
add_cxx_flag("-Wdeprecated")
#add_cxx_flag("-fPIC")
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie")
endif()
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()
add_cxx_flag_if_supported("-fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -g")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -mtune=native")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -g0 -DNDEBUG -mtune=native")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
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}")
message(STATUS "flag ${flagname} supported")
else()
message(STATUS "flag ${flagname} NOT supported")
endif()
endmacro()
add_cxx_flag_if_supported("-Wall")
add_cxx_flag_if_supported("-Wextra")
add_cxx_flag_if_supported("-Wunused")
add_cxx_flag_if_supported("-pedantic")
add_cxx_flag_if_supported("-Wsign-compare")
add_cxx_flag_if_supported("-fno-omit-frame-pointer")
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("-fopt-info")
# -----------------------------------------------------------------------------
# Uncomment these for static compilation under Linux (messes up Valgrind)
# -----------------------------------------------------------------------------
option(STATICCOMPILE "Compile to static executable (only works on linux)" OFF)
if(STATICCOMPILE AND (${CMAKE_SYSTEM_NAME} MATCHES "Linux"))
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(Boost_USE_STATIC_LIBS ON)
set(CMAKE_EXE_LINKER_FLAGS "-static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive")
set(NOMYSQL ON)
else()
add_definitions(-DBOOST_TEST_DYN_LINK)
endif()
option(SLOW_DEBUG "Use more debug flags" OFF)
IF(SLOW_DEBUG)
add_definitions(-DSLOW_DEBUG)
endif()
option(ENABLE_TESTING "Enable testing" OFF)
# -----------------------------------------------------------------------------
# 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(CMS_FULL_VERSION "4.1.99")
string(REPLACE "." ";" CMS_FULL_VERSION_LIST ${CMS_FULL_VERSION})
SetVersionNumber("PROJECT" ${CMS_FULL_VERSION_LIST})
SetVersionNumber("CPACK_PACKAGE" ${CMS_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}")
option(ONLY_SIMPLE "Only build very simplistic executable -- no Boost needed" OFF)
if (NOT ONLY_SIMPLE)
set (boost_components "")
if (ENABLE_TESTING)
set(boost_components ${boost_components} unit_test_framework)
endif()
set(boost_components ${boost_components} program_options)
find_package( Boost 1.46 COMPONENTS ${boost_components})
endif()
if(NOT Boost_FOUND)
set(ONLY_SIMPLE ON)
set(ENABLE_TESTING OFF)
message(STATUS "Only building executable with few command-line options because the boost program_options library were not available")
endif()
option(ALSO_BUILD_STATIC_LIB "Also build the static library" ON)
find_package (Threads REQUIRED)
option(NOTBB "Try to use Threading Building Blocks of Intel" OFF)
if (NOT NOTBB)
find_package (TBB)
if (TBB_FOUND)
message(STATUS "OK, found Intel TBB")
add_definitions(-DUSE_TBB)
else()
message(STATUS "Did not find Intel Threading Buliding Blocks. Threads will be slower to allocate memory")
endif()
endif()
option(STATS "Don't use statistics at all" OFF)
if (STATS)
add_definitions( -DSTATS_NEEDED )
if (NOT NOMYSQL)
find_package(MySQL)
IF (MYSQL_FOUND)
MESSAGE(STATUS "OK, Found MySQL!")
include_directories(${MySQL_INCLUDE_DIR})
link_directories(${MySQL_LIB_DIR})
add_definitions( -DUSE_MYSQL )
else ()
MESSAGE(STATUS "WARNING: Did not find MySQL, MySQL support will be disabled")
endif()
endif()
if (NOT NOSQLITE)
find_package(Sqlite3)
IF (SQLITE3_FOUND)
MESSAGE(STATUS "OK, Found Sqlite3!")
include_directories(${SQLITE3_INCLUDE_DIR})
add_definitions( -DUSE_SQLITE3 )
else ()
MESSAGE(STATUS "WARNING: Did not find Sqlite3, Sqlite3 support will be disabled")
endif ()
endif()
ELSE ()
MESSAGE(STATUS "Not compiling detailed statistics. Leads to faster system")
ENDIF ()
# -----------------------------------------------------------------------------
# Look for ZLIB (For reading zipped CNFs)
# -----------------------------------------------------------------------------
option(NOZLIB "Don't use zlib" OFF)
if (NOT NOZLIB)
find_package(ZLIB)
IF (ZLIB_FOUND)
MESSAGE(STATUS "OK, Found ZLIB!")
include_directories(${ZLIB_INCLUDE_DIR})
link_directories(${ZLIB_LIB_DIR})
add_definitions( -DUSE_ZLIB )
ELSE (ZLIB_FOUND)
MESSAGE(STATUS "WARNING: Did not find ZLIB, gzipped file support will be disabled")
ENDIF (ZLIB_FOUND)
endif()
find_package(Valgrind)
if (VALGRIND_FOUND)
message(STATUS "OK, Found Valgrind. Using valgrind client requests to mark freed clauses in pool as undefined")
add_definitions(-DUSE_VALGRIND)
include_directories(${VALGRIND_INCLUDE_DIR})
else()
message(STATUS "Cannot find valgrind, we will not be able to mark memory pool objects as undefined")
endif()
#M4RI
option(NOM4RI "Don't use m4ri" OFF)
if (NOT NOM4RI)
find_package(M4RI)
IF (M4RI_FOUND)
MESSAGE(STATUS "OK, Found M4RI!")
add_definitions( -DUSE_M4RI )
ELSE (M4RI_FOUND)
MESSAGE(WARNING "Did not find M4RI, XOR detection&manipulation disabled")
ENDIF (M4RI_FOUND)
endif()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
macro(cmsat_add_public_header LIBTARGET HEADER)
set(HEADER_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER}")
if(EXISTS "${HEADER_PATH}")
# Get existing PUBLIC_HEADER
get_target_property(EXISTING_PUBLIC_HEADERS ${LIBTARGET} PUBLIC_HEADER)
if(EXISTING_PUBLIC_HEADERS)
list(APPEND EXISTING_PUBLIC_HEADERS "${HEADER_PATH}")
else()
# Do not append to empty list
set(EXISTING_PUBLIC_HEADERS "${HEADER_PATH}")
endif()
set_target_properties(${LIBTARGET}
PROPERTIES
PUBLIC_HEADER "${EXISTING_PUBLIC_HEADERS}"
)
else()
message(FATAL_ERROR "Cannot add public header, file ${HEADER_PATH} does not exist.")
endif()
endmacro()
if (ENABLE_TESTING)
enable_testing()
endif()
# -----------------------------------------------------------------------------
# Provide an export name to be used by targets that wish to export themselves.
# -----------------------------------------------------------------------------
set(CRYPTOMINISAT4_EXPORT_NAME "cryptominisat4Targets")
add_subdirectory(cryptominisat4 cmsat4-src)
# -----------------------------------------------------------------------------
# Look for python
# -----------------------------------------------------------------------------
find_package (PythonInterp 2.7)
find_package (PythonLibs 2.7)
if (PYTHON_EXECUTABLE AND PYTHON_LIBRARY AND PYTHON_INCLUDE_DIRS)
# message(STATUS "PYTHON_EXECUTABLE:FILEPATH=${PYTHON_EXECUTABLE}")
# message(STATUS "PYTHON_LIBRARY:FILEPATH=${PYTHON_LIBRARY}")
# message(STATUS "PYTHON_INCLUDE_DIR:FILEPATH=${PYTHON_INCLUDE_DIR}")
# message(STATUS "PYTHONLIBS_VERSION_STRING=${PYTHONLIBS_VERSION_STRING}")
message(STATUS "OK, found python interpreter, libs and header files -> building python plugin")
add_subdirectory(python py-lib)
else()
message(WARNING "Cannot find python interpreter, libs and header files -> not building python plugin")
endif()
# -----------------------------------------------------------------------------
# Add uninstall target for makefiles
# -----------------------------------------------------------------------------
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/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
)
if (ENABLE_TESTING)
add_test (NAME basic_test COMMAND tests/basic_test --log_level=test_suite)
add_test (NAME assump_test COMMAND tests/assump_test --log_level=test_suite)
add_test (NAME readme_test COMMAND tests/readme_test --log_level=test_suite)
add_test (NAME heap_test COMMAND tests/heap_test --log_level=test_suite)
add_test (NAME clause_test COMMAND tests/clause_test --log_level=test_suite)
message(STATUS "Testing is enabled")
set(UNIT_TEST_EXE_SUFFIX "Tests" CACHE STRING "Suffix for Unit test executable")
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 cryptominisat4 in the build-tree
# -----------------------------------------------------------------------------
set(CRYPTOMINISAT4_TARGETS_FILENAME "cryptominisat4Targets.cmake")
set(CRYPTOMINISAT4_CONFIG_FILENAME "cryptominisat4Config.cmake")
set(CRYPTOMINISAT4_STATIC_DEPS
${M4RI_LIBRARIES}
${TBB_MALLOC_LIBRARY_NAMES}
# ${TBB_MALLOC_PROXY_LIBRARY_NAMES}
${SQLITE3_LIBRARIES}
${MYSQL_LIB}
m4ri
)
# Export targets
set(MY_TARGETS libcryptominisat4 cryptominisat_simple)
if (NOT ONLY_SIMPLE)
set(MY_TARGETS ${MY_TARGETS} cryptominisat)
endif()
if (ALSO_BUILD_STATIC_LIB)
set(MY_TARGETS ${MY_TARGETS} libcryptominisat4_static)
endif()
export(TARGETS ${MY_TARGETS} FILE "${PROJECT_BINARY_DIR}/${CRYPTOMINISAT4_TARGETS_FILENAME}")
# Create cryptominisat4Config file
set(EXPORT_TYPE "Build-tree")
set(CONF_INCLUDE_DIRS "${PROJECT_BINARY_DIR}/include")
configure_file(cryptominisat4Config.cmake.in
"${PROJECT_BINARY_DIR}/${CRYPTOMINISAT4_CONFIG_FILENAME}" @ONLY
)
if(WIN32 AND NOT CYGWIN)
set(DEF_INSTALL_CMAKE_DIR CMake)
else()
set(DEF_INSTALL_CMAKE_DIR lib/cmake/cryptominisat4)
endif()
set(CRYPTOMINISAT4_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
"Installation directory for cryptominisat4 CMake files")
# Create cryptominisat4Config file
set(EXPORT_TYPE "installed")
set(CONF_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
configure_file(cryptominisat4Config.cmake.in
"${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${CRYPTOMINISAT4_CONFIG_FILENAME}" @ONLY
)
install(FILES
"${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${CRYPTOMINISAT4_CONFIG_FILENAME}"
DESTINATION "${CRYPTOMINISAT4_INSTALL_CMAKE_DIR}"
)
# Install the export set for use with the install-tree
install(EXPORT ${CRYPTOMINISAT4_EXPORT_NAME} DESTINATION
"${CRYPTOMINISAT4_INSTALL_CMAKE_DIR}"
)
# -----------------------------------------------------------------------------
# CPack
# -----------------------------------------------------------------------------
set(CPACK_SOURCE_GENERATOR "TBZ2")
string(TOLOWER "${CMAKE_PROJECT_NAME}" LOWERCASE_PROJECT_NAME)
set(CPACK_SOURCE_PACKAGE_FILE_NAME
"${LOWERCASE_PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}-src")
file(GLOB SourceIgnoreFiles "${CMAKE_SOURCE_DIR}/*")
set(SourceKeepFiles
"${CMAKE_SOURCE_DIR}/cmake"
"${CMAKE_SOURCE_DIR}/cryptominisat4"
"${CMAKE_SOURCE_DIR}/python"
"${CMAKE_SOURCE_DIR}/tests"
# "${CMAKE_SOURCE_DIR}/web/*.php"
# "${CMAKE_SOURCE_DIR}/web/*.js"
# "${CMAKE_SOURCE_DIR}/web/*.css"
# "${CMAKE_SOURCE_DIR}/web/drawgraphs.js"
# "${CMAKE_SOURCE_DIR}/web/jquery/jquery.js"
# "${CMAKE_SOURCE_DIR}/web/dygraphs/dygraphs-combined.js"
"${CMAKE_SOURCE_DIR}/AUTHORS"
"${CMAKE_SOURCE_DIR}/CMakeLists.txt"
"${CMAKE_SOURCE_DIR}/LICENSE-LGPL"
"${CMAKE_SOURCE_DIR}/README.markdown"
"${CMAKE_SOURCE_DIR}/cryptominisat4Config.cmake.in"
"${CMAKE_SOURCE_DIR}/STPConfigVersion.cmake.in"
)
list(REMOVE_ITEM SourceIgnoreFiles ${SourceKeepFiles})
# Escape any '.' characters
string(REPLACE "." "\\\\." SourceIgnoreFiles "${SourceIgnoreFiles}")
set(CPACK_SOURCE_IGNORE_FILES "${SourceIgnoreFiles}")
include(CPack)
add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)