diff options
author | Dan Liew <daniel.liew@imperial.ac.uk> | 2017-07-25 15:05:53 +0100 |
---|---|---|
committer | Dan Liew <daniel.liew@imperial.ac.uk> | 2017-07-28 08:19:52 +0100 |
commit | 5080f35f1a12f6872d281e0a823ad9e5046b6a4a (patch) | |
tree | f0d3ca439bd8554469871515feb47cb96d482c4c /cmake | |
parent | 0c964b4792d2d575ef1a3032589943412df5923c (diff) | |
download | klee-5080f35f1a12f6872d281e0a823ad9e5046b6a4a.tar.gz |
[CMake] Refactor Z3 detection and change the default value of
`ENABLE_SOLVER_Z3` to be set dynamically based on whether Z3 is available. Previously the default was always off.
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/find_z3.cmake | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/cmake/find_z3.cmake b/cmake/find_z3.cmake new file mode 100644 index 00000000..60e27c26 --- /dev/null +++ b/cmake/find_z3.cmake @@ -0,0 +1,51 @@ +#===------------------------------------------------------------------------===# +# +# The KLEE Symbolic Virtual Machine +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +#===------------------------------------------------------------------------===# + +find_package(Z3) +# Set the default so that if the following is true: +# * Z3 was found +# * ENABLE_SOLVER_Z3 is not already set as a cache variable +# +# then the default is set to `ON`. Otherwise set the default to `OFF`. +# A consequence of this is if we fail to detect Z3 the first time +# subsequent calls to CMake will not change the default. +if (Z3_FOUND) + set(ENABLE_SOLVER_Z3_DEFAULT ON) +else() + set(ENABLE_SOLVER_Z3_DEFAULT OFF) +endif() +option(ENABLE_SOLVER_Z3 "Enable Z3 solver support" ${ENABLE_SOLVER_Z3_DEFAULT}) + +if (ENABLE_SOLVER_Z3) + message(STATUS "Z3 solver support enabled") + if (Z3_FOUND) + message(STATUS "Found Z3") + set(ENABLE_Z3 1) # For config.h + list(APPEND KLEE_COMPONENT_EXTRA_INCLUDE_DIRS ${Z3_INCLUDE_DIRS}) + list(APPEND KLEE_SOLVER_LIBRARIES ${Z3_LIBRARIES}) + + # Check the signature of `Z3_get_error_msg()` + set (_old_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${Z3_LIBRARIES}) + check_prototype_definition(Z3_get_error_msg + "Z3_string Z3_get_error_msg(Z3_context c, Z3_error_code err)" + "NULL" "${Z3_INCLUDE_DIRS}/z3.h" HAVE_Z3_GET_ERROR_MSG_NEEDS_CONTEXT) + set(CMAKE_REQUIRED_LIBRARIES ${_old_CMAKE_REQUIRED_LIBRARIES}) + if (HAVE_Z3_GET_ERROR_MSG_NEEDS_CONTEXT) + message(STATUS "Z3_get_error_msg requires context") + else() + message(STATUS "Z3_get_error_msg does not require context") + endif() + else() + message(FATAL_ERROR "Z3 not found.") + endif() +else() + message(STATUS "Z3 solver support disabled") + set(ENABLE_Z3 0) # For config.h +endif() |