cmake_minimum_required(VERSION 3.16) project(MAX25StackLite VERSION 1.8.0 LANGUAGES C) include(GNUInstallDirs) enable_testing() if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(MAX25Platform) include(MAX25Ax25) option(MAX25_BUILD_CRDOP "Build and install MAX25-SoftModem (CRDOP)" ON) option(MAX25_BUILD_MAX25_BCPR "Build stacks/max25-bcpr BayCom/based SER12 (default ON)" ON) if(DEFINED MAX25_BUILD_BCPR) set(MAX25_BUILD_MAX25_BCPR "${MAX25_BUILD_BCPR}" CACHE BOOL "Build max25-bcpr (legacy MAX25_BUILD_BCPR)" FORCE) endif() option(MAX25_BUILD_TERMINAL "Build max25-terminal / max25-client" ON) option(MAX25_BUILD_DAEMON "Install max25d" ON) if(MAX25_BUILD_CRDOP) add_subdirectory(stacks/crdop "${CMAKE_BINARY_DIR}/crdop") endif() if(MAX25_BUILD_MAX25_BCPR) add_subdirectory(stacks/max25-bcpr "${CMAKE_BINARY_DIR}/max25-bcpr") endif() if(MAX25_BUILD_TERMINAL) add_subdirectory(stacks/terminal) endif() if(MAX25_BUILD_DAEMON) execute_process( COMMAND "${CMAKE_COMMAND}" -E chmod u+x "${CMAKE_SOURCE_DIR}/stacks/daemon/max25d" "${CMAKE_SOURCE_DIR}/stacks/daemon/max25d.py" ERROR_QUIET ) install(PROGRAMS "${CMAKE_SOURCE_DIR}/stacks/daemon/max25d" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(PROGRAMS "${CMAKE_SOURCE_DIR}/stacks/daemon/max25d.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/daemon_log.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/kiss_bridge.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/ax25_codec.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/device_backends.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/banlist.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/reporting_quality.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/privilege_drop.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/tx_pace.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/paths.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/max25_platform.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "${CMAKE_SOURCE_DIR}/stacks/daemon/modular_tcp_server.py" DESTINATION "${CMAKE_INSTALL_BINDIR}") endif() install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/max25-ctl" DESTINATION "${CMAKE_INSTALL_BINDIR}") install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/max25d-session.sh" DESTINATION "${CMAKE_INSTALL_BINDIR}" RENAME max25d-session) install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/run-max25d.sh" DESTINATION "${CMAKE_INSTALL_BINDIR}" RENAME run-max25d) install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/run-max25-terminal.sh" DESTINATION "${CMAKE_INSTALL_BINDIR}" RENAME run-max25-terminal) install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/max25-lite-setup.sh" DESTINATION "${CMAKE_INSTALL_BINDIR}" RENAME max25-lite-setup) install(FILES "${CMAKE_SOURCE_DIR}/share/max25/max25d.lite.ini.example" "${CMAKE_SOURCE_DIR}/share/max25/max25d.ini.example" DESTINATION "${CMAKE_INSTALL_DATADIR}/max25" ) if(MAX25_BUILD_CRDOP) install(FILES "${CMAKE_SOURCE_DIR}/share/max25/max25d.lite.crdop.ini.example" DESTINATION "${CMAKE_INSTALL_DATADIR}/max25" ) endif() if(MAX25_BUILD_MAX25_BCPR) install(FILES "${CMAKE_SOURCE_DIR}/share/max25/max25d.lite.bcpr.ini.example" DESTINATION "${CMAKE_INSTALL_DATADIR}/max25" ) install(PROGRAMS "${CMAKE_SOURCE_DIR}/stacks/max25-bcpr/tools/max25-bcpr-ctl" DESTINATION "${CMAKE_INSTALL_SBINDIR}") endif() if(EXISTS "${CMAKE_SOURCE_DIR}/share/max25/max25d.service.example") install(FILES "${CMAKE_SOURCE_DIR}/share/max25/max25d.service.example" DESTINATION "${CMAKE_INSTALL_DATADIR}/max25") endif() add_custom_target(max25_daemon_smoke COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_paths.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_proto.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_auth.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_ax25_codec.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_kiss_bridge.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_baycom_backend.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_bcpr_backend.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_crdop_backend.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_multi_device.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_bans.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_audio_dummy_backend.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_modular_tcp.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_max25_platform.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_serial_watch.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_daemon_log.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_reporting.py" COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH= python3 "${CMAKE_SOURCE_DIR}/stacks/daemon/test_reporting_quality.py" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "max25d M25/1 smoke tests (Lite)" ) add_custom_target(max25_wizard_smoke COMMAND bash "${CMAKE_SOURCE_DIR}/scripts/test-wizard.sh" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "max25-lite-setup.sh non-interactive smoke (serial/baycom/crdop)" ) add_custom_target(max25_test DEPENDS max25_daemon_smoke max25_wizard_smoke ) if(TARGET max25-terminal) add_custom_target(max25_terminal_test COMMAND "${CMAKE_COMMAND}" -E env MAX25_TERMINAL="${CMAKE_BINARY_DIR}/bin/max25-terminal" bash "${CMAKE_SOURCE_DIR}/stacks/terminal/test-terminal.sh" DEPENDS max25-terminal WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "max25-terminal TCP probe" ) add_dependencies(max25_test max25_terminal_test) endif() if(TARGET crdopc) add_custom_target(crdop_smoke COMMAND "${CMAKE_COMMAND}" -E env CRDOP_BIN="${CMAKE_BINARY_DIR}/bin/crdopc" bash "${CMAKE_SOURCE_DIR}/stacks/crdop/scripts/test-smoke.sh" DEPENDS crdopc WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "CRDOP smoke test" ) add_dependencies(max25_test crdop_smoke) endif() message(STATUS "MAX25-Stack-Lite → ${CMAKE_BINARY_DIR}/bin (install prefix: ${CMAKE_INSTALL_PREFIX})")