2017-08-31 00:10:45 +08:00
|
|
|
cmake_minimum_required(VERSION 3.2)
|
|
|
|
|
2019-10-12 08:53:24 +08:00
|
|
|
project(CBMC)
|
|
|
|
|
2017-09-01 22:36:36 +08:00
|
|
|
find_program(CCACHE_PROGRAM ccache)
|
|
|
|
if(CCACHE_PROGRAM)
|
|
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
2017-09-14 05:03:57 +08:00
|
|
|
message(STATUS "Rule launch compile: ${CCACHE_PROGRAM}")
|
2017-09-01 22:36:36 +08:00
|
|
|
endif()
|
|
|
|
|
2017-09-18 05:08:59 +08:00
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS true)
|
|
|
|
|
2017-08-31 00:17:38 +08:00
|
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
|
|
|
|
|
2017-08-31 00:10:45 +08:00
|
|
|
include(GNUInstallDirs)
|
|
|
|
|
2017-08-31 00:17:38 +08:00
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
2017-08-31 00:10:45 +08:00
|
|
|
|
2017-09-08 18:16:26 +08:00
|
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
|
2018-06-22 22:09:57 +08:00
|
|
|
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang" OR
|
2017-09-08 18:16:26 +08:00
|
|
|
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU"
|
|
|
|
)
|
|
|
|
# Ensure NDEBUG is not set for release builds
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
|
2019-01-26 00:29:40 +08:00
|
|
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
|
2017-09-08 18:16:26 +08:00
|
|
|
# Enable lots of warnings
|
2018-07-10 00:00:13 +08:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Werror -Wno-deprecated-declarations -Wswitch-enum")
|
2017-09-08 18:16:26 +08:00
|
|
|
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
2019-10-13 07:17:56 +08:00
|
|
|
# This would be the place to enable warnings for Windows builds, although
|
|
|
|
# config.inc doesn't seem to do that currently
|
|
|
|
|
|
|
|
# Include Git Bash Environment (rqeuired for download_project (patch))
|
|
|
|
find_package(Git)
|
|
|
|
if(GIT_FOUND)
|
|
|
|
get_filename_component(git_root ${GIT_EXECUTABLE} DIRECTORY)
|
|
|
|
set(ENV{PATH} "${git_root}\\..\\usr\\bin;$ENV{PATH}")
|
2019-10-13 07:42:15 +08:00
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Git not found. Git bash is required to configure the build.")
|
2019-10-13 07:17:56 +08:00
|
|
|
endif()
|
2017-09-08 18:16:26 +08:00
|
|
|
endif()
|
|
|
|
|
2017-08-31 00:17:38 +08:00
|
|
|
set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled")
|
|
|
|
|
2017-09-08 17:05:51 +08:00
|
|
|
set(sat_impl "minisat2" CACHE STRING
|
|
|
|
"This setting controls the SAT library which is used. Valid values are 'minisat2' and 'glucose'"
|
|
|
|
)
|
|
|
|
|
2017-08-31 00:17:38 +08:00
|
|
|
if(${enable_cbmc_tests})
|
|
|
|
enable_testing()
|
|
|
|
endif()
|
2018-05-23 19:04:45 +08:00
|
|
|
|
2019-02-01 14:48:55 +08:00
|
|
|
if(DEFINED CMAKE_USE_CUDD)
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadProject.cmake")
|
|
|
|
message(STATUS "Downloading Cudd-3.0.0")
|
|
|
|
download_project(PROJ cudd
|
|
|
|
URL https://sourceforge.net/projects/cudd-mirror/files/cudd-3.0.0.tar.gz/download
|
|
|
|
URL_MD5 4fdafe4924b81648b908881c81fe6c30
|
|
|
|
)
|
|
|
|
|
2019-03-22 01:22:49 +08:00
|
|
|
if(NOT EXISTS ${cudd_SOURCE_DIR}/Makefile)
|
|
|
|
message(STATUS "Configuring Cudd-3.0.0")
|
|
|
|
execute_process(COMMAND ./configure WORKING_DIRECTORY ${cudd_SOURCE_DIR})
|
2019-02-01 14:48:55 +08:00
|
|
|
endif()
|
2019-03-22 01:22:49 +08:00
|
|
|
message(STATUS "Building Cudd-3.0.0")
|
|
|
|
execute_process(COMMAND make WORKING_DIRECTORY ${cudd_SOURCE_DIR})
|
2019-02-01 14:48:55 +08:00
|
|
|
|
|
|
|
add_library(cudd STATIC IMPORTED)
|
|
|
|
set_property(TARGET cudd PROPERTY IMPORTED_LOCATION ${cudd_SOURCE_DIR}/cudd/.libs/libcudd.a)
|
|
|
|
|
2019-03-22 01:22:49 +08:00
|
|
|
add_library(cudd-cplusplus STATIC IMPORTED)
|
|
|
|
set_property(TARGET cudd-cplusplus PROPERTY IMPORTED_LOCATION ${cudd_SOURCE_DIR}/cplusplus/.libs/libobj.a)
|
|
|
|
|
2019-02-01 14:48:55 +08:00
|
|
|
include_directories(${cudd_SOURCE_DIR})
|
|
|
|
add_compile_options(-DHAVE_CUDD)
|
|
|
|
set(CUDD_INCLUDE ${cudd_SOURCE_DIR} CACHE STRING "Record Cudd directory for includes")
|
|
|
|
endif()
|
|
|
|
|
2019-01-15 20:56:15 +08:00
|
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
|
|
|
|
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang" OR
|
|
|
|
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU"
|
|
|
|
)
|
2019-08-21 00:18:32 +08:00
|
|
|
option(enable_coverage "Build with coverage recording")
|
2019-01-15 20:56:15 +08:00
|
|
|
set(parallel_tests "1" CACHE STRING "Number of tests to run in parallel")
|
2019-08-21 00:18:32 +08:00
|
|
|
if(enable_coverage)
|
|
|
|
add_compile_options(--coverage -g)
|
2019-01-15 20:56:15 +08:00
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage -g")
|
|
|
|
if (NOT DEFINED CODE_COVERAGE_OUTPUT_DIR)
|
|
|
|
set(CODE_COVERAGE_OUTPUT_DIR ${CMAKE_BINARY_DIR}/html)
|
|
|
|
set(CODE_COVERAGE_INFO_FILE ${CODE_COVERAGE_OUTPUT_DIR}/coverage.info)
|
|
|
|
endif()
|
|
|
|
find_program(CODE_COVERAGE_LCOV lcov)
|
|
|
|
find_program(CODE_COVERAGE_GENHTML genhtml)
|
|
|
|
add_custom_target(coverage
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${CODE_COVERAGE_OUTPUT_DIR}
|
|
|
|
COMMAND ctest -V -L CORE -j${parallel_tests}
|
|
|
|
COMMAND ${CODE_COVERAGE_LCOV} ${LCOV_FLAGS} --capture --directory ${CMAKE_BINARY_DIR} --output-file ${CODE_COVERAGE_INFO_FILE}
|
|
|
|
COMMAND ${CODE_COVERAGE_LCOV} ${LCOV_FLAGS} --remove ${CODE_COVERAGE_INFO_FILE} '/usr/*' --output-file ${CODE_COVERAGE_INFO_FILE}
|
|
|
|
COMMAND ${CODE_COVERAGE_GENHTML} ${CODE_COVERAGE_INFO_FILE} --output-directory ${CODE_COVERAGE_OUTPUT_DIR}
|
|
|
|
DEPENDS
|
2019-05-30 20:48:51 +08:00
|
|
|
java-models-library
|
|
|
|
"$<TARGET_FILE:java-unit>"
|
|
|
|
"$<TARGET_FILE:unit>"
|
|
|
|
"$<TARGET_FILE:goto-harness>"
|
2019-01-15 20:56:15 +08:00
|
|
|
"$<TARGET_FILE:cbmc>"
|
|
|
|
"$<TARGET_FILE:driver>"
|
|
|
|
"$<TARGET_FILE:goto-analyzer>"
|
|
|
|
"$<TARGET_FILE:goto-cc>"
|
|
|
|
"$<TARGET_FILE:goto-diff>"
|
|
|
|
"$<TARGET_FILE:goto-instrument>"
|
|
|
|
"$<TARGET_FILE:janalyzer>"
|
|
|
|
"$<TARGET_FILE:jbmc>"
|
|
|
|
"$<TARGET_FILE:jdiff>"
|
|
|
|
"$<TARGET_FILE:smt2_solver>"
|
|
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2019-08-21 00:20:04 +08:00
|
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
|
|
|
|
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang" OR
|
|
|
|
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU"
|
|
|
|
)
|
|
|
|
option(enable_profiling "Build with profiling data")
|
|
|
|
if(enable_profiling)
|
|
|
|
add_compile_options(-g -pg)
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2019-05-15 21:44:58 +08:00
|
|
|
function(cprover_default_properties)
|
|
|
|
set(CBMC_CXX_STANDARD 11)
|
|
|
|
set(CBMC_CXX_STANDARD_REQUIRED true)
|
|
|
|
set(CBMC_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY
|
|
|
|
"Developer ID Application: Daniel Kroening")
|
|
|
|
|
|
|
|
set_target_properties(
|
|
|
|
${ARGN}
|
|
|
|
PROPERTIES
|
|
|
|
CXX_STANDARD ${CBMC_CXX_STANDARD}
|
|
|
|
CXX_STANDARD_REQUIRED ${CBMC_CXX_STANDARD_REQUIRED}
|
|
|
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${CBMC_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY})
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
option(WITH_MEMORY_ANALYZER OFF
|
|
|
|
"build the memory analyzer")
|
|
|
|
|
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
|
|
|
|
set(WITH_MEMORY_ANALYZER_DEFAULT ON)
|
|
|
|
else()
|
|
|
|
set(WITH_MEMORY_ANALYZER_DEFAULT OFF)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
option(WITH_MEMORY_ANALYZER ${WITH_MEMORY_ANALYZER_DEFAULT}
|
|
|
|
"build the memory analyzer")
|
|
|
|
|
2018-05-23 19:04:45 +08:00
|
|
|
add_subdirectory(src)
|
2017-08-31 00:17:38 +08:00
|
|
|
add_subdirectory(regression)
|
2018-05-23 19:04:45 +08:00
|
|
|
add_subdirectory(unit)
|
|
|
|
|
2019-05-15 21:44:58 +08:00
|
|
|
cprover_default_properties(
|
2017-11-15 23:55:08 +08:00
|
|
|
analyses
|
|
|
|
ansi-c
|
|
|
|
assembler
|
|
|
|
big-int
|
|
|
|
cbmc
|
|
|
|
cbmc-lib
|
|
|
|
cpp
|
|
|
|
driver
|
|
|
|
goto-analyzer
|
|
|
|
goto-analyzer-lib
|
|
|
|
goto-cc
|
|
|
|
goto-cc-lib
|
2018-12-15 20:07:07 +08:00
|
|
|
goto-checker
|
2017-11-15 23:55:08 +08:00
|
|
|
goto-diff
|
|
|
|
goto-diff-lib
|
2019-01-22 00:16:34 +08:00
|
|
|
goto-harness
|
2017-11-15 23:55:08 +08:00
|
|
|
goto-instrument
|
|
|
|
goto-instrument-lib
|
|
|
|
goto-programs
|
|
|
|
goto-symex
|
|
|
|
jsil
|
|
|
|
json
|
2017-02-24 02:39:14 +08:00
|
|
|
json-symtab-language
|
2017-11-15 23:55:08 +08:00
|
|
|
langapi
|
|
|
|
linking
|
|
|
|
pointer-analysis
|
|
|
|
solvers
|
2019-05-20 22:52:05 +08:00
|
|
|
statement-list
|
2019-05-08 22:57:20 +08:00
|
|
|
symtab2gb
|
2017-11-15 23:55:08 +08:00
|
|
|
testing-utils
|
|
|
|
unit
|
|
|
|
util
|
2019-05-15 21:44:58 +08:00
|
|
|
xml)
|
2019-03-14 07:02:22 +08:00
|
|
|
|
|
|
|
option(WITH_JBMC "Build the JBMC Java front-end" ON)
|
|
|
|
if(WITH_JBMC)
|
|
|
|
add_subdirectory(jbmc)
|
|
|
|
endif()
|