summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: ce3bf8b01ba00ad6ca4d07fdc011e15ebde536e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
cmake_minimum_required(VERSION 3.16)
project(MainAX25Stack 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_TNCS "Build stacks/tncs tools" ON)
option(MAX25_BUILD_CRDOP "Build and install MAX25-SoftModem (CRDOP) — disable only if not needed" ON)
option(MAX25_BUILD_MAX25_BCPR "Build stacks/max25-bcpr BayCom/based SER12 (default ON)" ON)
# Legacy alias: -DMAX25_BUILD_BCPR still accepted
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)
option(MAX25_BUILD_WEB "Install MAX25 web UI scaffold" ON)
# Legacy kernel baycom-pr removed 2026-07-18 → vault archives/legacy/max25-stack-baycom-kernel-compa/

if(MAX25_BUILD_TNCS)
    add_subdirectory(stacks/tncs)
endif()

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_WEB)
    add_subdirectory(stacks/web)
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}")
    if(MAX25_BUILD_TNCS)
        set(_MAX25_STACK_PROGRAMS
            stacks/tncs/load-serial-env.sh
            stacks/tncs/tnc2c-boot-wait.sh
            stacks/tncs/tnc2c-host-reset.sh
            stacks/tncs/pktnc2-boot-wait.sh
        )
        set(_MAX25_STACK_DATA
            stacks/tncs/tnc2c-boot-wait.py
            stacks/tncs/tnc2c-host-reset.py
            stacks/tncs/tnc_serial_recovery.py
            stacks/tncs/tnc2c-serial.env
            stacks/tncs/pktnc2-serial.env
        )
        foreach(_script IN LISTS _MAX25_STACK_PROGRAMS)
            get_filename_component(_dir "${_script}" DIRECTORY)
            string(REPLACE "stacks/" "" _rel "${_dir}")
            install(PROGRAMS "${CMAKE_SOURCE_DIR}/${_script}"
                    DESTINATION "${CMAKE_INSTALL_DATADIR}/max25/stacks/${_rel}")
        endforeach()
        foreach(_script IN LISTS _MAX25_STACK_DATA)
            get_filename_component(_dir "${_script}" DIRECTORY)
            string(REPLACE "stacks/" "" _rel "${_dir}")
            install(FILES "${CMAKE_SOURCE_DIR}/${_script}"
                    DESTINATION "${CMAKE_INSTALL_DATADIR}/max25/stacks/${_rel}")
        endforeach()
    endif()
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)

# Operator launchers + unified TX/RX test (usable from PREFIX after install)
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/tx-rx-test.sh"
        DESTINATION "${CMAKE_INSTALL_SBINDIR}" RENAME max25-tx-rx-test)
install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/terminology-check.sh"
        DESTINATION "${CMAKE_INSTALL_SBINDIR}" RENAME max25-terminology-check)


install(FILES
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.ini.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.ini.host.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.full-station.ini.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.netdev.ini.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.freebsd.ini.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.freebsd.bcpr.ini.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.freebsd.tmodem.ini.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.freebsd.secondary.ini.example"
    "${CMAKE_SOURCE_DIR}/share/max25/max25d.main.ini.example"
    DESTINATION "${CMAKE_INSTALL_DATADIR}/max25"
)

# share/baycom/README.md only — kernel INI examples removed; use share/max25-bcpr/
if(EXISTS "${CMAKE_SOURCE_DIR}/share/baycom/README.md")
    install(FILES "${CMAKE_SOURCE_DIR}/share/baycom/README.md"
            DESTINATION "${CMAKE_INSTALL_DATADIR}/max25/baycom")
endif()

if(MAX25_BUILD_MAX25_BCPR)
    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_release_check
    COMMAND "${CMAKE_SOURCE_DIR}/scripts/release-check.sh"
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    USES_TERMINAL
    COMMENT "Run offline release-check gates"
)

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"
    )
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/tncs/test_tnc_serial_recovery.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"
)

# Unified TX/RX release test (L0 offline) — TNC + BayCom/based (bcpr)
add_custom_target(max25_tx_rx_test
    COMMAND bash "${CMAKE_SOURCE_DIR}/scripts/tx-rx-test.sh"
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    USES_TERMINAL
    COMMENT "TX/RX L0 offline (TNC + BayCom/based bcpr)"
)
add_test(NAME max25_tx_rx_offline
         COMMAND bash "${CMAKE_SOURCE_DIR}/scripts/tx-rx-test.sh"
         WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
set_tests_properties(max25_tx_rx_offline PROPERTIES LABELS "txrx;offline")

if(TARGET max25-terminal)
    add_custom_target(max25_terminal_test
        COMMAND bash "${CMAKE_SOURCE_DIR}/stacks/terminal/test-terminal.sh"
        DEPENDS max25-terminal
        WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
        COMMENT "max25-terminal TCP probe"
    )
endif()


add_custom_target(max25_test
    DEPENDS max25_daemon_smoke max25_tx_rx_test
)

if(TARGET max25-terminal)
    add_dependencies(max25_test max25_terminal_test)
endif()

if(TARGET crdop_smoke)
    add_dependencies(max25_test crdop_smoke)
endif()

if(TARGET max25_web_smoke)
    add_dependencies(max25_test max25_web_smoke)
endif()

message(STATUS "MainAX25-Stack → ${CMAKE_BINARY_DIR}/bin (install prefix: ${CMAKE_INSTALL_PREFIX})")
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com