mirror of
https://github.com/Z3Prover/z3
synced 2026-06-26 10:28:48 +00:00
The page https://github.com/Z3Prover/z3/blob/master/README-CMake.md#adding-z3-as-a-dependency-to-a-cmake-project advises using the CMake FetchContent feature to include z3 as source into other CMake project. I'm trying to do this to use Z3 within a ClangTidy checker. This is one of a series of PR's aimed at getting Z3 to compile cleanly when included this way. This initial PR fixes all the errors, allowing the compilation to succeed. Subsequent diffs will address warnings. I tested only the CMake compilation, on a Mac. *Missing Z3_THROWs* Update z3++.h to use Z3_THROW in a couple of places. Clang compiles with exceptions disabled so we get messages like: ``` /Users/daviddetlefs/llvm-project/build_dbg/_deps/z3-src/src/api/c++/z3++.h:4928:17: error: cannot use 'throw' with exceptions disabled4928 | throw exception("rcf_num objects from different contexts"); ``` NOTE TO REVIEWERS: I'm not complete clear on the usage conventions for Z3_THROW. With exception disabled, it seems like the throwing function will just continue. If there's somethign else that should be done, like setting some error state, please let me know. *CMake component name collision* There was an error at the CMake level, a name collision (on "opt"). Apparently CMake components are named using a flat namespace, so it's easy to see how this could occur. It seems to me that the right global way to fix this would be to encourage people to use some form of "qualified name" convention in naming their component. The fix I chose was a local version of this, changing the Z3 component name to z3_opt. (It didn't seem feasible to make the change in clang.) NOTE TO REVIEWERS: If you think this is OK, please let me know if a) You'd like me to also change the name of the opt directory, to keep thecomponent-name == directory-name invariant, and b) You'd like me to make this z3_ change more globally, to future-proof (somewhat) against similar component name collisions.
56 lines
2.2 KiB
CMake
56 lines
2.2 KiB
CMake
set (shell_object_files "")
|
|
# FIXME: z3 should really link against libz3 and not the
|
|
# individual components. Several things prevent us from
|
|
# doing this
|
|
# * The api_dll component in libz3 shouldn't be used the
|
|
# the z3 executable.
|
|
# * The z3 executable uses symbols that are hidden in libz3
|
|
|
|
# We are only using these dependencies to enforce a build
|
|
# order. We don't use this list for actual linking.
|
|
set(shell_deps api extra_cmds z3_opt sat)
|
|
z3_expand_dependencies(shell_expanded_deps ${shell_deps})
|
|
get_property(Z3_LIBZ3_COMPONENTS_LIST GLOBAL PROPERTY Z3_LIBZ3_COMPONENTS)
|
|
foreach (component ${Z3_LIBZ3_COMPONENTS_LIST})
|
|
if (NOT ("${component}" STREQUAL "api_dll"))
|
|
# We don't use the api_dll component in the Z3 executable
|
|
list(APPEND shell_object_files $<TARGET_OBJECTS:${component}>)
|
|
endif()
|
|
endforeach()
|
|
add_executable(shell
|
|
datalog_frontend.cpp
|
|
dimacs_frontend.cpp
|
|
drat_frontend.cpp
|
|
"${CMAKE_CURRENT_BINARY_DIR}/gparams_register_modules.cpp"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/install_tactic.cpp"
|
|
main.cpp
|
|
"${CMAKE_CURRENT_BINARY_DIR}/mem_initializer.cpp"
|
|
opt_frontend.cpp
|
|
smtlib_frontend.cpp
|
|
z3_log_frontend.cpp
|
|
# FIXME: shell should really link against libz3 but it can't due to requiring
|
|
# use of some hidden symbols. Also libz3 has the ``api_dll`` component which
|
|
# we don't want (I think).
|
|
${shell_object_files}
|
|
)
|
|
|
|
set_target_properties(shell PROPERTIES
|
|
# Position independent code needed in shared libraries
|
|
POSITION_INDEPENDENT_CODE ON
|
|
# Symbol visibility
|
|
CXX_VISIBILITY_PRESET hidden
|
|
VISIBILITY_INLINES_HIDDEN ON)
|
|
|
|
z3_add_install_tactic_rule(${shell_deps})
|
|
z3_add_memory_initializer_rule(${shell_deps})
|
|
z3_add_gparams_register_modules_rule(${shell_deps})
|
|
set_target_properties(shell PROPERTIES OUTPUT_NAME z3)
|
|
target_compile_definitions(shell PRIVATE ${Z3_COMPONENT_CXX_DEFINES})
|
|
target_compile_options(shell PRIVATE ${Z3_COMPONENT_CXX_FLAGS})
|
|
target_include_directories(shell PRIVATE ${Z3_COMPONENT_EXTRA_INCLUDE_DIRS})
|
|
target_link_libraries(shell PRIVATE ${Z3_DEPENDENT_LIBS})
|
|
z3_add_component_dependencies_to_target(shell ${shell_expanded_deps})
|
|
z3_append_linker_flag_list_to_target(shell ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS})
|
|
install(TARGETS shell
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
|
)
|