include_guard(GLOBAL) include(CMakeParseArguments) # Native integration helper for a module located inside the BastionGuard tree. # It uses add_subdirectory(); it does not create an ExternalProject. # # Example (after add_executable(BastionGuard ...)): # include(src/rootguard/cmake/BastionGuardRootGuard.cmake) # bastionguard_enable_rootguard( # TARGET BastionGuard # SOURCE_DIR "${CMAKE_SOURCE_DIR}/src/rootguard" # BINARY_DIR "${CMAKE_BINARY_DIR}/bastionguard-rootguard-build" # ) function(bastionguard_enable_rootguard) set(options BUILD_TESTS) set(oneValueArgs TARGET SOURCE_DIR BINARY_DIR INIT_SYSTEM BTF) cmake_parse_arguments(RG "${options}" "${oneValueArgs}" "" ${ARGN}) if(NOT RG_TARGET OR NOT TARGET ${RG_TARGET}) message(FATAL_ERROR "bastionguard_enable_rootguard requires TARGET naming an existing target") endif() if(NOT RG_SOURCE_DIR) set(RG_SOURCE_DIR "${CMAKE_SOURCE_DIR}/src/rootguard") endif() if(NOT RG_BINARY_DIR) set(RG_BINARY_DIR "${CMAKE_BINARY_DIR}/bastionguard-rootguard-build") endif() if(NOT RG_INIT_SYSTEM) # Preserve an init system explicitly selected by the parent project or # distribution packaging (for example -DROOTGUARD_INIT_SYSTEM=systemd). # Fall back to auto-detection only when no explicit value was supplied. if(DEFINED ROOTGUARD_INIT_SYSTEM AND NOT "${ROOTGUARD_INIT_SYSTEM}" STREQUAL "") set(RG_INIT_SYSTEM "${ROOTGUARD_INIT_SYSTEM}") else() set(RG_INIT_SYSTEM auto) endif() endif() if(NOT RG_BTF) set(RG_BTF /sys/kernel/btf/vmlinux) endif() if(NOT EXISTS "${RG_SOURCE_DIR}/CMakeLists.txt") message(FATAL_ERROR "RootGuard module not found: ${RG_SOURCE_DIR}/CMakeLists.txt") endif() set(ROOTGUARD_BUILD_DAEMON ON CACHE BOOL "" FORCE) set(ROOTGUARD_BUILD_GTK_PAGE ON CACHE BOOL "" FORCE) set(ROOTGUARD_BUILD_GTK_DEMO OFF CACHE BOOL "" FORCE) set(ROOTGUARD_BUILD_TESTS ${RG_BUILD_TESTS} CACHE BOOL "" FORCE) set(ROOTGUARD_INIT_SYSTEM "${RG_INIT_SYSTEM}" CACHE STRING "" FORCE) set(ROOTGUARD_VMLINUX_BTF "${RG_BTF}" CACHE FILEPATH "" FORCE) if(NOT TARGET BastionGuard::RootGuardUI) add_subdirectory("${RG_SOURCE_DIR}" "${RG_BINARY_DIR}") endif() target_link_libraries(${RG_TARGET} PRIVATE BastionGuard::RootGuardUI) if(TARGET bastionguard-rootguard) add_dependencies(${RG_TARGET} bastionguard-rootguard) endif() if(TARGET bastionguard-rootguard-action) add_dependencies(${RG_TARGET} bastionguard-rootguard-action) endif() endfunction()