summaryrefslogtreecommitdiff
path: root/stacks/crdop/cmake
diff options
context:
space:
mode:
authorinfo@mode42.com <info@mode42.com>2026-08-07 18:25:13 +0000
committerinfo@mode42.com <info@mode42.com>2026-08-07 18:25:13 +0000
commit04d965d67a7264a1c7c211494aebda1953df7603 (patch)
tree0ebd700a6e219f84a26a656f4bee8778bc75da7b /stacks/crdop/cmake
Initial push
Diffstat (limited to 'stacks/crdop/cmake')
-rw-r--r--stacks/crdop/cmake/CRDOPCompiler.cmake37
-rw-r--r--stacks/crdop/cmake/CRDOPPlatform.cmake71
-rw-r--r--stacks/crdop/cmake/CRDOPTests.cmake104
-rw-r--r--stacks/crdop/cmake/CRDOPVendorArdopcf.cmake127
-rw-r--r--stacks/crdop/cmake/toolchains/aarch64-linux-gnu.cmake4
-rw-r--r--stacks/crdop/cmake/toolchains/arm-linux-gnueabihf.cmake4
-rw-r--r--stacks/crdop/cmake/toolchains/x86_64-w64-mingw32.cmake4
7 files changed, 351 insertions, 0 deletions
diff --git a/stacks/crdop/cmake/CRDOPCompiler.cmake b/stacks/crdop/cmake/CRDOPCompiler.cmake
new file mode 100644
index 0000000..e1aab37
--- /dev/null
+++ b/stacks/crdop/cmake/CRDOPCompiler.cmake
@@ -0,0 +1,37 @@
+# CRDOP compiler detection and warning flags (GCC, Clang, MSVC)
+
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ set(CRDOP_COMPILER "gcc")
+elseif(CMAKE_C_COMPILER_ID MATCHES "Clang|AppleClang")
+ set(CRDOP_COMPILER "clang")
+elseif(MSVC)
+ set(CRDOP_COMPILER "msvc")
+else()
+ set(CRDOP_COMPILER "${CMAKE_C_COMPILER_ID}")
+endif()
+
+message(STATUS "CRDOP compiler=${CRDOP_COMPILER} (${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION})")
+
+function(crdop_set_compile_options target)
+ if(MSVC)
+ target_compile_options(${target} PRIVATE /W3 /utf-8)
+ else()
+ target_compile_options(${target} PRIVATE -Wall -Wextra -Wno-unused-parameter)
+ if(CRDOP_COMPILER STREQUAL "clang")
+ target_compile_options(${target} PRIVATE
+ -Wno-gnu-zero-variadic-macro-arguments
+ -Wno-deprecated-non-prototype
+ )
+ endif()
+ if(CMAKE_BUILD_TYPE STREQUAL "Release")
+ target_compile_options(${target} PRIVATE -O2)
+ endif()
+ endif()
+endfunction()
+
+include(CheckLinkerFlag)
+if(NOT WIN32 AND NOT APPLE)
+ check_linker_flag(C "-Wl,--wrap=malloc" CRDOP_LINKER_SUPPORTS_WRAP)
+else()
+ set(CRDOP_LINKER_SUPPORTS_WRAP FALSE)
+endif()
diff --git a/stacks/crdop/cmake/CRDOPPlatform.cmake b/stacks/crdop/cmake/CRDOPPlatform.cmake
new file mode 100644
index 0000000..9d78683
--- /dev/null
+++ b/stacks/crdop/cmake/CRDOPPlatform.cmake
@@ -0,0 +1,71 @@
+# CRDOP platform / architecture detection (standalone project)
+#
+# Tested: Linux, *BSD, Windows, macOS — GCC and Clang/LLVM
+
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$")
+ set(CRDOP_ARCH "aarch64")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7|armv7l|arm)$")
+ set(CRDOP_ARCH "arm32")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86)$")
+ set(CRDOP_ARCH "x86")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$")
+ set(CRDOP_ARCH "x86_64")
+else()
+ set(CRDOP_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
+endif()
+
+set(CRDOP_PLATFORM_INCLUDES "")
+set(CRDOP_PLATFORM_LIBS "")
+set(CRDOP_PLATFORM_SOURCES "")
+
+if(WIN32)
+ set(CRDOP_PLATFORM "windows")
+ set(CRDOP_PLATFORM_SOURCES
+ src/windows/Waveout.c
+ lib/hid/hid.c
+ )
+ set(CRDOP_PLATFORM_LIBS wsock32 winmm setupapi ws2_32)
+elseif(APPLE)
+ set(CRDOP_PLATFORM "darwin")
+ set(CRDOP_PLATFORM_SOURCES
+ src/linux/ALSASound.c
+ src/linux/LinSerial.c
+ src/darwin/alsa_shim.c
+ )
+ list(APPEND CRDOP_PLATFORM_INCLUDES "${VENDOR_DIR}/src")
+ find_library(CRDOP_COREAUDIO_LIB CoreAudio REQUIRED)
+ find_library(CRDOP_AUDIOTOOLBOX_LIB AudioToolbox REQUIRED)
+ find_library(CRDOP_COREFOUNDATION_LIB CoreFoundation REQUIRED)
+ set(CRDOP_PLATFORM_LIBS
+ ${CRDOP_COREAUDIO_LIB}
+ ${CRDOP_AUDIOTOOLBOX_LIB}
+ ${CRDOP_COREFOUNDATION_LIB}
+ pthread m
+ )
+elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+ set(CRDOP_PLATFORM "freebsd-oss")
+ set(CRDOP_PLATFORM_SOURCES
+ src/linux/LinSerial.c
+ )
+ set(CRDOP_PLATFORM_LIBS pthread m)
+elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD|NetBSD|DragonFly")
+ set(CRDOP_PLATFORM "bsd-oss")
+ set(CRDOP_PLATFORM_SOURCES
+ src/linux/LinSerial.c
+ )
+ set(CRDOP_PLATFORM_LIBS pthread m)
+elseif(UNIX)
+ set(CRDOP_PLATFORM "linux")
+ set(CRDOP_PLATFORM_SOURCES
+ src/linux/ALSASound.c
+ src/linux/LinSerial.c
+ )
+ find_package(PkgConfig REQUIRED)
+ pkg_check_modules(ALSA REQUIRED alsa)
+ set(CRDOP_PLATFORM_INCLUDES ${ALSA_INCLUDE_DIRS})
+ set(CRDOP_PLATFORM_LIBS ${ALSA_LIBRARIES} rt pthread m)
+else()
+ message(FATAL_ERROR "CRDOP: unsupported system ${CMAKE_SYSTEM_NAME}")
+endif()
+
+message(STATUS "CRDOP platform=${CRDOP_PLATFORM} arch=${CRDOP_ARCH} system=${CMAKE_SYSTEM_NAME}")
diff --git a/stacks/crdop/cmake/CRDOPTests.cmake b/stacks/crdop/cmake/CRDOPTests.cmake
new file mode 100644
index 0000000..64b6b48
--- /dev/null
+++ b/stacks/crdop/cmake/CRDOPTests.cmake
@@ -0,0 +1,104 @@
+# Upstream ardopcf cmocka unit tests (Unix + GNU/Clang ld --wrap)
+
+option(CRDOP_BUILD_TESTS "Build and register upstream ardopcf unit tests" OFF)
+
+if(NOT CRDOP_BUILD_TESTS)
+ return()
+endif()
+
+if(WIN32 OR APPLE)
+ message(STATUS "CRDOP_BUILD_TESTS: skipped on ${CRDOP_PLATFORM} (cmocka/--wrap needs Unix GNU or lld linker)")
+ return()
+endif()
+
+find_package(PkgConfig QUIET)
+if(PkgConfig_FOUND)
+ pkg_check_modules(CMOCKA QUIET cmocka)
+endif()
+
+if(NOT CMOCKA_FOUND)
+ find_path(CMOCKA_INCLUDE_DIR cmocka.h)
+ find_library(CMOCKA_LIBRARY cmocka)
+ if(CMOCKA_INCLUDE_DIR AND CMOCKA_LIBRARY)
+ set(CMOCKA_FOUND TRUE)
+ set(CMOCKA_INCLUDE_DIRS "${CMOCKA_INCLUDE_DIR}")
+ set(CMOCKA_LIBRARIES "${CMOCKA_LIBRARY}")
+ endif()
+endif()
+
+if(NOT CMOCKA_FOUND)
+ message(WARNING "CRDOP_BUILD_TESTS: libcmocka not found — install cmocka dev package (see docs/BUILD.md)")
+ return()
+endif()
+
+if(NOT CRDOP_LINKER_SUPPORTS_WRAP)
+ message(WARNING "CRDOP_BUILD_TESTS: linker does not support --wrap; unit tests disabled")
+ return()
+endif()
+
+enable_testing()
+
+set(CRDOP_VENDOR_TEST_DIR "${VENDOR_DIR}/test/ardop")
+set(CRDOP_VENDOR_TEST_COMMON
+ "${CRDOP_VENDOR_TEST_DIR}/setup.c"
+)
+
+function(crdop_add_vendor_test name)
+ cmake_parse_arguments(ARG "" "" "SOURCES;WRAP" ${ARGN})
+ set(test_src "${CRDOP_VENDOR_TEST_DIR}/test_${name}.c")
+ if(NOT EXISTS "${test_src}")
+ message(FATAL_ERROR "CRDOP test source missing: ${test_src}")
+ endif()
+
+ set(sources "${test_src}" ${CRDOP_VENDOR_TEST_COMMON})
+ if(ARG_SOURCES)
+ foreach(rel IN LISTS ARG_SOURCES)
+ list(APPEND sources "${VENDOR_DIR}/${rel}")
+ endforeach()
+ endif()
+
+ add_executable(crdop_test_${name} ${sources})
+ crdop_set_compile_options(crdop_test_${name})
+
+ target_include_directories(crdop_test_${name} PRIVATE
+ "${CRDOP_ROOT}/include"
+ "${VENDOR_DIR}/src"
+ "${VENDOR_DIR}/lib"
+ ${CRDOP_PLATFORM_INCLUDES}
+ )
+
+ if(ARG_SOURCES)
+ target_link_libraries(crdop_test_${name} PRIVATE m pthread)
+ if(CRDOP_PLATFORM STREQUAL "linux")
+ target_link_libraries(crdop_test_${name} PRIVATE rt)
+ endif()
+ else()
+ target_link_libraries(crdop_test_${name} PRIVATE ardopcf_vendor)
+ endif()
+
+ target_link_libraries(crdop_test_${name} PRIVATE ${CMOCKA_LIBRARIES})
+ target_include_directories(crdop_test_${name} PRIVATE ${CMOCKA_INCLUDE_DIRS})
+
+ if(ARG_WRAP)
+ foreach(sym IN LISTS ARG_WRAP)
+ target_link_options(crdop_test_${name} PRIVATE "-Wl,--wrap=${sym}")
+ endforeach()
+ endif()
+
+ add_test(NAME crdop_test_${name} COMMAND crdop_test_${name})
+endfunction()
+
+crdop_add_vendor_test(ARDOPCommon)
+crdop_add_vendor_test(HostInterface)
+crdop_add_vendor_test(Locator)
+crdop_add_vendor_test(Packed6)
+crdop_add_vendor_test(StationId)
+crdop_add_vendor_test(log
+ SOURCES
+ src/common/log_file.c
+ src/common/log.c
+ WRAP
+ fopen fclose fwrite fflush freopen
+)
+
+message(STATUS "CRDOP_BUILD_TESTS: registered upstream ardopcf cmocka tests")
diff --git a/stacks/crdop/cmake/CRDOPVendorArdopcf.cmake b/stacks/crdop/cmake/CRDOPVendorArdopcf.cmake
new file mode 100644
index 0000000..e82c605
--- /dev/null
+++ b/stacks/crdop/cmake/CRDOPVendorArdopcf.cmake
@@ -0,0 +1,127 @@
+# Legacy vendor/ardopcf build (opt-in only; not shipped in MAX25 v1).
+
+include("${CRDOP_ROOT}/cmake/CRDOPCompiler.cmake")
+include("${CRDOP_ROOT}/cmake/CRDOPPlatform.cmake")
+
+option(CRDOP_BUILD_TESTS "Build upstream ardopcf cmocka unit tests" OFF)
+
+set(CRDOP_VENDOR_COMMON
+ lib/rawhid/rawhid.c
+ lib/rockliff/rrs.c
+ lib/ws_server/ws_server.c
+ src/common/ARDOPC.c
+ src/common/ARDOPCommon.c
+ src/common/ardopSampleArrays.c
+ src/common/ARQ.c
+ src/common/BusyDetect.c
+ src/common/FEC.c
+ src/common/FFT.c
+ src/common/HostInterface.c
+ src/common/Locator.c
+ src/common/log_file.c
+ src/common/log.c
+ src/common/Modulate.c
+ src/common/Packed6.c
+ src/common/RXO.c
+ src/common/sdft.c
+ src/common/SoundInput.c
+ src/common/StationId.c
+ src/common/TCPHostInterface.c
+ src/common/txframe.c
+ src/common/wav.c
+ src/common/Webgui.c
+ src/common/noise.c
+ src/common/ardopcf.c
+)
+
+set(CRDOP_VENDOR_SRCS "")
+foreach(rel IN LISTS CRDOP_VENDOR_COMMON CRDOP_PLATFORM_SOURCES)
+ list(APPEND CRDOP_VENDOR_SRCS "${VENDOR_DIR}/${rel}")
+endforeach()
+
+set(TXT2C "${CMAKE_BINARY_DIR}/txt2c")
+add_executable(txt2c "${VENDOR_DIR}/lib/txt2c/txt2c.c")
+crdop_set_compile_options(txt2c)
+set_target_properties(txt2c PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
+
+set(WEBGUI_HTML_C "${CMAKE_BINARY_DIR}/gen-webgui.html.c")
+set(WEBGUI_JS_C "${CMAKE_BINARY_DIR}/gen-webgui.js.c")
+add_custom_command(
+ OUTPUT "${WEBGUI_HTML_C}"
+ COMMAND txt2c "${VENDOR_DIR}/webgui/webgui.html" "${WEBGUI_HTML_C}" webgui_html
+ DEPENDS txt2c "${VENDOR_DIR}/webgui/webgui.html"
+ COMMENT "Embedding webgui.html"
+)
+add_custom_command(
+ OUTPUT "${WEBGUI_JS_C}"
+ COMMAND txt2c "${VENDOR_DIR}/webgui/webgui.js" "${WEBGUI_JS_C}" webgui_js
+ DEPENDS txt2c "${VENDOR_DIR}/webgui/webgui.js"
+ COMMENT "Embedding webgui.js"
+)
+
+add_library(ardopcf_vendor_objs OBJECT
+ ${CRDOP_VENDOR_SRCS}
+ "${WEBGUI_HTML_C}"
+ "${WEBGUI_JS_C}"
+)
+
+target_include_directories(ardopcf_vendor_objs PRIVATE
+ "${CRDOP_ROOT}/include"
+ "${VENDOR_DIR}/src"
+ "${VENDOR_DIR}/lib"
+ ${CRDOP_PLATFORM_INCLUDES}
+)
+
+target_compile_definitions(ardopcf_vendor_objs PRIVATE CRDOP_BUILD=1)
+
+if(WIN32)
+ target_compile_definitions(ardopcf_vendor_objs PRIVATE WIN32 _CRT_SECURE_NO_DEPRECATE)
+endif()
+
+if(APPLE)
+ target_compile_definitions(ardopcf_vendor_objs PRIVATE __APPLE__)
+endif()
+
+crdop_set_compile_options(ardopcf_vendor_objs)
+
+add_executable(crdopc
+ "${CRDOP_ROOT}/src/crdop_version.c"
+ $<TARGET_OBJECTS:ardopcf_vendor_objs>
+)
+
+target_include_directories(crdopc PRIVATE
+ "${CRDOP_ROOT}/include"
+ "${VENDOR_DIR}/src"
+ "${VENDOR_DIR}/lib"
+ ${CRDOP_PLATFORM_INCLUDES}
+)
+
+target_compile_definitions(crdopc PRIVATE CRDOP_BUILD=1)
+
+if(WIN32)
+ target_compile_definitions(crdopc PRIVATE WIN32 _CRT_SECURE_NO_DEPRECATE)
+endif()
+
+if(APPLE)
+ target_compile_definitions(crdopc PRIVATE __APPLE__)
+endif()
+
+crdop_set_compile_options(crdopc)
+target_link_libraries(crdopc PRIVATE ${CRDOP_PLATFORM_LIBS})
+
+add_library(ardopcf_vendor STATIC
+ "${CRDOP_ROOT}/src/crdop_version.c"
+ $<TARGET_OBJECTS:ardopcf_vendor_objs>
+)
+target_include_directories(ardopcf_vendor PUBLIC
+ "${CRDOP_ROOT}/include"
+ "${VENDOR_DIR}/src"
+ "${VENDOR_DIR}/lib"
+ ${CRDOP_PLATFORM_INCLUDES}
+)
+target_compile_definitions(ardopcf_vendor PUBLIC CRDOP_BUILD=1)
+target_link_libraries(ardopcf_vendor PUBLIC ${CRDOP_PLATFORM_LIBS})
+
+include("${CRDOP_ROOT}/cmake/CRDOPTests.cmake")
+
+install(TARGETS crdopc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/stacks/crdop/cmake/toolchains/aarch64-linux-gnu.cmake b/stacks/crdop/cmake/toolchains/aarch64-linux-gnu.cmake
new file mode 100644
index 0000000..59e3a37
--- /dev/null
+++ b/stacks/crdop/cmake/toolchains/aarch64-linux-gnu.cmake
@@ -0,0 +1,4 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
+set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
diff --git a/stacks/crdop/cmake/toolchains/arm-linux-gnueabihf.cmake b/stacks/crdop/cmake/toolchains/arm-linux-gnueabihf.cmake
new file mode 100644
index 0000000..bb70e64
--- /dev/null
+++ b/stacks/crdop/cmake/toolchains/arm-linux-gnueabihf.cmake
@@ -0,0 +1,4 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR armv7l)
+set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
+set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
diff --git a/stacks/crdop/cmake/toolchains/x86_64-w64-mingw32.cmake b/stacks/crdop/cmake/toolchains/x86_64-w64-mingw32.cmake
new file mode 100644
index 0000000..1b44215
--- /dev/null
+++ b/stacks/crdop/cmake/toolchains/x86_64-w64-mingw32.cmake
@@ -0,0 +1,4 @@
+set(CMAKE_SYSTEM_NAME Windows)
+set(CMAKE_SYSTEM_PROCESSOR x86_64)
+set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
+set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com