From 6622a947aef8cb3867d28f929db9a140244ce79b Mon Sep 17 00:00:00 2001 From: Derek Kozel Date: Fri, 9 Apr 2021 23:16:44 +0100 Subject: [PATCH] cmake: Refactored code structure into library with examples The project now supplies the m17cxx library in a form usable by third party applications. An example standalone CMake based app is included to as a reference or starting place. The modulation and demodulation utilities are included as apps. --- CMakeLists.txt | 72 ++++++++++++++----- apps/CMakeLists.txt | 7 ++ m17-demod.cpp => apps/m17-demod.cpp | 0 m17-demod.h => apps/m17-demod.h | 0 m17-mod.cpp => apps/m17-mod.cpp | 0 cmake/cmake_uninstall.cmake.in | 32 +++++++++ cmake/m17cxxConfig.cmake.in | 4 ++ example/CMakeLists.txt | 18 +++++ example/example.cpp | 5 ++ CRC16.h => include/m17cxx/CRC16.h | 0 .../m17cxx/CarrierDetect.h | 0 Convolution.h => include/m17cxx/Convolution.h | 0 .../m17cxx/DeviationError.h | 0 Filter.h => include/m17cxx/Filter.h | 0 FirFilter.h => include/m17cxx/FirFilter.h | 0 .../m17cxx/FrequencyError.h | 0 Fsk4Demod.h => include/m17cxx/Fsk4Demod.h | 0 Golay24.h => include/m17cxx/Golay24.h | 0 IirFilter.h => include/m17cxx/IirFilter.h | 0 .../m17cxx/LinkSetupFrame.h | 0 .../m17cxx/M17FrameDecoder.h | 0 M17Framer.h => include/m17cxx/M17Framer.h | 0 .../m17cxx/M17Modulator.h | 0 .../m17cxx/M17Randomizer.h | 0 .../m17cxx/M17Synchronizer.h | 0 .../m17cxx/PhaseEstimator.h | 0 .../m17cxx/PolynomialInterleaver.h | 0 SymbolEvm.h => include/m17cxx/SymbolEvm.h | 0 Trellis.h => include/m17cxx/Trellis.h | 0 Util.h => include/m17cxx/Util.h | 0 Viterbi.h => include/m17cxx/Viterbi.h | 0 queue.h => include/m17cxx/queue.h | 0 ESG-upload.py => scripts/ESG-upload.py | 0 src/CMakeLists.txt | 24 +++++++ tests/CMakeLists.txt | 22 +++--- 35 files changed, 157 insertions(+), 27 deletions(-) create mode 100644 apps/CMakeLists.txt rename m17-demod.cpp => apps/m17-demod.cpp (100%) rename m17-demod.h => apps/m17-demod.h (100%) rename m17-mod.cpp => apps/m17-mod.cpp (100%) create mode 100644 cmake/cmake_uninstall.cmake.in create mode 100644 cmake/m17cxxConfig.cmake.in create mode 100644 example/CMakeLists.txt create mode 100644 example/example.cpp rename CRC16.h => include/m17cxx/CRC16.h (100%) rename CarrierDetect.h => include/m17cxx/CarrierDetect.h (100%) rename Convolution.h => include/m17cxx/Convolution.h (100%) rename DeviationError.h => include/m17cxx/DeviationError.h (100%) rename Filter.h => include/m17cxx/Filter.h (100%) rename FirFilter.h => include/m17cxx/FirFilter.h (100%) rename FrequencyError.h => include/m17cxx/FrequencyError.h (100%) rename Fsk4Demod.h => include/m17cxx/Fsk4Demod.h (100%) rename Golay24.h => include/m17cxx/Golay24.h (100%) rename IirFilter.h => include/m17cxx/IirFilter.h (100%) rename LinkSetupFrame.h => include/m17cxx/LinkSetupFrame.h (100%) rename M17FrameDecoder.h => include/m17cxx/M17FrameDecoder.h (100%) rename M17Framer.h => include/m17cxx/M17Framer.h (100%) rename M17Modulator.h => include/m17cxx/M17Modulator.h (100%) rename M17Randomizer.h => include/m17cxx/M17Randomizer.h (100%) rename M17Synchronizer.h => include/m17cxx/M17Synchronizer.h (100%) rename PhaseEstimator.h => include/m17cxx/PhaseEstimator.h (100%) rename PolynomialInterleaver.h => include/m17cxx/PolynomialInterleaver.h (100%) rename SymbolEvm.h => include/m17cxx/SymbolEvm.h (100%) rename Trellis.h => include/m17cxx/Trellis.h (100%) rename Util.h => include/m17cxx/Util.h (100%) rename Viterbi.h => include/m17cxx/Viterbi.h (100%) rename queue.h => include/m17cxx/queue.h (100%) rename ESG-upload.py => scripts/ESG-upload.py (100%) create mode 100644 src/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index e6f251e..7319927 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,26 @@ cmake_minimum_required(VERSION 3.9) -project(m17-cxx-demod) -enable_language(CXX) +project(m17cxx + VERSION 0.1 + DESCRIPTION "M17 Digital Voice modulation and demodulation" + LANGUAGES CXX) -# C++17 is a required language feature for this project set(CMAKE_CXX_STANDARD 17) +# Require out-of-source builds +file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH) +if(EXISTS "${LOC_PATH}") + message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file). Please make a build subdirectory. Feel free to remove CMakeCache.txt and CMakeFiles.") +endif() + if(NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE Release) message(STATUS "Build type not specified: defaulting to release.") endif() +# Check for dependencies +message(STATUS "# Checking dependencies") + set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) @@ -18,20 +28,50 @@ include(FindPkgConfig) include(GNUInstallDirs) pkg_check_modules(CODEC2 REQUIRED codec2) -SET( Boost_USE_STATIC_LIBS FALSE ) -FIND_PACKAGE( Boost COMPONENTS program_options REQUIRED) +set(Boost_USE_STATIC_LIBS FALSE) +find_package(Boost COMPONENTS program_options REQUIRED) -add_executable(m17-demod m17-demod.cpp) -target_link_libraries(m17-demod ${CODEC2_LIBRARIES}) -install(TARGETS m17-demod DESTINATION ${CMAKE_INSTALL_BINDIR}) - -add_executable(m17-mod m17-mod.cpp) -target_link_libraries(m17-mod PRIVATE ${CODEC2_LIBRARIES} ${Boost_LIBRARIES}) -target_link_libraries(m17-mod PRIVATE Threads::Threads) -install(TARGETS m17-mod DESTINATION ${CMAKE_INSTALL_BINDIR}) +# Add subdirectories +add_subdirectory(src) +add_subdirectory(apps) find_package(GTest) if(GTEST_FOUND) - enable_testing () - add_subdirectory (tests) -endif() \ No newline at end of file + enable_testing() + add_subdirectory(tests) +endif() + +# Setup installation +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/m17cxxConfigVersion.cmake" + VERSION 0.1 + COMPATIBILITY AnyNewerVersion + ) + +configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/m17cxxConfig.cmake.in" + "${PROJECT_BINARY_DIR}/m17cxxConfig.cmake" + INSTALL_DESTINATION lib/cmake/m17cxx + ) + +install(EXPORT m17cxxTargets DESTINATION lib/cmake/m17cxx) +install(FILES "${PROJECT_BINARY_DIR}/m17cxxConfigVersion.cmake" + "${PROJECT_BINARY_DIR}/m17cxxConfig.cmake" + DESTINATION lib/cmake/m17cxx) +install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION include) + +# Create uninstall target +configure_file( + ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake + @ONLY) + +add_custom_target(uninstall + ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake + ) + +# Print summary +message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}") +message(STATUS "Building version: ${PROJECT_VERSION}") diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt new file mode 100644 index 0000000..73ad8de --- /dev/null +++ b/apps/CMakeLists.txt @@ -0,0 +1,7 @@ +add_executable(m17-demod m17-demod.cpp) +target_link_libraries(m17-demod PRIVATE m17cxx ${CODEC2_LIBRARIES}) + +add_executable(m17-mod m17-mod.cpp) +target_link_libraries(m17-mod PRIVATE m17cxx ${CODEC2_LIBRARIES} ${Boost_LIBRARIES} Threads::Threads) + +install(TARGETS m17-demod m17-mod RUNTIME DESTINATION bin) diff --git a/m17-demod.cpp b/apps/m17-demod.cpp similarity index 100% rename from m17-demod.cpp rename to apps/m17-demod.cpp diff --git a/m17-demod.h b/apps/m17-demod.h similarity index 100% rename from m17-demod.h rename to apps/m17-demod.h diff --git a/m17-mod.cpp b/apps/m17-mod.cpp similarity index 100% rename from m17-mod.cpp rename to apps/m17-mod.cpp diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in new file mode 100644 index 0000000..9ae1ae4 --- /dev/null +++ b/cmake/cmake_uninstall.cmake.in @@ -0,0 +1,32 @@ +# http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F + +IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") +ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +STRING(REGEX REPLACE "\n" ";" files "${files}") +FOREACH(file ${files}) + MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + IF(EXISTS "$ENV{DESTDIR}${file}") + EXEC_PROGRAM( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF(NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF(NOT "${rm_retval}" STREQUAL 0) + ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}") + EXEC_PROGRAM( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF(NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF(NOT "${rm_retval}" STREQUAL 0) + ELSE(EXISTS "$ENV{DESTDIR}${file}") + MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + ENDIF(EXISTS "$ENV{DESTDIR}${file}") +ENDFOREACH(file) diff --git a/cmake/m17cxxConfig.cmake.in b/cmake/m17cxxConfig.cmake.in new file mode 100644 index 0000000..ac68a29 --- /dev/null +++ b/cmake/m17cxxConfig.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/m17cxxTargets.cmake") +check_required_components("@PROJECT_NAME@") diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 0000000..5b57e00 --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.9) + +project(m17-example + VERSION 0.1 + DESCRIPTION "Standalone example M17 project" + LANGUAGES CXX) + +find_package(m17cxx CONFIG REQUIRED) +if(${m17cxx_FOUND}) + message(STATUS "Found m17cxx") + message(STATUS " M17 Library version: " ${m17cxx_VERSION}) + message(STATUS " M17 Library location: " ${m17cxx_DIR}) +else(${m17cxx_FOUND}) + message(FATAL_ERROR "Could not locate m17cxx") +endif() + +add_executable(example example.cpp) +target_link_libraries(example m17cxx) diff --git a/example/example.cpp b/example/example.cpp new file mode 100644 index 0000000..6eb8930 --- /dev/null +++ b/example/example.cpp @@ -0,0 +1,5 @@ +#include + +int main(int argc, char** argv) { + return 0; +} diff --git a/CRC16.h b/include/m17cxx/CRC16.h similarity index 100% rename from CRC16.h rename to include/m17cxx/CRC16.h diff --git a/CarrierDetect.h b/include/m17cxx/CarrierDetect.h similarity index 100% rename from CarrierDetect.h rename to include/m17cxx/CarrierDetect.h diff --git a/Convolution.h b/include/m17cxx/Convolution.h similarity index 100% rename from Convolution.h rename to include/m17cxx/Convolution.h diff --git a/DeviationError.h b/include/m17cxx/DeviationError.h similarity index 100% rename from DeviationError.h rename to include/m17cxx/DeviationError.h diff --git a/Filter.h b/include/m17cxx/Filter.h similarity index 100% rename from Filter.h rename to include/m17cxx/Filter.h diff --git a/FirFilter.h b/include/m17cxx/FirFilter.h similarity index 100% rename from FirFilter.h rename to include/m17cxx/FirFilter.h diff --git a/FrequencyError.h b/include/m17cxx/FrequencyError.h similarity index 100% rename from FrequencyError.h rename to include/m17cxx/FrequencyError.h diff --git a/Fsk4Demod.h b/include/m17cxx/Fsk4Demod.h similarity index 100% rename from Fsk4Demod.h rename to include/m17cxx/Fsk4Demod.h diff --git a/Golay24.h b/include/m17cxx/Golay24.h similarity index 100% rename from Golay24.h rename to include/m17cxx/Golay24.h diff --git a/IirFilter.h b/include/m17cxx/IirFilter.h similarity index 100% rename from IirFilter.h rename to include/m17cxx/IirFilter.h diff --git a/LinkSetupFrame.h b/include/m17cxx/LinkSetupFrame.h similarity index 100% rename from LinkSetupFrame.h rename to include/m17cxx/LinkSetupFrame.h diff --git a/M17FrameDecoder.h b/include/m17cxx/M17FrameDecoder.h similarity index 100% rename from M17FrameDecoder.h rename to include/m17cxx/M17FrameDecoder.h diff --git a/M17Framer.h b/include/m17cxx/M17Framer.h similarity index 100% rename from M17Framer.h rename to include/m17cxx/M17Framer.h diff --git a/M17Modulator.h b/include/m17cxx/M17Modulator.h similarity index 100% rename from M17Modulator.h rename to include/m17cxx/M17Modulator.h diff --git a/M17Randomizer.h b/include/m17cxx/M17Randomizer.h similarity index 100% rename from M17Randomizer.h rename to include/m17cxx/M17Randomizer.h diff --git a/M17Synchronizer.h b/include/m17cxx/M17Synchronizer.h similarity index 100% rename from M17Synchronizer.h rename to include/m17cxx/M17Synchronizer.h diff --git a/PhaseEstimator.h b/include/m17cxx/PhaseEstimator.h similarity index 100% rename from PhaseEstimator.h rename to include/m17cxx/PhaseEstimator.h diff --git a/PolynomialInterleaver.h b/include/m17cxx/PolynomialInterleaver.h similarity index 100% rename from PolynomialInterleaver.h rename to include/m17cxx/PolynomialInterleaver.h diff --git a/SymbolEvm.h b/include/m17cxx/SymbolEvm.h similarity index 100% rename from SymbolEvm.h rename to include/m17cxx/SymbolEvm.h diff --git a/Trellis.h b/include/m17cxx/Trellis.h similarity index 100% rename from Trellis.h rename to include/m17cxx/Trellis.h diff --git a/Util.h b/include/m17cxx/Util.h similarity index 100% rename from Util.h rename to include/m17cxx/Util.h diff --git a/Viterbi.h b/include/m17cxx/Viterbi.h similarity index 100% rename from Viterbi.h rename to include/m17cxx/Viterbi.h diff --git a/queue.h b/include/m17cxx/queue.h similarity index 100% rename from queue.h rename to include/m17cxx/queue.h diff --git a/ESG-upload.py b/scripts/ESG-upload.py similarity index 100% rename from ESG-upload.py rename to scripts/ESG-upload.py diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..c402b40 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,24 @@ +add_library(m17cxx INTERFACE) + +target_include_directories(m17cxx INTERFACE + $ + $ + ) + +target_compile_features(m17cxx INTERFACE cxx_std_17) + +source_group( + TREE "${PROJECT_SOURCE_DIR}/include" + PREFIX "Header Files" + FILES ${HEADER_LIST}) + +install(TARGETS m17cxx + EXPORT m17cxxTargets + LIBRARY DESTINATION lib COMPONENT Runtime + ARCHIVE DESTINATION lib COMPONENT Development + RUNTIME DESTINATION bin COMPONENT Runtime + PUBLIC_HEADER DESTINATION include COMPONENT Development + BUNDLE DESTINATION bin COMPONENT Runtime + INCLUDES DESTINATION include + ) + diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e162afa..3bfb700 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,45 +7,45 @@ include_directories ( ) add_executable (ConvolutionTest ConvolutionTest.cpp) -target_link_libraries(ConvolutionTest gtest pthread) +target_link_libraries(ConvolutionTest m17cxx gtest pthread) gtest_add_tests(ConvolutionTest "" AUTO) add_executable (M17FramerTest M17FramerTest.cpp) -target_link_libraries(M17FramerTest gtest pthread) +target_link_libraries(M17FramerTest m17cxx gtest pthread) gtest_add_tests(M17FramerTest "" AUTO) add_executable (TrellisTest TrellisTest.cpp) -target_link_libraries(TrellisTest gtest pthread) +target_link_libraries(TrellisTest m17cxx gtest pthread) gtest_add_tests(TrellisTest "" AUTO) add_executable (ViterbiTest ViterbiTest.cpp) -target_link_libraries(ViterbiTest gtest pthread) +target_link_libraries(ViterbiTest m17cxx gtest pthread) gtest_add_tests(ViterbiTest "" AUTO) add_executable (Golay24Test Golay24Test.cpp) -target_link_libraries(Golay24Test gtest pthread) +target_link_libraries(Golay24Test m17cxx gtest pthread) gtest_add_tests(Golay24Test "" AUTO) add_executable (CRC16Test CRC16Test.cpp) -target_link_libraries(CRC16Test gtest pthread) +target_link_libraries(CRC16Test m17cxx gtest pthread) gtest_add_tests(CRC16Test "" AUTO) add_executable (M17RandomizerTest M17RandomizerTest.cpp) -target_link_libraries(M17RandomizerTest gtest pthread) +target_link_libraries(M17RandomizerTest m17cxx gtest pthread) gtest_add_tests(M17RandomizerTest "" AUTO) add_executable (PolynomialInterleaverTest PolynomialInterleaverTest.cpp) -target_link_libraries(PolynomialInterleaverTest gtest pthread) +target_link_libraries(PolynomialInterleaverTest m17cxx gtest pthread) gtest_add_tests(PolynomialInterleaverTest "" AUTO) add_executable (M17ModulatorTest M17ModulatorTest.cpp) -target_link_libraries(M17ModulatorTest gtest pthread codec2) +target_link_libraries(M17ModulatorTest m17cxx gtest pthread codec2) gtest_add_tests(M17ModulatorTest "" AUTO) add_executable (UtilTest UtilTest.cpp) -target_link_libraries(UtilTest gtest pthread) +target_link_libraries(UtilTest m17cxx gtest pthread) gtest_add_tests(UtilTest "" AUTO) add_executable (LinkSetupFrameTest LinkSetupFrameTest.cpp) -target_link_libraries(LinkSetupFrameTest gtest pthread) +target_link_libraries(LinkSetupFrameTest m17cxx gtest pthread) gtest_add_tests(LinkSetupFrameTest "" AUTO)