From 2965550b59758d1ed2eba1299913681399c6864e Mon Sep 17 00:00:00 2001 From: Lukas Woodtli Date: Mon, 9 Sep 2024 11:42:47 +0200 Subject: [PATCH 1/3] cmake: Use server mode as default Server mode is enabled, if no mode (client, server or bootstrap-server) is selected. A warning is submitted to inform the user of Wakaama about the default. This simplifies testing and CI. --- tools/ci/run_ci.sh | 2 +- wakaama.cmake | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/ci/run_ci.sh b/tools/ci/run_ci.sh index e0c8604e..5f82078d 100755 --- a/tools/ci/run_ci.sh +++ b/tools/ci/run_ci.sh @@ -151,7 +151,7 @@ function run_build() { echo "Default build" ${OPT_WRAPPER_CMD} cmake -GNinja -S ${OPT_SOURCE_DIRECTORY} -B build-wakaama \ - -DWAKAAMA_MODE_SERVER=ON -DWAKAAMA_PLATFORM=POSIX ${CMAKE_ARGS} + -DWAKAAMA_PLATFORM=POSIX ${CMAKE_ARGS} ${OPT_WRAPPER_CMD} cmake --build build-wakaama # CMake presets diff --git a/wakaama.cmake b/wakaama.cmake index d9b81710..ddc9e649 100644 --- a/wakaama.cmake +++ b/wakaama.cmake @@ -9,6 +9,14 @@ option(WAKAAMA_MODE_SERVER "Enable LWM2M Server interfaces" OFF) option(WAKAAMA_MODE_BOOTSTRAP_SERVER "Enable LWM2M Bootstrap Server interfaces" OFF) option(WAKAAMA_MODE_CLIENT "Enable LWM2M Client interfaces" OFF) +if(NOT WAKAAMA_MODE_SERVER + AND NOT WAKAAMA_MODE_BOOTSTRAP_SERVER + AND NOT WAKAAMA_MODE_CLIENT +) + message(WARNING "No mode selected. Defaulting to 'WAKAAMA_MODE_SERVER'") + set(WAKAAMA_MODE_SERVER ON) +endif() + # Client option(WAKAAMA_CLIENT_INITIATED_BOOTSTRAP "Enable client initiated bootstrap support in a client" OFF) option(WAKAAMA_CLIENT_LWM2M_V_1_0 "Restrict the client code to use LwM2M version 1.0" OFF) From df2554edee27f2126b9f90ec380c938434ae7add Mon Sep 17 00:00:00 2001 From: Lukas Woodtli Date: Wed, 4 Sep 2024 17:02:27 +0200 Subject: [PATCH 2/3] ci: Allow to build in different directory The CI build script now supports a flag to provide a custom build directory. --- .github/workflows/build.yaml | 3 ++- tools/ci/run_ci.sh | 31 ++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index fd004537..73be346f 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -57,4 +57,5 @@ jobs: tools/ci/run_ci.sh \ --run-clean \ --run-build \ - --source-directory examples/${{ matrix.example }} + --source-directory examples/${{ matrix.example }} \ + --build-directory wakaama-build-${{ matrix.example }} diff --git a/tools/ci/run_ci.sh b/tools/ci/run_ci.sh index 5f82078d..bb0d6fcd 100755 --- a/tools/ci/run_ci.sh +++ b/tools/ci/run_ci.sh @@ -29,6 +29,7 @@ OPT_SANITIZER="" OPT_SCAN_BUILD="" OPT_SONARQUBE="" OPT_SOURCE_DIRECTORY="${REPO_ROOT_DIR}" +OPT_BUILD_DIRECTORY="build-wakaama" OPT_TEST_COVERAGE_REPORT="" OPT_VERBOSE=0 OPT_WRAPPER_CMD="" @@ -58,6 +59,9 @@ Options: (BINARY: defaults to ${OPT_CLANG_FORMAT}) --source-directory PATH Configure CMake using PATH instead of the repositories root directory. + --build-directory PATH Configure CMake using PATH as the build directory. + Defaults to 'build-wakaama'. Builds from CMake + presets are placed into 'build-presets' by default. --sanitizer TYPE Enable sanitizer (TYPE: address leak thread undefined) --scan-build BINARY Enable Clang code analyzer using specified @@ -112,7 +116,7 @@ function run_clang_format() { } function run_clean() { - rm -rf build-wakaama + rm -rf "${OPT_BUILD_DIRECTORY}" rm -rf build-presets } @@ -147,12 +151,12 @@ function run_git_blame_ignore() { function run_build() { # Existing directory needed by SonarQube build-wrapper - mkdir -p build-wakaama + mkdir -p "${OPT_BUILD_DIRECTORY}" echo "Default build" - ${OPT_WRAPPER_CMD} cmake -GNinja -S ${OPT_SOURCE_DIRECTORY} -B build-wakaama \ + ${OPT_WRAPPER_CMD} cmake -GNinja -S ${OPT_SOURCE_DIRECTORY} -B "${OPT_BUILD_DIRECTORY}" \ -DWAKAAMA_PLATFORM=POSIX ${CMAKE_ARGS} - ${OPT_WRAPPER_CMD} cmake --build build-wakaama + ${OPT_WRAPPER_CMD} cmake --build "${OPT_BUILD_DIRECTORY}" # CMake presets echo "CMake presets build" @@ -167,7 +171,7 @@ function run_tests() { export CTEST_OUTPUT_ON_FAILURE=ON echo "Default test run" - cmake --build build-wakaama --target test + cmake --build "${OPT_BUILD_DIRECTORY}" --target test echo "CMake presets test run" for i in $(cmake --list-presets build | awk '/"/{ print $1 }' | tr -d '"');do @@ -175,7 +179,7 @@ function run_tests() { cmake --build --preset "$i" --target test done - mkdir -p "${REPO_ROOT_DIR}/build-wakaama/coverage" + mkdir -p "${REPO_ROOT_DIR}/${OPT_BUILD_DIRECTORY}/coverage" if [ -z "${OPT_TEST_COVERAGE_REPORT}" ]; then return 0 @@ -189,15 +193,15 @@ function run_tests() { case "${OPT_TEST_COVERAGE_REPORT}" in xml) gcovr_out="--xml" - gcovr_file=("${REPO_ROOT_DIR}/build-wakaama/coverage/report.xml") + gcovr_file=("${REPO_ROOT_DIR}/${OPT_BUILD_DIRECTORY}/coverage/report.xml") ;; html) gcovr_out="--html --html-details" - gcovr_file=("${REPO_ROOT_DIR}/build-wakaama/coverage/report.html") + gcovr_file=("${REPO_ROOT_DIR}/${OPT_BUILD_DIRECTORY}/coverage/report.html") ;; text) gcovr_out="" - gcovr_file=("${REPO_ROOT_DIR}/build-wakaama/coverage/report.txt") + gcovr_file=("${REPO_ROOT_DIR}/${OPT_BUILD_DIRECTORY}/coverage/report.txt") ;; none) gcovr "${gcovr_opts[@]}" >/dev/null @@ -251,6 +255,7 @@ if ! PARSED_OPTS=$($getopt -o vah \ -l scan-build: \ -l sonarqube: \ -l source-directory: \ + -l build-directory: \ -l test-coverage: \ -l verbose \ --name "${SCRIPT_NAME}" -- "$@"); @@ -330,6 +335,10 @@ while true; do OPT_SOURCE_DIRECTORY=$2 shift 2 ;; + --build-directory) + OPT_BUILD_DIRECTORY=$2 + shift 2 + ;; --test-coverage) OPT_TEST_COVERAGE_REPORT=$2 shift 2 @@ -391,7 +400,7 @@ fi if [ -n "${OPT_SONARQUBE}" ]; then OPT_TEST_COVERAGE_REPORT="${OPT_TEST_COVERAGE_REPORT:-none}" OPT_WRAPPER_CMD="${OPT_SONARQUBE} \ - --out-dir build-wakaama/sonar-cloud-build-wrapper-output" + --out-dir ${OPT_BUILD_DIRECTORY}/sonar-cloud-build-wrapper-output" fi if [ -n "${OPT_TEST_COVERAGE_REPORT}" ]; then @@ -403,7 +412,7 @@ if [ -n "${OPT_SCAN_BUILD}" ]; then # `CUnit` which leads to a lot of noisy issues in the report. # Also ignoring third-party `tinydtls` library. OPT_WRAPPER_CMD="${OPT_SCAN_BUILD} \ - -o build-wakaama/clang-static-analyzer \ + -o ${OPT_BUILD_DIRECTORY}/clang-static-analyzer \ --exclude tests \ --exclude examples/shared/tinydtls" fi From 33e5b13ea7e096b10419a3eb3dd5cbdce3452883 Mon Sep 17 00:00:00 2001 From: Lukas Woodtli Date: Wed, 28 Aug 2024 16:22:09 +0200 Subject: [PATCH 3/3] cmake: Add Wakaama static library The static library can be configured with CMake variables and then be linked to user applications. Wakaama became difficult to build and to maintain. Among other things, there are defines and compiler flags that have to be set, the right set of source files need to be selected and the correct include directories have to be provided. Therefore we rely on CMake and provide the users of Wakaama a static library, which is relatively simple to build with a given set of requested features. This also helps with modularizing Wakaama to improve maintainability. --- wakaama.cmake | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/wakaama.cmake b/wakaama.cmake index ddc9e649..365c1398 100644 --- a/wakaama.cmake +++ b/wakaama.cmake @@ -323,6 +323,28 @@ function(target_sources_shared target) target_include_directories(${target} PUBLIC ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}) endfunction() +# Static library that users of Wakaama can link against +# +# This library simplifies building and maintaining Wakaama. It handles defines and compiler flags, adding the right +# source files and setting include directories... +add_library(wakaama_static STATIC) +target_sources_wakaama(wakaama_static) +target_include_directories(wakaama_static PUBLIC ${WAKAAMA_TOP_LEVEL_DIRECTORY}/include/) + +if(WAKAAMA_TRANSPORT STREQUAL POSIX_UDP) + target_link_libraries(wakaama_static PUBLIC wakaama_transport_posix_udp) +elseif(WAKAAMA_TRANSPORT STREQUAL TINYDTLS) + target_link_libraries(wakaama_static PUBLIC wakaama_transport_tinydtls) +endif() + +if(WAKAAMA_PLATFORM STREQUAL POSIX) + target_link_libraries(wakaama_static PUBLIC wakaama_platform_posix) +endif() + +if(WAKAAMA_CLI) + target_link_libraries(wakaama_static PUBLIC wakaama_command_line) +endif() + # Enforce a certain level of hygiene add_compile_options( -Waggregate-return