From 1d81fb4fb050ffc3ebf701883ff208cd78da2538 Mon Sep 17 00:00:00 2001 From: Dominik Charousset Date: Sat, 15 Apr 2023 00:08:42 +0200 Subject: [PATCH 1/2] Fix builds with plugins that use zeek-config When building plugins externally with `zeek-config` (as opposed to using `ZEEK_DIST`), they point into the install prefix. There, we add a new file `ZeekPluginBootstrap.cmake` that helps `ZeekPlugin.cmake` to find everything else it needs from there. Our template for plugins generates a `configure` script that sets various variables with values from `zeek-config`. We only need `BROKER_ROOT_DIR` with the new bootstrapping logic. Everything else, we can get from the new bootstrapping file and from the CMake package file for Zeek. --- CMakeLists.txt | 46 ++++++++++++++++++-------------- cmake | 2 +- src/ZeekPluginBootstrap.cmake.in | 15 +++++++++++ src/ZeekPluginConfig.cmake.in | 10 +++++-- zeek-config.in | 2 +- 5 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 src/ZeekPluginBootstrap.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 35992ec864..089d3cc2f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ option(ZEEK_STANDALONE "Build Zeek as stand-alone binary?" ON) option(ENABLE_ZEEK_UNIT_TESTS "Build the C++ (doctest) unit tests?" ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "Write JSON compile commands database") +set(ZEEK_CXX_STD cxx_std_17 CACHE STRING "The C++ standard to use.") list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}) list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}) @@ -133,7 +134,7 @@ add_library(zeek_internal INTERFACE) add_library(Zeek::Internal ALIAS zeek_internal) set_target_properties(zeek_internal PROPERTIES EXPORT_NAME Internal) install(TARGETS zeek_internal EXPORT ZeekTargets) -target_compile_features(zeek_internal INTERFACE cxx_std_17) +target_compile_features(zeek_internal INTERFACE ${ZEEK_CXX_STD}) # Target for bundling the creation of auto-generated files. add_custom_target(zeek_autogen_files) @@ -212,25 +213,24 @@ function(zeek_add_dependencies dep) endfunction() # Interface library for propagating extra flags and include paths to dynamically -# loaded plugins. +# loaded plugins. Also propagates include paths and C++17 mode on the install +# interface. add_library(zeek_dynamic_plugin_base INTERFACE) target_link_libraries(zeek_dynamic_plugin_base INTERFACE $) target_include_directories(zeek_dynamic_plugin_base INTERFACE - $ - $) + $ + $ + $) +target_compile_features(zeek_dynamic_plugin_base INTERFACE ${ZEEK_CXX_STD}) add_library(Zeek::DynamicPluginBase ALIAS zeek_dynamic_plugin_base) set_target_properties( zeek_dynamic_plugin_base PROPERTIES EXPORT_NAME DynamicPluginBase) install(TARGETS zeek_dynamic_plugin_base EXPORT ZeekTargets) -# Tell dynamic plugins where to find scripts such as -# zeek-plugin-create-package.sh. -set(ZEEK_PLUGIN_SCRIPTS_PATH "${PROJECT_SOURCE_DIR}/cmake") - # On macOS, we need to tell the linker that the modules are allowed to have # undefined symbols. if (CMAKE_SYSTEM_NAME MATCHES "Darwin") @@ -426,6 +426,7 @@ set(cmake_current_binary_dir "${CMAKE_CURRENT_BINARY_DIR}") set(cmake_install_prefix "${CMAKE_INSTALL_PREFIX}") set(cmake_source_dir "${CMAKE_SOURCE_DIR}") set(zeek_script_install_path "${ZEEK_SCRIPT_INSTALL_PATH}") +set(ZEEK_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/zeek/cmake") if ( MSVC ) string(REGEX REPLACE "^([A-Za-z]):/(.*)" "/\\1/\\2" bro_plugin_install_path "${bro_plugin_install_path}") string(REGEX REPLACE "^([A-Za-z]):/(.*)" "/\\1/\\2" cmake_binary_dir "${cmake_binary_dir}") @@ -1290,7 +1291,7 @@ configure_file(src/ZeekPluginConfig.cmake.in ZeekPluginConfig.cmake @ONLY) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/src/ZeekConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Zeek") + INSTALL_DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}") write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake" VERSION ${ZEEK_VERSION_NUMBER} @@ -1299,17 +1300,22 @@ write_basic_package_version_file( # Write the CMake targets file. export(EXPORT ZeekTargets FILE ZeekTargets.cmake NAMESPACE Zeek::) -# TODO: Check whether installing these does not break any of our packages. -# install( -# FILES -# "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake" -# "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake" -# DESTINATION -# "${CMAKE_INSTALL_LIBDIR}/cmake/Zeek") -# install( -# EXPORT ZeekTargets -# DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Zeek" -# NAMESPACE Zeek::) +# Write the bootstrap file for dynamic plugins. Needed by ZeekPlugin.cmake. +configure_file(src/ZeekPluginBootstrap.cmake.in ZeekPluginBootstrap.cmake @ONLY) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ZeekPluginBootstrap.cmake" + DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}") + +install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake" + DESTINATION + "${ZEEK_CMAKE_INSTALL_DIR}") + +install( + EXPORT ZeekTargets + DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}" + NAMESPACE Zeek::) ######################################################################## ## Build Summary diff --git a/cmake b/cmake index f258c75659..9d42fed681 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit f258c75659cec6e5dbd91ea18e21bc5dfad284a2 +Subproject commit 9d42fed6811d011890af99d5de57c4d0089deaf6 diff --git a/src/ZeekPluginBootstrap.cmake.in b/src/ZeekPluginBootstrap.cmake.in new file mode 100644 index 0000000000..fa854a9c52 --- /dev/null +++ b/src/ZeekPluginBootstrap.cmake.in @@ -0,0 +1,15 @@ +# This script is installed alongside ZeekPlugin.cmake for passing variables from +# the CMake configuration step to plugins. + +# Allows scripts such as ZeekPlugin.cmake to locate the Zeek CMake package. +set(ZEEK_CMAKE_PACKAGE_DIR "@ZEEK_CMAKE_INSTALL_DIR@" + CACHE PATH "Path the CMake package for Zeek." FORCE) + +# Allows scripts to locate files in the Zeek install tree. +set(ZEEK_CMAKE_INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@" + CACHE PATH "Path the install prefix of Zeek." FORCE) + +# Set ZEEK_PLUGIN_SCRIPTS_PATH for ZeekPlugin.cmake. We install the scripts into +# the package directory. +set(ZEEK_PLUGIN_SCRIPTS_PATH "${ZEEK_CMAKE_PACKAGE_DIR}" + CACHE PATH "Path to utility scripts for building Zeek plugins." FORCE) diff --git a/src/ZeekPluginConfig.cmake.in b/src/ZeekPluginConfig.cmake.in index 2a8c2511e5..14d25439ed 100644 --- a/src/ZeekPluginConfig.cmake.in +++ b/src/ZeekPluginConfig.cmake.in @@ -6,10 +6,16 @@ include(MacDependencyPaths) # For finding zeek-plugin-create-package.sh and zeek-plugin-install-package.sh. -set(ZEEK_PLUGIN_SCRIPTS_PATH "@ZEEK_PLUGIN_SCRIPTS_PATH@") +if ( NOT ZEEK_PLUGIN_SCRIPTS_PATH ) + set(ZEEK_PLUGIN_SCRIPTS_PATH "@ZEEK_PLUGIN_SCRIPTS_PATH@" + CACHE PATH "Path to utility shell scripts." FORCE) +endif () # For finding Zeek sources. -set(ZEEK_SOURCE_DIR "@ZEEK_SOURCE_DIR@") +if ( NOT ZEEK_SOURCE_DIR ) + set(ZEEK_SOURCE_DIR "@ZEEK_SOURCE_DIR@" + CACHE PATH "Path to the Zeek source tree." FORCE) +endif () # Provide a hint to ZeekConfig.cmake where to find Broker from the build tree. # Note: the straightforward way would be setting `Broker_ROOT` instead, but diff --git a/zeek-config.in b/zeek-config.in index 5b08d8fcde..84a78850e8 100755 --- a/zeek-config.in +++ b/zeek-config.in @@ -4,7 +4,7 @@ binpac_root=@ZEEK_CONFIG_BINPAC_ROOT_DIR@ broker_root=@ZEEK_CONFIG_BROKER_ROOT_DIR@ btest_tools_dir=@ZEEK_CONFIG_BTEST_TOOLS_DIR@ build_type=@CMAKE_BUILD_TYPE_LOWER@ -cmake_dir=@CMAKE_INSTALL_PREFIX@/share/zeek/cmake +cmake_dir=@ZEEK_CMAKE_INSTALL_DIR@ config_dir=@ZEEK_ETC_INSTALL_DIR@ have_spicy=@USE_SPICY_ANALYZERS@ include_dir=@CMAKE_INSTALL_PREFIX@/include From 12ea6ed478580679f86ed6cb274ce2a2db4a9020 Mon Sep 17 00:00:00 2001 From: Dominik Charousset Date: Tue, 18 Apr 2023 21:17:33 +0200 Subject: [PATCH 2/2] Improve CMake variables, update cmake submodule --- CMakeLists.txt | 13 ++++++++----- cmake | 2 +- src/ZeekPluginBootstrap.cmake.in | 8 ++++---- zeek-config.in | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 089d3cc2f6..2b19ddd830 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -426,7 +426,6 @@ set(cmake_current_binary_dir "${CMAKE_CURRENT_BINARY_DIR}") set(cmake_install_prefix "${CMAKE_INSTALL_PREFIX}") set(cmake_source_dir "${CMAKE_SOURCE_DIR}") set(zeek_script_install_path "${ZEEK_SCRIPT_INSTALL_PATH}") -set(ZEEK_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/zeek/cmake") if ( MSVC ) string(REGEX REPLACE "^([A-Za-z]):/(.*)" "/\\1/\\2" bro_plugin_install_path "${bro_plugin_install_path}") string(REGEX REPLACE "^([A-Za-z]):/(.*)" "/\\1/\\2" cmake_binary_dir "${cmake_binary_dir}") @@ -436,6 +435,9 @@ if ( MSVC ) string(REGEX REPLACE "^([A-Za-z]):/(.*)" "/\\1/\\2" zeek_script_install_path "${zeek_script_install_path}") endif () +# Set the path where we install the ZeekConfig.cmake file and related files. +set(ZEEK_CMAKE_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/zeek/cmake") + if ( NOT ZEEK_ETC_INSTALL_DIR ) set(ZEEK_ETC_INSTALL_DIR ${ZEEK_ROOT_DIR}/etc) endif () @@ -502,6 +504,7 @@ string(REGEX REPLACE "[^a-zA-Z0-9_\$]" "_" VERSION_C_IDENT "${VERSION_C_IDENT}") if(ENABLE_DEBUG) set(VERSION_C_IDENT "${VERSION_C_IDENT}_debug") target_compile_definitions(zeek_internal INTERFACE DEBUG) + target_compile_definitions(zeek_dynamic_plugin_base INTERFACE DEBUG) endif() if ( NOT BINARY_PACKAGING_MODE ) @@ -1291,7 +1294,7 @@ configure_file(src/ZeekPluginConfig.cmake.in ZeekPluginConfig.cmake @ONLY) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/src/ZeekConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake" - INSTALL_DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}") + INSTALL_DESTINATION "${ZEEK_CMAKE_CONFIG_DIR}") write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake" VERSION ${ZEEK_VERSION_NUMBER} @@ -1303,18 +1306,18 @@ export(EXPORT ZeekTargets FILE ZeekTargets.cmake NAMESPACE Zeek::) # Write the bootstrap file for dynamic plugins. Needed by ZeekPlugin.cmake. configure_file(src/ZeekPluginBootstrap.cmake.in ZeekPluginBootstrap.cmake @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ZeekPluginBootstrap.cmake" - DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}") + DESTINATION "${ZEEK_CMAKE_CONFIG_DIR}") install( FILES "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake" DESTINATION - "${ZEEK_CMAKE_INSTALL_DIR}") + "${ZEEK_CMAKE_CONFIG_DIR}") install( EXPORT ZeekTargets - DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}" + DESTINATION "${ZEEK_CMAKE_CONFIG_DIR}" NAMESPACE Zeek::) ######################################################################## diff --git a/cmake b/cmake index 9d42fed681..ddbea121d7 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit 9d42fed6811d011890af99d5de57c4d0089deaf6 +Subproject commit ddbea121d75a416cba8db5d8907e89875054579e diff --git a/src/ZeekPluginBootstrap.cmake.in b/src/ZeekPluginBootstrap.cmake.in index fa854a9c52..fc2090bfc9 100644 --- a/src/ZeekPluginBootstrap.cmake.in +++ b/src/ZeekPluginBootstrap.cmake.in @@ -2,14 +2,14 @@ # the CMake configuration step to plugins. # Allows scripts such as ZeekPlugin.cmake to locate the Zeek CMake package. -set(ZEEK_CMAKE_PACKAGE_DIR "@ZEEK_CMAKE_INSTALL_DIR@" - CACHE PATH "Path the CMake package for Zeek." FORCE) +set(ZEEK_CMAKE_CONFIG_DIR "@ZEEK_CMAKE_CONFIG_DIR@" + CACHE PATH "Internal Zeek variable: the CMake package path for Zeek." FORCE) # Allows scripts to locate files in the Zeek install tree. set(ZEEK_CMAKE_INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@" - CACHE PATH "Path the install prefix of Zeek." FORCE) + CACHE PATH "Internal Zeek variable: CMAKE_INSTALL_PREFIX of Zeek." FORCE) # Set ZEEK_PLUGIN_SCRIPTS_PATH for ZeekPlugin.cmake. We install the scripts into # the package directory. -set(ZEEK_PLUGIN_SCRIPTS_PATH "${ZEEK_CMAKE_PACKAGE_DIR}" +set(ZEEK_PLUGIN_SCRIPTS_PATH "${ZEEK_CMAKE_CONFIG_DIR}" CACHE PATH "Path to utility scripts for building Zeek plugins." FORCE) diff --git a/zeek-config.in b/zeek-config.in index 84a78850e8..4ac0a51478 100755 --- a/zeek-config.in +++ b/zeek-config.in @@ -4,7 +4,7 @@ binpac_root=@ZEEK_CONFIG_BINPAC_ROOT_DIR@ broker_root=@ZEEK_CONFIG_BROKER_ROOT_DIR@ btest_tools_dir=@ZEEK_CONFIG_BTEST_TOOLS_DIR@ build_type=@CMAKE_BUILD_TYPE_LOWER@ -cmake_dir=@ZEEK_CMAKE_INSTALL_DIR@ +cmake_dir=@ZEEK_CMAKE_CONFIG_DIR@ config_dir=@ZEEK_ETC_INSTALL_DIR@ have_spicy=@USE_SPICY_ANALYZERS@ include_dir=@CMAKE_INSTALL_PREFIX@/include