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.
This commit is contained in:
Dominik Charousset 2023-04-15 00:08:42 +02:00
parent 75245bd365
commit 1d81fb4fb0
5 changed files with 51 additions and 24 deletions

View file

@ -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) option(ENABLE_ZEEK_UNIT_TESTS "Build the C++ (doctest) unit tests?" ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON set(CMAKE_EXPORT_COMPILE_COMMANDS ON
CACHE INTERNAL "Write JSON compile commands database") 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_MODULE_PATH ${CMAKE_BINARY_DIR})
list(APPEND CMAKE_PREFIX_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) add_library(Zeek::Internal ALIAS zeek_internal)
set_target_properties(zeek_internal PROPERTIES EXPORT_NAME Internal) set_target_properties(zeek_internal PROPERTIES EXPORT_NAME Internal)
install(TARGETS zeek_internal EXPORT ZeekTargets) 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. # Target for bundling the creation of auto-generated files.
add_custom_target(zeek_autogen_files) add_custom_target(zeek_autogen_files)
@ -212,25 +213,24 @@ function(zeek_add_dependencies dep)
endfunction() endfunction()
# Interface library for propagating extra flags and include paths to dynamically # 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) add_library(zeek_dynamic_plugin_base INTERFACE)
target_link_libraries(zeek_dynamic_plugin_base target_link_libraries(zeek_dynamic_plugin_base
INTERFACE INTERFACE
$<BUILD_INTERFACE:zeek_internal>) $<BUILD_INTERFACE:zeek_internal>)
target_include_directories(zeek_dynamic_plugin_base target_include_directories(zeek_dynamic_plugin_base
INTERFACE INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> $<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>) $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>)
target_compile_features(zeek_dynamic_plugin_base INTERFACE ${ZEEK_CXX_STD})
add_library(Zeek::DynamicPluginBase ALIAS zeek_dynamic_plugin_base) add_library(Zeek::DynamicPluginBase ALIAS zeek_dynamic_plugin_base)
set_target_properties( set_target_properties(
zeek_dynamic_plugin_base PROPERTIES zeek_dynamic_plugin_base PROPERTIES
EXPORT_NAME DynamicPluginBase) EXPORT_NAME DynamicPluginBase)
install(TARGETS zeek_dynamic_plugin_base EXPORT ZeekTargets) 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 # On macOS, we need to tell the linker that the modules are allowed to have
# undefined symbols. # undefined symbols.
if (CMAKE_SYSTEM_NAME MATCHES "Darwin") 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_install_prefix "${CMAKE_INSTALL_PREFIX}")
set(cmake_source_dir "${CMAKE_SOURCE_DIR}") set(cmake_source_dir "${CMAKE_SOURCE_DIR}")
set(zeek_script_install_path "${ZEEK_SCRIPT_INSTALL_PATH}") set(zeek_script_install_path "${ZEEK_SCRIPT_INSTALL_PATH}")
set(ZEEK_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/zeek/cmake")
if ( MSVC ) 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" bro_plugin_install_path "${bro_plugin_install_path}")
string(REGEX REPLACE "^([A-Za-z]):/(.*)" "/\\1/\\2" cmake_binary_dir "${cmake_binary_dir}") 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( configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/src/ZeekConfig.cmake.in" "${CMAKE_CURRENT_SOURCE_DIR}/src/ZeekConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Zeek") INSTALL_DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}")
write_basic_package_version_file( write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake" "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake"
VERSION ${ZEEK_VERSION_NUMBER} VERSION ${ZEEK_VERSION_NUMBER}
@ -1299,17 +1300,22 @@ write_basic_package_version_file(
# Write the CMake targets file. # Write the CMake targets file.
export(EXPORT ZeekTargets FILE ZeekTargets.cmake NAMESPACE Zeek::) export(EXPORT ZeekTargets FILE ZeekTargets.cmake NAMESPACE Zeek::)
# TODO: Check whether installing these does not break any of our packages. # Write the bootstrap file for dynamic plugins. Needed by ZeekPlugin.cmake.
# install( configure_file(src/ZeekPluginBootstrap.cmake.in ZeekPluginBootstrap.cmake @ONLY)
# FILES install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ZeekPluginBootstrap.cmake"
# "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake" DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}")
# "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake"
# DESTINATION install(
# "${CMAKE_INSTALL_LIBDIR}/cmake/Zeek") FILES
# install( "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfig.cmake"
# EXPORT ZeekTargets "${CMAKE_CURRENT_BINARY_DIR}/ZeekConfigVersion.cmake"
# DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Zeek" DESTINATION
# NAMESPACE Zeek::) "${ZEEK_CMAKE_INSTALL_DIR}")
install(
EXPORT ZeekTargets
DESTINATION "${ZEEK_CMAKE_INSTALL_DIR}"
NAMESPACE Zeek::)
######################################################################## ########################################################################
## Build Summary ## Build Summary

2
cmake

@ -1 +1 @@
Subproject commit f258c75659cec6e5dbd91ea18e21bc5dfad284a2 Subproject commit 9d42fed6811d011890af99d5de57c4d0089deaf6

View file

@ -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)

View file

@ -6,10 +6,16 @@
include(MacDependencyPaths) include(MacDependencyPaths)
# For finding zeek-plugin-create-package.sh and zeek-plugin-install-package.sh. # 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. # 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. # 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 # Note: the straightforward way would be setting `Broker_ROOT` instead, but

View file

@ -4,7 +4,7 @@ binpac_root=@ZEEK_CONFIG_BINPAC_ROOT_DIR@
broker_root=@ZEEK_CONFIG_BROKER_ROOT_DIR@ broker_root=@ZEEK_CONFIG_BROKER_ROOT_DIR@
btest_tools_dir=@ZEEK_CONFIG_BTEST_TOOLS_DIR@ btest_tools_dir=@ZEEK_CONFIG_BTEST_TOOLS_DIR@
build_type=@CMAKE_BUILD_TYPE_LOWER@ 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@ config_dir=@ZEEK_ETC_INSTALL_DIR@
have_spicy=@USE_SPICY_ANALYZERS@ have_spicy=@USE_SPICY_ANALYZERS@
include_dir=@CMAKE_INSTALL_PREFIX@/include include_dir=@CMAKE_INSTALL_PREFIX@/include