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 e0c8604e..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 \ - -DWAKAAMA_MODE_SERVER=ON -DWAKAAMA_PLATFORM=POSIX ${CMAKE_ARGS} - ${OPT_WRAPPER_CMD} cmake --build 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 "${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 diff --git a/wakaama.cmake b/wakaama.cmake index d9b81710..365c1398 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) @@ -315,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