cmake_minimum_required(VERSION 3.20)
project(agent-vm VERSION 0.1.0 LANGUAGES C CXX)
include(GNUInstallDirs)
include(CTest)
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
find_package(PkgConfig REQUIRED)
pkg_check_modules(KRUN REQUIRED IMPORTED_TARGET libkrun>=1.19)
if(KRUN_VERSION VERSION_GREATER_EQUAL "2.0")
    message(FATAL_ERROR "This backend uses the libkrun 1.x C API; install libkrun 1.19.x.")
endif()
pkg_check_modules(CAP REQUIRED IMPORTED_TARGET libcap)
pkg_check_modules(SECCOMP REQUIRED IMPORTED_TARGET libseccomp)
find_package(tomlplusplus CONFIG REQUIRED)

add_library(avm_core src/config.cpp src/sandbox.cpp src/network.cpp)
target_include_directories(avm_core PUBLIC include)
target_link_libraries(avm_core PUBLIC tomlplusplus::tomlplusplus PkgConfig::CAP PkgConfig::SECCOMP)
target_compile_definitions(avm_core PRIVATE _GNU_SOURCE)
target_compile_options(avm_core PRIVATE -Wall -Wextra -Wpedantic -Wformat=2)

add_executable(agent-vm src/main.cpp)
target_link_libraries(agent-vm PRIVATE avm_core PkgConfig::KRUN)
file(RELATIVE_PATH AVM_HELPER_RELATIVE "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_LIBEXECDIR}/agent-vm-guest")
target_compile_definitions(agent-vm PRIVATE
    AVM_VERSION="${PROJECT_VERSION}"
    AVM_RELATIVE_HELPER="${AVM_HELPER_RELATIVE}"
    AVM_INSTALLED_HELPER="${CMAKE_INSTALL_FULL_LIBEXECDIR}/agent-vm-guest")
target_compile_options(agent-vm PRIVATE -Wall -Wextra -Wpedantic -Wformat=2)

add_executable(agent-vm-guest guest/main.c guest/relay.c guest/filesystem.c)
target_include_directories(agent-vm-guest PRIVATE include)
target_compile_options(agent-vm-guest PRIVATE -Wall -Wextra -Wpedantic -Wformat=2)
add_dependencies(agent-vm agent-vm-guest)

install(TARGETS agent-vm RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS agent-vm-guest RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR})
install(FILES examples/config.toml DESTINATION ${CMAKE_INSTALL_DATADIR}/agent-vm)

if(BUILD_TESTING)
    add_executable(config-test tests/config_test.cpp)
    target_link_libraries(config-test PRIVATE avm_core)
    add_test(NAME config COMMAND config-test)
    add_executable(dbus-test tests/dbus_test.cpp)
    target_link_libraries(dbus-test PRIVATE avm_core)
    add_test(NAME dbus COMMAND dbus-test)
    set_tests_properties(dbus PROPERTIES SKIP_RETURN_CODE 77)
    add_executable(network-test tests/network_test.cpp)
    target_link_libraries(network-test PRIVATE avm_core)
    add_test(NAME network COMMAND network-test)
    add_executable(sandbox-test tests/sandbox_test.cpp)
    target_link_libraries(sandbox-test PRIVATE avm_core)
    add_test(NAME sandbox-seccomp COMMAND sandbox-test)
endif()
