You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
399 lines
13 KiB
399 lines
13 KiB
#/**
|
|
#* Digital Voice Modem - Host Software
|
|
#* GPLv2 Open Source. Use is subject to license terms.
|
|
#* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
#*
|
|
#* @package DVM / Host Software
|
|
#*
|
|
#*/
|
|
#/*
|
|
#* Copyright (C) 2022 by Bryan Biedenkapp N2PLL
|
|
#* Copyright (C) 2022 by Natalie Moore <https://github.com/jelimoore>
|
|
#*
|
|
#* This program is free software; you can redistribute it and/or modify
|
|
#* it under the terms of the GNU General Public License as published by
|
|
#* the Free Software Foundation; either version 2 of the License, or
|
|
#* (at your option) any later version.
|
|
#*
|
|
#* This program is distributed in the hope that it will be useful,
|
|
#* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
#* GNU General Public License for more details.
|
|
#*
|
|
#* You should have received a copy of the GNU General Public License
|
|
#* along with this program; if not, write to the Free Software
|
|
#* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
#*/
|
|
cmake_minimum_required(VERSION 3.18.4)
|
|
|
|
# dvmhost source/header files
|
|
file(GLOB dvmhost_SRC
|
|
# DMR module
|
|
"dmr/*.h"
|
|
"dmr/*.cpp"
|
|
"dmr/acl/*.h"
|
|
"dmr/acl/*.cpp"
|
|
"dmr/data/*.h"
|
|
"dmr/data/*.cpp"
|
|
"dmr/edac/*.h"
|
|
"dmr/edac/*.cpp"
|
|
"dmr/lc/*.h"
|
|
"dmr/lc/*.cpp"
|
|
"dmr/lc/csbk/*.h"
|
|
"dmr/lc/csbk/*.cpp"
|
|
"dmr/lookups/*.h"
|
|
"dmr/lookups/*.cpp"
|
|
"dmr/packet*.h"
|
|
"dmr/packet/*.cpp"
|
|
|
|
# P25 module
|
|
"p25/*.h"
|
|
"p25/*.cpp"
|
|
"p25/acl/*.h"
|
|
"p25/acl/*.cpp"
|
|
"p25/data/*.h"
|
|
"p25/data/*.cpp"
|
|
"p25/dfsi/*.h"
|
|
"p25/dfsi/*.cpp"
|
|
"p25/dfsi/packet/*.h"
|
|
"p25/dfsi/packet/*.cpp"
|
|
"p25/edac/*.h"
|
|
"p25/edac/*.cpp"
|
|
"p25/lc/*.h"
|
|
"p25/lc/*.cpp"
|
|
"p25/lc/tdulc/*.h"
|
|
"p25/lc/tdulc/*.cpp"
|
|
"p25/lc/tsbk/*.h"
|
|
"p25/lc/tsbk/*.cpp"
|
|
"p25/lookups/*.h"
|
|
"p25/lookups/*.cpp"
|
|
"p25/packet/*.h"
|
|
"p25/packet/*.cpp"
|
|
|
|
# NXDN module
|
|
"nxdn/*.h"
|
|
"nxdn/*.cpp"
|
|
"nxdn/acl/*.h"
|
|
"nxdn/acl/*.cpp"
|
|
"nxdn/channel/*.h"
|
|
"nxdn/channel/*.cpp"
|
|
"nxdn/lc/*.h"
|
|
"nxdn/lc/*.cpp"
|
|
"nxdn/lc/rcch/*.h"
|
|
"nxdn/lc/rcch/*.cpp"
|
|
"nxdn/packet/*.h"
|
|
"nxdn/packet/*.cpp"
|
|
|
|
# Core
|
|
"edac/*.h"
|
|
"edac/*.cpp"
|
|
"host/*.h"
|
|
"host/*.cpp"
|
|
"host/calibrate/*.h"
|
|
"host/calibrate/*.cpp"
|
|
"host/setup/*.h"
|
|
"host/setup/*.cpp"
|
|
"lookups/*.h"
|
|
"lookups/*.cpp"
|
|
"modem/*.h"
|
|
"modem/*.cpp"
|
|
"modem/port/*.h"
|
|
"modem/port/*.cpp"
|
|
"network/*.h"
|
|
"network/*.cpp"
|
|
"network/json/*.h"
|
|
"remote/RemoteCommand.cpp"
|
|
"remote/RemoteCommand.h"
|
|
"yaml/*.h"
|
|
"yaml/*.cpp"
|
|
"*.h"
|
|
"*.cpp"
|
|
)
|
|
|
|
# dvmcmd source/header files
|
|
file(GLOB dvmcmd_SRC
|
|
"network/UDPSocket.h"
|
|
"network/UDPSocket.cpp"
|
|
"remote/*.h"
|
|
"remote/*.cpp"
|
|
"edac/SHA256.h"
|
|
"edac/SHA256.cpp"
|
|
"Defines.h"
|
|
"Thread.h"
|
|
"Thread.cpp"
|
|
"Log.h"
|
|
"Log.cpp"
|
|
"Utils.h"
|
|
"Utils.cpp"
|
|
)
|
|
|
|
# dvmtest source/header files
|
|
file(GLOB dvmtests_SRC
|
|
"tests/nulltest.cpp"
|
|
|
|
"tests/edac/*.cpp"
|
|
|
|
"tests/p25/*.cpp"
|
|
)
|
|
|
|
# digital mode options
|
|
option(ENABLE_DMR "Enable DMR Digtial Mode" on)
|
|
option(ENABLE_P25 "Enable P25 Digital Mode" on)
|
|
option(ENABLE_NXDN "Enable NXDN Digital Mode" off)
|
|
option(ENABLE_DFSI_SUPPORT "Enable P25 DFSI Transport Support" off)
|
|
option(ENABLE_TESTS "Enable compilation of test suite" off)
|
|
|
|
message(CHECK_START "DMR Digital Mode")
|
|
if (ENABLE_DMR)
|
|
add_definitions(-DENABLE_DMR)
|
|
message(CHECK_PASS "enabled")
|
|
else ()
|
|
message(CHECK_PASS "disabled")
|
|
endif (ENABLE_DMR)
|
|
message(CHECK_START "P25 Digital Mode")
|
|
if (ENABLE_P25)
|
|
add_definitions(-DENABLE_P25)
|
|
message(CHECK_PASS "enabled")
|
|
else ()
|
|
message(CHECK_PASS "disabled")
|
|
endif (ENABLE_P25)
|
|
message(CHECK_START "NXDN Digital Mode")
|
|
if (ENABLE_NXDN)
|
|
add_definitions(-DENABLE_NXDN)
|
|
message(CHECK_PASS "enabled")
|
|
else ()
|
|
message(CHECK_PASS "disabled")
|
|
endif (ENABLE_NXDN)
|
|
message(CHECK_START "P25 DFSI Support")
|
|
if (ENABLE_DFSI_SUPPORT)
|
|
add_definitions(-DENABLE_DFSI_SUPPORT)
|
|
message(CHECK_PASS "enabled")
|
|
else ()
|
|
message(CHECK_PASS "disabled")
|
|
endif (ENABLE_DFSI_SUPPORT)
|
|
message(CHECK_START "Enable test suite compilation")
|
|
if (ENABLE_TESTS)
|
|
message(CHECK_PASS "enabled")
|
|
else ()
|
|
message(CHECK_PASS "disabled")
|
|
endif (ENABLE_TESTS)
|
|
|
|
# debug options
|
|
option(DEBUG_DMR_PDU_DATA "" off)
|
|
option(DEBUG_CRC "" off)
|
|
option(DEBUG_RS "" off)
|
|
option(DEBUG_MODEM_CAL "" off)
|
|
option(DEBUG_MODEM "" off)
|
|
option(DEBUG_NXDN_FACCH1 "" off)
|
|
option(DEBUG_NXDN_SACCH "" off)
|
|
option(DEBUG_NXDN_UDCH "" off)
|
|
option(DEBUG_NXDN_LICH "" off)
|
|
option(DEBUG_NXDN_CAC "" off)
|
|
option(DEBUG_P25_PDU_DATA "" off)
|
|
option(DEBUG_P25_HDU "" off)
|
|
option(DEBUG_P25_LDU1 "" off)
|
|
option(DEBUG_P25_LDU2 "" off)
|
|
option(DEBUG_P25_TDULC "" off)
|
|
option(DEBUG_P25_TSBK "" off)
|
|
option(DEBUG_P25_DFSI "" off)
|
|
option(DEBUG_RINGBUFFER "" off)
|
|
|
|
if (DEBUG_DMR_PDU_DATA)
|
|
add_definitions(-DDEBUG_DMR_PDU_DATA)
|
|
endif (DEBUG_DMR_PDU_DATA)
|
|
if (DEBUG_CRC)
|
|
add_definitions(-DDEBUG_CRC)
|
|
endif (DEBUG_CRC)
|
|
if (DEBUG_RS)
|
|
add_definitions(-DDEBUG_RS)
|
|
endif (DEBUG_RS)
|
|
if (DEBUG_MODEM_CAL)
|
|
add_definitions(-DDEBUG_MODEM_CAL)
|
|
endif (DEBUG_MODEM_CAL)
|
|
if (DEBUG_MODEM)
|
|
add_definitions(-DDEBUG_MODEM)
|
|
endif (DEBUG_MODEM)
|
|
if (DEBUG_NXDN_FACCH1)
|
|
add_definitions(-DDEBUG_NXDN_FACCH1)
|
|
endif (DEBUG_NXDN_FACCH1)
|
|
if (DEBUG_NXDN_SACCH)
|
|
add_definitions(-DDEBUG_NXDN_SACCH)
|
|
endif (DEBUG_NXDN_SACCH)
|
|
if (DEBUG_NXDN_UDCH)
|
|
add_definitions(-DDEBUG_NXDN_UDCH)
|
|
endif (DEBUG_NXDN_UDCH)
|
|
if (DEBUG_NXDN_LICH)
|
|
add_definitions(-DDEBUG_NXDN_LICH)
|
|
endif (DEBUG_NXDN_LICH)
|
|
if (DEBUG_NXDN_CAC)
|
|
add_definitions(-DDEBUG_NXDN_CAC)
|
|
endif (DEBUG_NXDN_CAC)
|
|
if (DEBUG_P25_PDU_DATA)
|
|
add_definitions(-DDEBUG_P25_PDU_DATA)
|
|
endif (DEBUG_P25_PDU_DATA)
|
|
if (DEBUG_P25_HDU)
|
|
add_definitions(-DDEBUG_P25_HDU)
|
|
endif (DEBUG_P25_HDU)
|
|
if (DEBUG_P25_LDU1)
|
|
add_definitions(-DDEBUG_P25_LDU1)
|
|
endif (DEBUG_P25_LDU1)
|
|
if (DEBUG_P25_LDU2)
|
|
add_definitions(-DDEBUG_P25_LDU2)
|
|
endif (DEBUG_P25_LDU2)
|
|
if (DEBUG_P25_TDULC)
|
|
add_definitions(-DDEBUG_P25_TDULC)
|
|
endif (DEBUG_P25_TDULC)
|
|
if (DEBUG_P25_TSBK)
|
|
add_definitions(-DDEBUG_P25_TSBK)
|
|
endif (DEBUG_P25_TSBK)
|
|
if (DEBUG_P25_DFSI)
|
|
add_definitions(-DDEBUG_P25_DFSI)
|
|
endif (DEBUG_P25_DFSI)
|
|
if (DEBUG_RINGBUFFER)
|
|
add_definitions(-DDEBUG_RINGBUFFER)
|
|
endif (DEBUG_RINGBUFFER)
|
|
|
|
# cross-compile options
|
|
option(CROSS_COMPILE_ARM "Cross-compile for 32-bit ARM" off)
|
|
option(CROSS_COMPILE_AARCH64 "Cross-compile for 64-bit ARM" off)
|
|
option(CROSS_COMPILE_RPI_ARM "Cross-compile for (old RPi) 32-bit ARM" off)
|
|
|
|
set(CMAKE_C_COMPILER gcc)
|
|
set(CMAKE_CXX_COMPILER g++)
|
|
set(ARCH amd64)
|
|
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64)
|
|
|
|
message(CHECK_START "Cross compiling for 32-bit ARM")
|
|
if (CROSS_COMPILE_ARM)
|
|
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
|
|
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
|
|
set(ARCH arm)
|
|
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm)
|
|
message(CHECK_PASS "yes")
|
|
else ()
|
|
message(CHECK_PASS "no")
|
|
endif (CROSS_COMPILE_ARM)
|
|
message(CHECK_START "Cross compiling for 64-bit ARM")
|
|
if (CROSS_COMPILE_AARCH64)
|
|
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
|
|
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
|
|
set(ARCH arm64)
|
|
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64)
|
|
message(CHECK_PASS "yes")
|
|
else ()
|
|
message(CHECK_PASS "no")
|
|
endif (CROSS_COMPILE_AARCH64)
|
|
message(CHECK_START "Cross compiling for (old RPi) 32-bit ARM")
|
|
if (CROSS_COMPILE_RPI_ARM)
|
|
set(CMAKE_C_COMPILER /opt/tools/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
|
|
set(CMAKE_CXX_COMPILER /opt/tools/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)
|
|
set(ARCH armhf)
|
|
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE armhf)
|
|
message(CHECK_PASS "yes")
|
|
else ()
|
|
message(CHECK_PASS "no")
|
|
endif (CROSS_COMPILE_RPI_ARM)
|
|
|
|
#
|
|
# standard CMake options
|
|
#
|
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY .)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O3 -Wall -std=c++11")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O3 -Wall -std=c++11")
|
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -g -O3 -Wall -std=c++11 -s")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g -O3 -Wall -std=c++11 -s")
|
|
|
|
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
|
|
|
set(CMAKE_INSTALL_PREFIX "/opt/dvm")
|
|
set(CMAKE_INSTALL_PREFIX_TARBALL "tar_build")
|
|
|
|
set(GIT_VER "")
|
|
set(GIT_VER_HASH "")
|
|
execute_process(COMMAND git describe --abbrev=8 --dirty --always --tags WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} OUTPUT_VARIABLE GIT_VER OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(COMMAND git describe --abbrev=8 --always --tags WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} OUTPUT_VARIABLE GIT_VER_HASH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
add_definitions(-D__GIT_VER__="${GIT_VER}")
|
|
add_definitions(-D__GIT_VER_HASH__="${GIT_VER_HASH}")
|
|
|
|
# dvmhost project
|
|
project(dvmhost)
|
|
find_package(Threads REQUIRED)
|
|
add_executable(dvmhost ${dvmhost_SRC})
|
|
target_include_directories(dvmhost PRIVATE .)
|
|
target_link_libraries(dvmhost PRIVATE Threads::Threads util)
|
|
|
|
set(CPACK_GENERATOR "DEB")
|
|
set(CPACK_PACKAGE_NAME "dvmhost")
|
|
set(CPACK_DEBIAN_PACKAGE_NAME "dvmhost")
|
|
|
|
set(CPACK_PACKAGE_VENDOR "DVMProject")
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "The DVM Host software provides the host computer implementation of a mixed-mode DMR, P25 and/or NXDN or dedicated-mode DMR, P25 or NXDN repeater system that talks to the actual modem hardware. The host software; is the portion of a complete Over-The-Air modem implementation that performs the data processing, decision making and FEC correction for a digital repeater.")
|
|
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "DVMProject Authors")
|
|
set(CPACK_DEBIAN_PACKAGE_VERSION "3.00")
|
|
set(CPACK_DEBIAN_PACKAGE_RELEASE "0")
|
|
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/dvmproject")
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;${CMAKE_CURRENT_SOURCE_DIR}/debian/postrm")
|
|
|
|
set(CPACK_DEBIAN_FILE_NAME ${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_DEBIAN_PACKAGE_VERSION}-${CPACK_DEBIAN_PACKAGE_RELEASE}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb)
|
|
|
|
include(CPack)
|
|
|
|
# dvmcmd project
|
|
project(dvmcmd)
|
|
find_package(Threads REQUIRED)
|
|
add_executable(dvmcmd ${dvmcmd_SRC})
|
|
target_link_libraries(dvmcmd PRIVATE Threads::Threads)
|
|
target_include_directories(dvmcmd PRIVATE .)
|
|
|
|
if (ENABLE_TESTS)
|
|
# dvmtest project
|
|
project(dvmtest)
|
|
Include(FetchContent)
|
|
|
|
FetchContent_Declare(
|
|
Catch2
|
|
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
|
GIT_TAG v3.0.1 # or a later release
|
|
)
|
|
|
|
FetchContent_MakeAvailable(Catch2)
|
|
find_package(Threads REQUIRED)
|
|
add_executable(dvmtests ${dvmhost_SRC} ${dvmtests_SRC})
|
|
target_compile_definitions(dvmtests PUBLIC -DCATCH2_TEST_COMPILATION)
|
|
target_link_libraries(dvmtests PRIVATE Catch2::Catch2WithMain Threads::Threads util)
|
|
target_include_directories(dvmtests PRIVATE .)
|
|
endif (ENABLE_TESTS)
|
|
|
|
# dvmhost/dvmcmd install
|
|
install(TARGETS dvmhost DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
|
|
install(TARGETS dvmcmd DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
|
|
install(FILES config.example.yml iden_table.dat RSSI.dat rid_acl.example.dat tg_acl.example.dat DESTINATION ${CMAKE_INSTALL_PREFIX})
|
|
install(PROGRAMS start-dvm.sh stop-dvm.sh dvm-watchdog.sh stop-watchdog.sh DESTINATION ${CMAKE_INSTALL_PREFIX})
|
|
install(CODE "execute_process(COMMAND mkdir -p /opt/dvm/log)")
|
|
install(CODE "execute_process(COMMAND bash \"-c\" \"sed -i 's/filePath: ./filePath: \\\\/opt\\\\/dvm\\\\/log\\\\//' /opt/dvm/config.example.yml\")")
|
|
install(CODE "execute_process(COMMAND bash \"-c\" \"sed -i 's/activityFilePath: ./activityFilePath: \\\\/opt\\\\/dvm\\\\/log\\\\//' /opt/dvm/config.example.yml\")")
|
|
install(CODE "execute_process(COMMAND bash \"-c\" \"sed -i 's/file: iden_table.dat/file: \\\\/opt\\\\/dvm\\\\/iden_table.dat/' /opt/dvm/config.example.yml\")")
|
|
install(CODE "execute_process(COMMAND bash \"-c\" \"sed -i 's/file: rid_acl.dat/file: \\\\/opt\\\\/dvm\\\\/rid_acl.dat/' /opt/dvm/config.example.yml\")")
|
|
install(CODE "execute_process(COMMAND bash \"-c\" \"sed -i 's/file: tg_acl.dat/file: \\\\/opt\\\\/dvm\\\\/tg_acl.dat/' /opt/dvm/config.example.yml\")")
|
|
|
|
# custom target to generate a tarball
|
|
add_custom_target(tarball
|
|
COMMAND rm -rf ${CMAKE_INSTALL_PREFIX_TARBALL}
|
|
COMMAND mkdir -p ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm/bin
|
|
COMMAND mkdir -p ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm/log
|
|
COMMAND touch ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm/log/INCLUDE_DRIECTORY
|
|
COMMAND cp -v dvmhost ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm/bin
|
|
COMMAND cp -v dvmcmd ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm/bin
|
|
COMMAND cp ../*.sh ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm
|
|
COMMAND chmod +x ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm/*.sh
|
|
COMMAND cp -v ../config*.yml ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm
|
|
COMMAND cp -v ../*.dat ${CMAKE_INSTALL_PREFIX_TARBALL}/dvm
|
|
COMMAND cd ${CMAKE_INSTALL_PREFIX_TARBALL} && tar czvf ../dvmhost_1.0.0_${ARCH}.tar.gz *
|
|
COMMAND rm -rf ${CMAKE_INSTALL_PREFIX_TARBALL})
|