diff --git a/.gitignore b/.gitignore index d70dbe4..63f2da4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,20 @@ -build +# Generated directories +/build +/bin +/lib +/release + +# CMake +/CMakeFiles +/CMakeCache.txt +/CTestTestfile.cmake +/cmake_install.cmake +/Makefile +/Testing +/CPackConfig.cmake +/CPackSourceConfig.cmake +/install_manifest.txt +/_CPack_Packages + *~ -.vscode \ No newline at end of file +.vscode diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c1f75c6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,151 @@ +cmake_minimum_required(VERSION 3.20) + +project(open1722 VERSION 0.1) + +set(CMAKE_C_STANDARD 99) +set(CMAKE_C_STANDARD_REQUIRED TRUE) + +set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin") +set(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib") + +#### Libraries ################################################################ + +# PDU parsing library +add_library(open1722pdu SHARED + "src/avtp/CommonHeader.c" + "src/avtp/Crf.c" + "src/avtp/Rvf.c" + "src/avtp/Udp.c" + "src/avtp/Utils.c" + "src/avtp/aaf/CommonStream.c" + "src/avtp/aaf/PcmStream.c" + "src/avtp/acf/Can.c" + "src/avtp/acf/CanBrief.c" + "src/avtp/acf/Common.c" + "src/avtp/acf/Ntscf.c" + "src/avtp/acf/Sensor.c" + "src/avtp/acf/SensorBrief.c" + "src/avtp/acf/Tscf.c" + "src/avtp/cvf/Cvf.c" + "src/avtp/cvf/H264.c" + "src/avtp/cvf/Jpeg2000.c" + "src/avtp/cvf/Mjpeg.c") +target_include_directories(open1722pdu PRIVATE "${PROJECT_BINARY_DIR}/include") + +# link_directories(lib) + +#### Examples ################################################################# + +# Common library accross all examples +add_library(open1722examples STATIC "examples/common/common.c") +target_include_directories(open1722examples PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") + +# AAF listener app +add_executable(aaf-listener "examples/aaf/aaf-listener.c") +target_include_directories(aaf-listener PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(aaf-listener open1722pdu open1722examples) + +# AAF talker app +add_executable(aaf-talker "examples/aaf/aaf-talker.c") +target_include_directories(aaf-talker PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(aaf-talker open1722pdu open1722examples) + +# CAN talker app +add_executable(acf-can-talker "examples/acf-can/acf-can-talker.c") +target_include_directories(acf-can-talker PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(acf-can-talker open1722pdu open1722examples) + +# CAN listener app +add_executable(acf-can-listener "examples/acf-can/acf-can-listener.c") +target_include_directories(acf-can-listener PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(acf-can-listener open1722pdu open1722examples) + +# CRF talker app +add_executable(crf-talker "examples/crf/crf-talker.c") +target_include_directories(crf-talker PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(crf-talker open1722pdu open1722examples m) + +# CRF listener app +add_executable(crf-listener "examples/crf/crf-listener.c") +target_include_directories(crf-listener PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(crf-listener open1722pdu open1722examples m) + +# CVF talker app +add_executable(cvf-talker "examples/cvf/cvf-talker.c") +target_include_directories(cvf-talker PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(cvf-talker open1722pdu open1722examples) + +# CVF listener app +add_executable(cvf-listener "examples/cvf/cvf-listener.c") +target_include_directories(cvf-listener PRIVATE + "${PROJECT_BINARY_DIR}/examples" + "${PROJECT_BINARY_DIR}/include") +target_link_libraries(cvf-listener open1722pdu open1722examples) + +#### Tests #################################################################### + +enable_testing() + +# find_package(cmocka 1.1.0 REQUIRED) + +list(APPEND TEST_TARGETS test-aaf) +list(APPEND TEST_TARGETS test-avtp) +list(APPEND TEST_TARGETS test-can) +list(APPEND TEST_TARGETS test-crf) +list(APPEND TEST_TARGETS test-cvf) +list(APPEND TEST_TARGETS test-rvf) +# list(APPEND TEST_TARGETS test-stream) + +foreach(TEST_TARGET IN LISTS TEST_TARGETS) + add_executable(${TEST_TARGET} "unit/${TEST_TARGET}.c") + target_include_directories(${TEST_TARGET} PRIVATE "${PROJECT_BINARY_DIR}/include") + target_link_libraries(${TEST_TARGET} open1722pdu cmocka m) + add_test(NAME ${TEST_TARGET} COMMAND "${PROJECT_BINARY_DIR}/bin/${TEST_TARGET}") +endforeach() + +#### Install ################################################################## + +install(TARGETS open1722pdu DESTINATION lib) +install(TARGETS + aaf-listener + aaf-talker + acf-can-listener + acf-can-talker + crf-listener + crf-talker + cvf-listener + cvf-talker + DESTINATION bin) +install(DIRECTORY include/ DESTINATION include) + +#### Packaging ################################################################ + +include(InstallRequiredSystemLibraries) +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") +set(CPACK_PACKAGE_VERSION_MAJOR "${open1722_VERSION_MAJOR}") +set(CPACK_PACKAGE_VERSION_MINOR "${open1722_VERSION_MINOR}") +set(CPACK_PACKAGE_DIRECTORY "${PROJECT_BINARY_DIR}/release") +set(CPACK_GENERATOR "TGZ" "DEB") +set(CPACK_SOURCE_GENERATOR "TGZ" "DEB") + +# Debian package +set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Adriaan Niess [Robert Bosch GmbH]") + +include(CPack) diff --git a/README.md b/README.md index b089d9a..1d3f133 100644 --- a/README.md +++ b/README.md @@ -26,35 +26,26 @@ This repository is organized as follows: - The `examples/` folder contains various applications that use our Open1722 library. The applications are targeted to Linux platforms. Before building Open1722 make sure you have installed the following software : -* Meson >= 0.56 -* Ninja >= 1.10.1 +* CMake >= 3.20 +* CMocka >= 1.1.0 Alternatively, you can use VS Code to run the provided dev container which takes care of the dependencies. -The first step to build Open1722 is to generate the build system files. +The first step to build Open1722 is to generate the Makefile and build the project. ``` -$ meson build -``` - -Then build Open1722 by running the following command. The building artifacts will be created under the build/ in the top-level directory. -``` -$ meson compile -C build +$ cd Open1722 +$ cmake . +$ make ``` The build can be cleaned using the following command: ``` -$ meson --wipe build +$ make clean ``` To install Open1722 on your system run: ``` -$ cd build -$ sudo meson install -``` - -To build all the AVTP targets from the repository, we have a script: -``` -$ ./build_all.sh +$ sudo make install ``` ## AVTP Formats Support @@ -77,10 +68,7 @@ The following is the list of the formats currently supported by Open1722: The `examples/` directory provides sample applications which demonstrate the Open1722 functionalities. Each example directory contains a README file that includes specific details on its functionality, configuration, and dependencies. -To build an example application run `$ meson compile -C build `. On a successful build, the executables are available in the `build/`. - -E.g. to build and execute the IEEE 1722 CAN Talker application: +To execute the IEEE 1722 CAN Talker application: ``` -$ meson compile -C build ./examples/acf-can/acf-can-talker -$ ./build/examples/acf-can/acf-can-talker +$ ./bin/acf-can-talker ``` diff --git a/build_all.sh b/build_all.sh index 1ce41e1..e65bf96 100755 --- a/build_all.sh +++ b/build_all.sh @@ -1,14 +1,4 @@ #!/bin/bash set -ev -mkdir -p build -meson . build -Db_coverage=true -meson compile -C build/ \ - examples/aaf/aaf-listener \ - examples/aaf/aaf-talker \ - examples/acf-can/acf-can-listener \ - examples/acf-can/acf-can-talker \ - examples/crf/crf-talker \ - examples/crf/crf-listener \ - examples/cvf/cvf-talker \ - examples/cvf/cvf-listener \ No newline at end of file +cmake . && make diff --git a/examples/aaf/aaf-listener.c b/examples/aaf/aaf-listener.c index 74b7355..a2a7e5e 100644 --- a/examples/aaf/aaf-listener.c +++ b/examples/aaf/aaf-listener.c @@ -70,7 +70,7 @@ #include #include "avtp/aaf/PcmStream.h" -#include "common.h" +#include "common/common.h" #include "avtp/CommonHeader.h" #define STREAM_ID 0xAABBCCDDEEFF0001 diff --git a/examples/aaf/aaf-talker.c b/examples/aaf/aaf-talker.c index 19ee08f..bbc2290 100644 --- a/examples/aaf/aaf-talker.c +++ b/examples/aaf/aaf-talker.c @@ -65,7 +65,7 @@ #include #include "avtp/aaf/PcmStream.h" -#include "common.h" +#include "common/common.h" #include "avtp/CommonHeader.h" #define STREAM_ID 0xAABBCCDDEEFF0001 diff --git a/examples/aaf/meson.build b/examples/aaf/meson.build deleted file mode 100644 index 94b1ea8..0000000 --- a/examples/aaf/meson.build +++ /dev/null @@ -1,15 +0,0 @@ -executable( - 'aaf-talker', - 'aaf-talker.c', - - dependencies: [avtp_dep, avtp_utils_dep], - build_by_default: false, -) - -executable( - 'aaf-listener', - 'aaf-listener.c', - - dependencies: [avtp_dep, avtp_utils_dep], - build_by_default: false, -) \ No newline at end of file diff --git a/examples/acf-can/acf-can-listener.c b/examples/acf-can/acf-can-listener.c index 25c8626..1e4503c 100644 --- a/examples/acf-can/acf-can-listener.c +++ b/examples/acf-can/acf-can-listener.c @@ -41,7 +41,7 @@ #include #include -#include "common.h" +#include "common/common.h" #include "avtp/Udp.h" #include "avtp/acf/Ntscf.h" #include "avtp/acf/Tscf.h" diff --git a/examples/acf-can/acf-can-talker.c b/examples/acf-can/acf-can-talker.c index bdb285b..396d4df 100644 --- a/examples/acf-can/acf-can-talker.c +++ b/examples/acf-can/acf-can-talker.c @@ -43,7 +43,7 @@ #include #include -#include "common.h" +#include "common/common.h" #include "avtp/Udp.h" #include "avtp/acf/Ntscf.h" #include "avtp/acf/Tscf.h" diff --git a/examples/acf-can/meson.build b/examples/acf-can/meson.build deleted file mode 100644 index faa1f1a..0000000 --- a/examples/acf-can/meson.build +++ /dev/null @@ -1,15 +0,0 @@ -executable( - 'acf-can-talker', - 'acf-can-talker.c', - - dependencies: [avtp_dep, avtp_utils_dep], - build_by_default: false, -) - -executable( - 'acf-can-listener', - 'acf-can-listener.c', - - dependencies: [avtp_dep, avtp_utils_dep], - build_by_default: false, -) \ No newline at end of file diff --git a/examples/common.c b/examples/common/common.c similarity index 99% rename from examples/common.c rename to examples/common/common.c index 4f68069..69896db 100644 --- a/examples/common.c +++ b/examples/common/common.c @@ -41,7 +41,7 @@ #include #include -#include "common.h" +#include "common/common.h" #define NSEC_PER_SEC 1000000000ULL #define NSEC_PER_MSEC 1000000ULL diff --git a/examples/common.h b/examples/common/common.h similarity index 100% rename from examples/common.h rename to examples/common/common.h diff --git a/examples/crf/crf-listener.c b/examples/crf/crf-listener.c index 951bfe9..a590e46 100644 --- a/examples/crf/crf-listener.c +++ b/examples/crf/crf-listener.c @@ -101,7 +101,7 @@ #include "avtp/Crf.h" #include "avtp/aaf/PcmStream.h" -#include "common.h" +#include "common/common.h" #include "avtp/CommonHeader.h" #define AAF_STREAM_ID 0xAABBCCDDEEFF0001 diff --git a/examples/crf/crf-talker.c b/examples/crf/crf-talker.c index 75ee047..50d7ab3 100644 --- a/examples/crf/crf-talker.c +++ b/examples/crf/crf-talker.c @@ -63,7 +63,7 @@ #include #include "avtp/Crf.h" -#include "common.h" +#include "common/common.h" #include "avtp/CommonHeader.h" #define STREAM_ID 0xAABBCCDDEEFF0002 diff --git a/examples/crf/meson.build b/examples/crf/meson.build deleted file mode 100644 index eb22e13..0000000 --- a/examples/crf/meson.build +++ /dev/null @@ -1,18 +0,0 @@ -cc = meson.get_compiler('c') -mdep = cc.find_library('m', required : false) - -executable( - 'crf-talker', - 'crf-talker.c', - - dependencies: [avtp_dep, avtp_utils_dep, mdep], - build_by_default: false, -) - -executable( - 'crf-listener', - 'crf-listener.c', - - dependencies: [avtp_dep, avtp_utils_dep, mdep], - build_by_default: false, -) diff --git a/examples/cvf/cvf-listener.c b/examples/cvf/cvf-listener.c index f7cbba8..263c148 100644 --- a/examples/cvf/cvf-listener.c +++ b/examples/cvf/cvf-listener.c @@ -75,7 +75,7 @@ #include "avtp/cvf/Cvf.h" #include "avtp/cvf/H264.h" #include "avtp/CommonHeader.h" -#include "common.h" +#include "common/common.h" #define STREAM_ID 0xAABBCCDDEEFF0001 #define DATA_LEN 1400 diff --git a/examples/cvf/cvf-talker.c b/examples/cvf/cvf-talker.c index 3e4e4c2..180d38a 100644 --- a/examples/cvf/cvf-talker.c +++ b/examples/cvf/cvf-talker.c @@ -77,7 +77,7 @@ #include "avtp/cvf/Cvf.h" #include "avtp/cvf/H264.h" -#include "common.h" +#include "common/common.h" #include "avtp/CommonHeader.h" #define STREAM_ID 0xAABBCCDDEEFF0001 diff --git a/examples/cvf/meson.build b/examples/cvf/meson.build deleted file mode 100644 index a0f4846..0000000 --- a/examples/cvf/meson.build +++ /dev/null @@ -1,15 +0,0 @@ -executable( - 'cvf-talker', - 'cvf-talker.c', - - dependencies: [avtp_dep, avtp_utils_dep], - build_by_default: false, -) - -executable( - 'cvf-listener', - 'cvf-listener.c', - - dependencies: [avtp_dep, avtp_utils_dep], - build_by_default: false, -) \ No newline at end of file diff --git a/examples/meson.build b/examples/meson.build deleted file mode 100644 index ac9aaa2..0000000 --- a/examples/meson.build +++ /dev/null @@ -1,15 +0,0 @@ -avtp_utils_lib = library( - 'avtp_utils', - ['common.c'], - include_directories: include_directories('.'), -) - -avtp_utils_dep = declare_dependency( - link_with: avtp_utils_lib, - include_directories: include_directories('.'), -) - -subdir('aaf') -subdir('acf-can') -subdir('crf') -subdir('cvf') diff --git a/meson.build b/meson.build deleted file mode 100644 index 9bb2350..0000000 --- a/meson.build +++ /dev/null @@ -1,154 +0,0 @@ -project( - 'Open1722', - 'c', - version: '0.1.0', - license: 'BSD-3-Clause', - meson_version: '>=0.56.0', -) - -avtp_lib = library( - 'open1722', - [ - 'src/avtp/Utils.c', - 'src/avtp/acf/Ntscf.c', - 'src/avtp/acf/Tscf.c', - 'src/avtp/CommonHeader.c', - 'src/avtp/acf/Common.c', - 'src/avtp/acf/Can.c', - 'src/avtp/acf/CanBrief.c', - 'src/avtp/acf/Sensor.c', - 'src/avtp/acf/SensorBrief.c', - 'src/avtp/aaf/PcmStream.c', - 'src/avtp/aaf/CommonStream.c', - 'src/avtp/Udp.c', - 'src/avtp/Rvf.c', - 'src/avtp/Crf.c', - 'src/avtp/cvf/Cvf.c', - 'src/avtp/cvf/H264.c', - 'src/avtp/cvf/Jpeg2000.c', - 'src/avtp/cvf/Mjpeg.c', - ], - version: meson.project_version(), - include_directories: include_directories('include'), - install: true, -) - -avtp_dep = declare_dependency( - link_with: avtp_lib, - include_directories: include_directories('include'), -) - -install_headers( - 'include/avtp/Byteorder.h', - 'include/avtp/Defines.h', - 'include/avtp/CommonHeader.h', - 'include/avtp/Udp.h', - 'include/avtp/Utils.h', - 'include/avtp/Rvf.h', - 'include/avtp/Crf.h', - subdir : 'avtp' -) - -install_headers( - 'include/avtp/acf/CanBrief.h', - 'include/avtp/acf/Can.h', - 'include/avtp/acf/Common.h', - 'include/avtp/acf/Ntscf.h', - 'include/avtp/acf/SensorBrief.h', - 'include/avtp/acf/Sensor.h', - 'include/avtp/acf/Tscf.h', - subdir : 'avtp/acf' -) - -install_headers( - 'include/avtp/aaf/PcmStream.h', - 'include/avtp/aaf/CommonStream.h', - subdir : 'avtp/aaf' -) - -install_headers( - 'src/avtp/cvf/Cvf.c', - 'src/avtp/cvf/H264.c', - 'src/avtp/cvf/Jpeg2000.c', - 'src/avtp/cvf/Mjpeg.c', - subdir : 'avtp/cvf' -) - -pkg = import('pkgconfig') -pkg.generate(avtp_lib, - description: 'AVTP packetization library', - url: 'github.com/COVESA/Open1722', -) - -if get_option('tests') == 'disabled' - cmocka = disabler() -else - cmocka = dependency('cmocka', required: get_option('tests') == 'enabled') -endif - -if cmocka.found() - test_avtp = executable( - 'test-avtp', - 'unit/test-avtp.c', - include_directories: include_directories('include'), - link_with: avtp_lib, - dependencies: cmocka, - build_by_default: false, - ) - - test_can = executable( - 'test-can', - 'unit/test-can.c', - include_directories: include_directories('include'), - link_with: avtp_lib, - link_args : '-lm', - dependencies: cmocka, - build_by_default: false, - ) - - test_aaf = executable( - 'test-aaf', - 'unit/test-aaf.c', - include_directories: include_directories('include'), - link_with: avtp_lib, - dependencies: cmocka, - build_by_default: false, - ) - - test_crf = executable( - 'test-crf', - 'unit/test-crf.c', - include_directories: include_directories('include'), - link_with: avtp_lib, - dependencies: cmocka, - build_by_default: false, - ) - - test_cvf = executable( - 'test-cvf', - 'unit/test-cvf.c', - include_directories: include_directories('include'), - link_with: avtp_lib, - dependencies: cmocka, - build_by_default: false, - ) - - test_rvf = executable( - 'test-rvf', - 'unit/test-rvf.c', - include_directories: include_directories('include'), - link_with: avtp_lib, - dependencies: cmocka, - build_by_default: false, - ) - - - test('AVTP API', test_avtp) - test('AAF API', test_aaf) - test('CRF API', test_crf) - test('CVF API', test_cvf) - test('RVF API', test_rvf) - test('ACF CAN API', test_can) -endif - -subdir('examples') \ No newline at end of file diff --git a/meson_options.txt b/meson_options.txt deleted file mode 100644 index 1db06b4..0000000 --- a/meson_options.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Port to 'feature' once we depend on meson 0.47.0 -option( - 'tests', - type : 'combo', - value : 'auto', - choices : ['enabled', 'disabled', 'auto'], - description : 'Build unit test libraries') diff --git a/test_all.sh b/test_all.sh index 2477e74..9a406a2 100755 --- a/test_all.sh +++ b/test_all.sh @@ -1,7 +1,6 @@ #!/bin/bash set -ev -./build_all.sh -cd ./build -meson test -ninja coverage-html \ No newline at end of file +./build_all.sh +make test +# ninja coverage-html