diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b32b0108..0e95cb65a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,6 +337,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") # Z3 components, library and executables ################################################################################ include(${CMAKE_SOURCE_DIR}/cmake/z3_add_component.cmake) +include(${CMAKE_SOURCE_DIR}/cmake/z3_append_linker_flag_list_to_target.cmake) add_subdirectory(src) ################################################################################ diff --git a/contrib/cmake/cmake/z3_append_linker_flag_list_to_target.cmake b/contrib/cmake/cmake/z3_append_linker_flag_list_to_target.cmake new file mode 100644 index 000000000..3eb1e2d34 --- /dev/null +++ b/contrib/cmake/cmake/z3_append_linker_flag_list_to_target.cmake @@ -0,0 +1,17 @@ +# The LINK_FLAGS property of a target in CMake is unfortunately a string and +# not a list. This function takes a list of linker flags and iterates through +# them to append them as strings to the ``LINK_FLAGS`` property of +# the specified target. +# E.g. +# z3_append_linker_flag_list_to_target(mytarget "-fopenmp" "-static") +function(z3_append_linker_flag_list_to_target target) + if (NOT (TARGET "${target}")) + message(FATAL_ERROR "Specified target \"${target}\" is not a target") + endif() + foreach(flag ${ARGN}) + #message(STATUS "Appending link flag \"${flag}\" to target ${target}") + # Note that space inside the quoted string is required so that the flags + # are space separated. + set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}") + endforeach() +endfunction() diff --git a/contrib/cmake/src/CMakeLists.txt b/contrib/cmake/src/CMakeLists.txt index 5e60d7e9d..6708f505e 100644 --- a/contrib/cmake/src/CMakeLists.txt +++ b/contrib/cmake/src/CMakeLists.txt @@ -140,7 +140,7 @@ endif() # automatically link against the libs in Z3_DEPENDENT_LIBS target_link_libraries(libz3 INTERFACE ${Z3_DEPENDENT_LIBS}) -set_property(TARGET libz3 APPEND PROPERTY LINK_FLAGS ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS}) +z3_append_linker_flag_list_to_target(libz3 ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS}) # Declare which header file are the public header files of libz3 # these will automatically installed when the libz3 target is installed @@ -196,9 +196,7 @@ if (MSVC) DEPENDS "${dll_module_exports_file}" ) add_dependencies(libz3 libz3_extra_depends) - set_property(TARGET libz3 APPEND PROPERTY LINK_FLAGS - "/DEF:${dll_module_exports_file}" - ) + z3_append_linker_flag_list_to_target(libz3 "/DEF:${dll_module_exports_file}") endif() ################################################################################ diff --git a/contrib/cmake/src/shell/CMakeLists.txt b/contrib/cmake/src/shell/CMakeLists.txt index d4dff6f81..65b97aaaf 100644 --- a/contrib/cmake/src/shell/CMakeLists.txt +++ b/contrib/cmake/src/shell/CMakeLists.txt @@ -41,7 +41,7 @@ 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}) -set_property(TARGET shell APPEND PROPERTY LINK_FLAGS ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS}) +z3_append_linker_flag_list_to_target(shell ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS}) install(TARGETS shell RUNTIME DESTINATION "${Z3_INSTALL_BIN_DIR}" ) diff --git a/contrib/cmake/src/test/CMakeLists.txt b/contrib/cmake/src/test/CMakeLists.txt index 6a42b79d2..b6166b3f8 100644 --- a/contrib/cmake/src/test/CMakeLists.txt +++ b/contrib/cmake/src/test/CMakeLists.txt @@ -121,6 +121,6 @@ z3_add_gparams_register_modules_rule(${z3_test_deps}) target_compile_definitions(test-z3 PRIVATE ${Z3_COMPONENT_CXX_DEFINES}) target_compile_options(test-z3 PRIVATE ${Z3_COMPONENT_CXX_FLAGS}) target_link_libraries(test-z3 PRIVATE ${Z3_DEPENDENT_LIBS}) -target_include_directories(shell PRIVATE ${Z3_COMPONENT_EXTRA_INCLUDE_DIRS}) -set_property(TARGET test-z3 APPEND PROPERTY LINK_FLAGS ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS}) +target_include_directories(test-z3 PRIVATE ${Z3_COMPONENT_EXTRA_INCLUDE_DIRS}) +z3_append_linker_flag_list_to_target(test-z3 ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS}) z3_add_component_dependencies_to_target(test-z3 ${z3_test_expanded_deps})