diff --git a/.cmake-format b/.cmake-format new file mode 100644 index 000000000..6429461e6 --- /dev/null +++ b/.cmake-format @@ -0,0 +1,17 @@ +with section("format"): + # Same as for our C code + line_width = 120 + tab_size = 4 + + # Smaller diffs + dangle_parens = True + + # Settling cross platform disputes + line_ending = 'unix' + + # Format keywords consistently + keyword_case = 'upper' + +with section("markup"): + # What character to use for bulleted lists + bullet_char = '-' diff --git a/.github/workflows/build_and_test.yaml b/.github/workflows/build_and_test.yaml index 5355fe648..f2bb63699 100644 --- a/.github/workflows/build_and_test.yaml +++ b/.github/workflows/build_and_test.yaml @@ -39,7 +39,7 @@ jobs: env: CC: ${{ matrix.compiler }} - - name: Build, execute sanititzed unit tests + - name: Build, execute sanitized unit tests run: | tools/ci/run_ci.sh --run-tests --sanitizer ${{ matrix.sanitizer }} env: diff --git a/.github/workflows/compliance.yaml b/.github/workflows/compliance.yaml index fb9717934..7d811aa90 100644 --- a/.github/workflows/compliance.yaml +++ b/.github/workflows/compliance.yaml @@ -3,8 +3,8 @@ name: Compliance on: pull_request jobs: - check-gitlint: - name: Run gitlint + lint-code: + name: Run compliance checks runs-on: ubuntu-20.04 steps: @@ -13,47 +13,25 @@ jobs: with: fetch-depth: 0 - - name: Install gitlint + - name: Install compliance tools run: | - pip3 install gitlint + sudo apt update + sudo apt -qy --no-install-recommends install clang-format-10 + pip3 install -r tools/requirements-compliance.txt - name: Check commits with gitlint run: | tools/ci/run_ci.sh --branch-target origin/${{ github.base_ref }} --run-gitlint - check-clang-format: - name: Run clang-format - runs-on: ubuntu-20.04 - - steps: - - name: Checkout code including full history - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Install clang-format - run: | - sudo apt update - sudo apt -qy --no-install-recommends install clang-format-10 - - - name: Check commits with clang-format + - name: Check C code (delta) with clang-format run: | tools/ci/run_ci.sh --branch-target origin/${{ github.base_ref }} --run-clang-format - check-pylint: - name: Run pylint - runs-on: ubuntu-20.04 - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Install pylint + - name: Check CMakeLists.txt files with cmake-lint run: | - pip3 install pylint -r tests/integration/requirements.txt + tools/ci/run_ci.sh --run-cmake-lint - - name: Check python code with pylint + - name: Check Python code with pylint run: | - python -c "import sys; print(sys.version)" cd tests pylint integration diff --git a/.github/workflows/multiarch.yaml b/.github/workflows/multiarch.yaml index 19ca3cfdc..fa622cc88 100644 --- a/.github/workflows/multiarch.yaml +++ b/.github/workflows/multiarch.yaml @@ -24,6 +24,15 @@ jobs: githubToken: ${{ github.token }} install: | apt update - apt -qy --no-install-recommends install libcunit1-dev ninja-build unzip wget build-essential cmake + apt -qy --no-install-recommends install \ + autoconf \ + build-essential \ + cmake \ + git \ + libcunit1-dev \ + ninja-build \ + unzip \ + wget \ + ; run: | tools/ci/run_ci.sh --run-build --run-tests diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d9a6b498..1c6d73702 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,10 @@ cmake_minimum_required(VERSION 3.13) project(wakaama C) +include(wakaama.cmake) + +add_subdirectory(examples) + # Enable "test" target enable_testing() add_subdirectory(tests) - -add_subdirectory(examples) diff --git a/README.md b/README.md index 7bffe7454..5074e1c71 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,21 @@ Developers mailing list: https://dev.eclipse.org/mailman/listinfo/wakaama-dev +- shared (utility functions for connection handling and command- line interface) +## Checking out the code + +### Using Wakaama as library + +``` +git clone https://github.com/eclipse/wakaama.git +``` + +### Working on Wakaama + +When working on Wakaama itself, or intending to run the example client application, submodules must be checked out: + +``` +git clone --recurse-submodules https://github.com/eclipse/wakaama.git +``` ## Compiling @@ -75,11 +90,12 @@ LWM2M_CLIENT_MODE and LWM2M_SERVER_MODE can be defined at the same time. - Git commit message linter: gitlint - Build system: ninja - C code formatting: clang-format, version 10 + - CMake list files formatting: cmake-format, version 0.6.13 - Unit testing: CUnit On Ubuntu 20.04, used in CI, the dependencies can be installed as such: - `apt install build-essential clang-format clang-format-10 clang-tools-10 cmake gcovr git libcunit1-dev ninja-build python3-pip` -- `pip3 install gitlint` +- `pip3 install -r tools/requirements-compliance.txt` ### Code formatting New code must be formatted with [clang-format](https://clang.llvm.org/docs/ClangFormat.html). @@ -136,18 +152,7 @@ Options: * ``make`` * ``./lwm2mclient [Options]`` -DTLS feature requires the tinydtls submodule. To include it, on the first run, -use the following commands to retrieve the sources: - * ``git submodule init`` - * ``git submodule update`` - -You need to install autoconf and automake to build with tinydtls. - -Build with tinydtls: - * Create a build directory and change to that. - * ``cmake -DDTLS=1 [wakaama directory]/examples/client`` - * ``make`` - * ``./lwm2mclient [Options]`` +Next to lwm2mclient a DTLS enabled variant named lwm2mclient_tinydtls gets built. The lwm2mclient features nine LWM2M objects: - Security Object (id: 0) @@ -172,7 +177,7 @@ The lwm2mclient features nine LWM2M objects: exec | 2 | E | No | Yes | | | dec | 3 | R/W | No | Yes | Float | | -The lwm2mclient opens udp port 56830 and tries to register to a LWM2M Server at +The lwm2mclient opens UDP port 56830 and tries to register to a LWM2M Server at 127.0.0.1:5683. It features a basic command line interface. Type 'help' for a list of supported commands. @@ -193,7 +198,7 @@ Options: ``` -If DTLS feature enable: +Additional values for the lwm2mclient_tinydtls binary: ``` -i Set the device management or bootstrap server PSK identity. If not set use none secure mode -s Set the device management or bootstrap server Pre-Shared-Key. If not set use none secure mode diff --git a/coap/coap.cmake b/coap/coap.cmake deleted file mode 100644 index b56778af8..000000000 --- a/coap/coap.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# Provides COAP_SOURCES_DIR and COAP_HEADERS_DIR variables. -# Add LWM2M_WITH_LOGS to compile definitions to enable logging. - -set(COAP_SOURCES_DIR ${CMAKE_CURRENT_LIST_DIR}) -set(COAP_HEADERS_DIR ${CMAKE_CURRENT_LIST_DIR}) - -set(COAP_SOURCES - ${COAP_SOURCES_DIR}/transaction.c - ${COAP_SOURCES_DIR}/block.c - ${COAP_SOURCES_DIR}/er-coap-13/er-coap-13.c -) diff --git a/core/observe.c b/core/observe.c index 8ac4a25b4..6051f1229 100644 --- a/core/observe.c +++ b/core/observe.c @@ -1256,7 +1256,7 @@ int prv_lwm2m_observe_cancel(lwm2m_context_t * contextP, observationP->status = STATE_DEREG_PENDING; - int ret = transaction_send(contextP, transactionP); + ret = transaction_send(contextP, transactionP); if (ret != 0) lwm2m_free(cancelP); return ret; } diff --git a/core/wakaama.cmake b/core/wakaama.cmake deleted file mode 100644 index 24efc8239..000000000 --- a/core/wakaama.cmake +++ /dev/null @@ -1,58 +0,0 @@ -# Provides WAKAAMA_SOURCES_DIR and WAKAAMA_SOURCES variables. -# Add LWM2M_WITH_LOGS to compile definitions to enable logging. -# Set LWM2M_LITTLE_ENDIAN to FALSE or TRUE according to your destination platform or leave -# it unset to determine endianess automatically. -# Set LWM2M_VERSION to use a particular LWM2M version or leave it unset to use the latest. - -set(WAKAAMA_SOURCES_DIR ${CMAKE_CURRENT_LIST_DIR}) -set(WAKAAMA_HEADERS_DIR ${CMAKE_CURRENT_LIST_DIR}/../include) - -# The maximum buffer size that is provided for resource responses and must be respected due to the limited IP buffer. -# Larger data must be handled by the resource and will be sent chunk-wise through a TCP stream or CoAP blocks. -# Block size is set to 1024 bytes if not specified otherwise to avoid block transfers in common use cases. -set(LWM2M_COAP_DEFAULT_BLOCK_SIZE 1024 CACHE STRING "Set default coap block size") -add_compile_definitions(LWM2M_COAP_DEFAULT_BLOCK_SIZE=${LWM2M_COAP_DEFAULT_BLOCK_SIZE}) - -set(WAKAAMA_SOURCES - ${WAKAAMA_SOURCES_DIR}/liblwm2m.c - ${WAKAAMA_SOURCES_DIR}/uri.c - ${WAKAAMA_SOURCES_DIR}/utils.c - ${WAKAAMA_SOURCES_DIR}/objects.c - ${WAKAAMA_SOURCES_DIR}/list.c - ${WAKAAMA_SOURCES_DIR}/packet.c - ${WAKAAMA_SOURCES_DIR}/registration.c - ${WAKAAMA_SOURCES_DIR}/bootstrap.c - ${WAKAAMA_SOURCES_DIR}/management.c - ${WAKAAMA_SOURCES_DIR}/observe.c - ${WAKAAMA_SOURCES_DIR}/discover.c - ${WAKAAMA_SOURCES_DIR}/internals.h -) - -# This will not work for multi project cmake generators like the Visual Studio Generator -if(CMAKE_BUILD_TYPE MATCHES Debug) - add_compile_definitions(LWM2M_WITH_LOGS) -endif() - -# Automatically determine endianess. This can be overwritten by setting LWM2M_LITTLE_ENDIAN -# accordingly in a cross compile toolchain file. -if(NOT DEFINED LWM2M_LITTLE_ENDIAN) - include(TestBigEndian) - TEST_BIG_ENDIAN(LWM2M_BIG_ENDIAN) - if (LWM2M_BIG_ENDIAN) - set(LWM2M_LITTLE_ENDIAN FALSE) - else() - set(LWM2M_LITTLE_ENDIAN TRUE) - endif() -endif() - -if (LWM2M_LITTLE_ENDIAN) - add_compile_definitions(LWM2M_LITTLE_ENDIAN) -else() - add_compile_definitions(LWM2M_BIG_ENDIAN) -endif() - -# Set the LWM2M version -set(LWM2M_VERSION "1.1" CACHE STRING "LWM2M version for client and max LWM2M version for server.") -if(LWM2M_VERSION VERSION_EQUAL "1.0") - add_compile_definitions(LWM2M_VERSION_1_0) -endif() diff --git a/data/data.cmake b/data/data.cmake deleted file mode 100644 index 1b8e8de28..000000000 --- a/data/data.cmake +++ /dev/null @@ -1,13 +0,0 @@ -# Provides DATA_SOURCES_DIR and DATA_HEADERS_DIR variables. -# Add LWM2M_WITH_LOGS to compile definitions to enable logging. - -set(DATA_SOURCES_DIR ${CMAKE_CURRENT_LIST_DIR}) -set(DATA_HEADERS_DIR ${CMAKE_CURRENT_LIST_DIR}) - -set(DATA_SOURCES - ${DATA_SOURCES_DIR}/data.c - ${DATA_SOURCES_DIR}/tlv.c - ${DATA_SOURCES_DIR}/json.c - ${DATA_SOURCES_DIR}/senml_json.c - ${DATA_SOURCES_DIR}/json_common.c -) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index f6ffd5742..852e00d2c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,9 +1,9 @@ cmake_minimum_required(VERSION 3.13) +# Our examples are designed for POSIX systems add_compile_definitions(_POSIX_C_SOURCE=200809) -add_compile_options(-pedantic) -add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/bootstrap_server) -add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/client) -add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/lightclient) -add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/server) +add_subdirectory(bootstrap_server) +add_subdirectory(client) +add_subdirectory(lightclient) +add_subdirectory(server) diff --git a/examples/bootstrap_server/CMakeLists.txt b/examples/bootstrap_server/CMakeLists.txt index 694b723e7..31f3b1cb5 100644 --- a/examples/bootstrap_server/CMakeLists.txt +++ b/examples/bootstrap_server/CMakeLists.txt @@ -2,27 +2,9 @@ cmake_minimum_required(VERSION 3.13) project(bootstrap_server C) -if(DTLS) - message(FATAL_ERROR "DTLS option is not supported.") -endif() +include(../../wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../core/wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../coap/coap.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../data/data.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../shared/shared.cmake) - -add_compile_definitions(LWM2M_BOOTSTRAP_SERVER_MODE) - -include_directories(${WAKAAMA_HEADERS_DIR} ${COAP_HEADERS_DIR} ${DATA_HEADERS_DIR} ${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) - -SET(SOURCES - ${CMAKE_CURRENT_LIST_DIR}/bootstrap_server.c - ${CMAKE_CURRENT_LIST_DIR}/bootstrap_info.c - ${CMAKE_CURRENT_LIST_DIR}/bootstrap_info.h -) - -SET(AUXILIARY_FILES ${CMAKE_CURRENT_LIST_DIR}/bootstrap_server.ini) - -add_executable(${PROJECT_NAME} ${SOURCES} ${AUXILIARY_FILES} ${WAKAAMA_SOURCES} ${COAP_SOURCES} ${DATA_SOURCES} ${SHARED_SOURCES}) - -SOURCE_GROUP(wakaama FILES ${WAKAAMA_SOURCES}) +add_executable(bootstrap_server bootstrap_info.c bootstrap_server.c bootstrap_info.h bootstrap_server.ini) +target_compile_definitions(bootstrap_server PRIVATE LWM2M_BOOTSTRAP_SERVER_MODE) +target_sources_wakaama(bootstrap_server) +target_sources_shared(bootstrap_server) diff --git a/examples/client/CMakeLists.txt b/examples/client/CMakeLists.txt index ee7bf099a..1a9bd46eb 100644 --- a/examples/client/CMakeLists.txt +++ b/examples/client/CMakeLists.txt @@ -2,43 +2,34 @@ cmake_minimum_required(VERSION 3.13) project(lwm2mclient C) -option(DTLS "Enable DTLS" OFF) - -include(${CMAKE_CURRENT_LIST_DIR}/../../core/wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../coap/coap.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../data/data.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../shared/shared.cmake) - -add_compile_definitions(LWM2M_CLIENT_MODE) -add_compile_definitions(LWM2M_BOOTSTRAP) - -if(LWM2M_VERSION VERSION_GREATER "1.0") - add_compile_definitions(LWM2M_SUPPORT_SENML_JSON) -else() - add_compile_definitions(LWM2M_SUPPORT_JSON) -endif() - -if(LWM2M_RAW_BLOCK1_REQUESTS) - add_compile_definitions(LWM2M_RAW_BLOCK1_REQUESTS) -endif() - -include_directories (${WAKAAMA_HEADERS_DIR} ${COAP_HEADERS_DIR} ${DATA_HEADERS_DIR} ${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) - -SET(SOURCES - ${CMAKE_CURRENT_LIST_DIR}/lwm2mclient.c - ${CMAKE_CURRENT_LIST_DIR}/lwm2mclient.h - ${CMAKE_CURRENT_LIST_DIR}/system_api.c - ${CMAKE_CURRENT_LIST_DIR}/object_security.c - ${CMAKE_CURRENT_LIST_DIR}/object_server.c - ${CMAKE_CURRENT_LIST_DIR}/object_device.c - ${CMAKE_CURRENT_LIST_DIR}/object_firmware.c - ${CMAKE_CURRENT_LIST_DIR}/object_location.c - ${CMAKE_CURRENT_LIST_DIR}/object_connectivity_moni.c - ${CMAKE_CURRENT_LIST_DIR}/object_connectivity_stat.c - ${CMAKE_CURRENT_LIST_DIR}/object_access_control.c - ${CMAKE_CURRENT_LIST_DIR}/object_test.c +include(../../wakaama.cmake) + +set(SOURCES + lwm2mclient.c + lwm2mclient.h + object_access_control.c + object_connectivity_moni.c + object_connectivity_stat.c + object_device.c + object_firmware.c + object_location.c + object_security.c + object_server.c + object_test.c + system_api.c ) -add_executable(${PROJECT_NAME} ${SOURCES} ${WAKAAMA_SOURCES} ${COAP_SOURCES} ${DATA_SOURCES} ${SHARED_SOURCES}) - -SOURCE_GROUP(wakaama FILES ${WAKAAMA_SOURCES}) +# Client without DTLS support +add_executable(lwm2mclient ${SOURCES}) +target_compile_definitions(lwm2mclient PRIVATE LWM2M_CLIENT_MODE LWM2M_BOOTSTRAP LWM2M_SUPPORT_SENML_JSON) +target_compile_definitions(lwm2mclient PRIVATE) +target_sources_wakaama(lwm2mclient) +target_sources_shared(lwm2mclient) + +# Client with DTLS support provided by tinydtls +add_executable(lwm2mclient_tinydtls ${SOURCES}) +set_target_properties(lwm2mclient_tinydtls PROPERTIES DTLS "tinydtls") +target_compile_definitions(lwm2mclient_tinydtls PRIVATE LWM2M_CLIENT_MODE) +target_compile_definitions(lwm2mclient_tinydtls PRIVATE LWM2M_BOOTSTRAP) +target_sources_wakaama(lwm2mclient_tinydtls) +target_sources_shared(lwm2mclient_tinydtls) diff --git a/examples/lightclient/CMakeLists.txt b/examples/lightclient/CMakeLists.txt index 2a3b3b1b0..f4a9fcc61 100644 --- a/examples/lightclient/CMakeLists.txt +++ b/examples/lightclient/CMakeLists.txt @@ -2,31 +2,9 @@ cmake_minimum_required(VERSION 3.13) project(lightclient C) -if(DTLS) - message(FATAL_ERROR "DTLS option is not supported." ) -endif() +include(../../wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../core/wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../coap/coap.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../data/data.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../shared/shared.cmake) - -add_compile_definitions(LWM2M_CLIENT_MODE) - -if(LWM2M_VERSION VERSION_GREATER "1.0") - add_compile_definitions(LWM2M_SUPPORT_SENML_JSON) -endif() - -include_directories(${WAKAAMA_HEADERS_DIR} ${COAP_HEADERS_DIR} ${DATA_HEADERS_DIR} ${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) - -SET(SOURCES - ${CMAKE_CURRENT_LIST_DIR}/lightclient.c - ${CMAKE_CURRENT_LIST_DIR}/object_security.c - ${CMAKE_CURRENT_LIST_DIR}/object_server.c - ${CMAKE_CURRENT_LIST_DIR}/object_device.c - ${CMAKE_CURRENT_LIST_DIR}/object_test.c -) - -add_executable(${PROJECT_NAME} ${SOURCES} ${WAKAAMA_SOURCES} ${COAP_SOURCES} ${DATA_SOURCES} ${SHARED_SOURCES}) - -SOURCE_GROUP(wakaama FILES ${WAKAAMA_SOURCES}) +add_executable(lightclient lightclient.c object_device.c object_security.c object_server.c object_test.c) +target_compile_definitions(lightclient PRIVATE LWM2M_CLIENT_MODE) +target_sources_wakaama(lightclient) +target_sources_shared(lightclient) diff --git a/examples/server/CMakeLists.txt b/examples/server/CMakeLists.txt index a290e9395..75af6ff31 100644 --- a/examples/server/CMakeLists.txt +++ b/examples/server/CMakeLists.txt @@ -2,23 +2,9 @@ cmake_minimum_required(VERSION 3.13) project(lwm2mserver C) -if(DTLS) - message(FATAL_ERROR "DTLS option is not supported.") -endif() +include(../../wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../core/wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../coap/coap.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../../data/data.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../shared/shared.cmake) - -add_compile_definitions(LWM2M_SERVER_MODE) - -include_directories(${WAKAAMA_HEADERS_DIR} ${COAP_HEADERS_DIR} ${DATA_HEADERS_DIR} ${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) - -SET(SOURCES - ${CMAKE_CURRENT_LIST_DIR}/lwm2mserver.c -) - -add_executable(${PROJECT_NAME} ${SOURCES} ${WAKAAMA_SOURCES} ${COAP_SOURCES} ${DATA_SOURCES} ${SHARED_SOURCES}) - -SOURCE_GROUP(wakaama FILES ${WAKAAMA_SOURCES}) +add_executable(lwm2mserver lwm2mserver.c) +target_compile_definitions(lwm2mserver PRIVATE LWM2M_SERVER_MODE) +target_sources_wakaama(lwm2mserver) +target_sources_shared(lwm2mserver) diff --git a/examples/shared/shared.cmake b/examples/shared/shared.cmake deleted file mode 100644 index bc9ea1e41..000000000 --- a/examples/shared/shared.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Provides SHARED_SOURCES_DIR, SHARED_SOURCES, SHARED_INCLUDE_DIRS and SHARED_DEFINITIONS variables - -set(SHARED_SOURCES_DIR ${CMAKE_CURRENT_LIST_DIR}) - -set(SHARED_SOURCES - ${SHARED_SOURCES_DIR}/commandline.c - ${SHARED_SOURCES_DIR}/platform.c - ${SHARED_SOURCES_DIR}/memtrace.c -) - -if(DTLS) - include(${CMAKE_CURRENT_LIST_DIR}/tinydtls.cmake) - - set(SHARED_SOURCES - ${SHARED_SOURCES} - ${TINYDTLS_SOURCES} - ${SHARED_SOURCES_DIR}/dtlsconnection.c - ) - - set(SHARED_INCLUDE_DIRS - ${SHARED_SOURCES_DIR} - ${TINYDTLS_SOURCES_DIR} - ) - - add_compile_definitions(WITH_TINYDTLS) -else() - set(SHARED_SOURCES - ${SHARED_SOURCES} - ${SHARED_SOURCES_DIR}/connection.c - ) - - set(SHARED_INCLUDE_DIRS ${SHARED_SOURCES_DIR}) -endif() diff --git a/examples/shared/tinydtls.cmake b/examples/shared/tinydtls.cmake index a625d2b14..b4255ae41 100644 --- a/examples/shared/tinydtls.cmake +++ b/examples/shared/tinydtls.cmake @@ -14,27 +14,35 @@ set(TINYDTLS_SOURCES ${TINYDTLS_SOURCES_DIR}/session.c ${TINYDTLS_SOURCES_DIR}/aes/rijndael.c ${TINYDTLS_SOURCES_DIR}/sha2/sha2.c - ${TINYDTLS_SOURCES_DIR}/ecc/ecc.c) + ${TINYDTLS_SOURCES_DIR}/ecc/ecc.c +) -set(TINYDTLS_SOURCES_GENERATED - ${TINYDTLS_SOURCES_DIR}/dtls_config.h) +set(TINYDTLS_SOURCES_GENERATED ${TINYDTLS_SOURCES_DIR}/dtls_config.h) -# source files are only available after tinydtls submodule have been checked out. -# Create a target "submodule_update" for that purpose. +# source files are only available after tinydtls submodule have been checked out. Create a target "submodule_update" for +# that purpose. find_package(Git REQUIRED) -add_custom_command(OUTPUT ${TINYDTLS_SOURCES} COMMAND ${GIT_EXECUTABLE} submodule update) -add_custom_target(submodule_update SOURCES ${TINYDTLS_SOURCES}) +add_custom_command( + OUTPUT ${TINYDTLS_SOURCES} + COMMAND ${GIT_EXECUTABLE} -C ${TINYDTLS_SOURCES_DIR} submodule update + COMMENT "Update submodule" +) +add_custom_target( + submodule_update + SOURCES ${TINYDTLS_SOURCES} + COMMENT "Generated (and other) tinydtls sources" +) -get_filename_component( COMPILER_FILENAME "${CMAKE_C_COMPILER}" NAME ) -string( REGEX REPLACE "-[^-]+$" "" - TOOLCHAIN_NAME "${COMPILER_FILENAME}" ) +get_filename_component(COMPILER_FILENAME "${CMAKE_C_COMPILER}" NAME) +string(REGEX REPLACE "-[^-]+$" "" TOOLCHAIN_NAME "${COMPILER_FILENAME}") -# The tinydtls configure step will create some more source files (tinydtls.h etc). -# Use cmake "External Project" modul to call autoreconf and configure on tinydtls if necessary. -if (NOT EXISTS ${TINYDTLS_SOURCES_GENERATED}) +# The tinydtls configure step will create some more source files (tinydtls.h etc). Use CMake "External Project" module +# to call autoreconf and configure on tinydtls if necessary. +if(NOT EXISTS ${TINYDTLS_SOURCES_GENERATED}) include(ExternalProject) - ExternalProject_Add(external_tinydtls - SOURCE_DIR "${TINYDTLS_SOURCES_DIR}" + ExternalProject_Add( + external_tinydtls + SOURCE_DIR "${TINYDTLS_SOURCES_DIR}" DOWNLOAD_COMMAND "" UPDATE_COMMAND "" BUILD_COMMAND "" @@ -45,30 +53,35 @@ if (NOT EXISTS ${TINYDTLS_SOURCES_GENERATED}) LOG_CONFIGURE 1 # Make the submodule_update target a dependency. DEPENDS submodule_update - ) + ) - ExternalProject_Add_Step(external_tinydtls autoheader - COMMAND "autoheader" - ALWAYS 1 - WORKING_DIRECTORY "${TINYDTLS_SOURCES_DIR}" - DEPENDERS configure - DEPENDEES autoconf + ExternalProject_Add_Step( + external_tinydtls autoheader + COMMAND "autoheader" + ALWAYS 1 + WORKING_DIRECTORY "${TINYDTLS_SOURCES_DIR}" + DEPENDERS configure + DEPENDEES autoconf ) - ExternalProject_Add_Step(external_tinydtls autoconf - COMMAND "autoconf" - ALWAYS 1 - WORKING_DIRECTORY "${TINYDTLS_SOURCES_DIR}" - DEPENDERS autoheader - DEPENDEES download + ExternalProject_Add_Step( + external_tinydtls autoconf + COMMAND "autoconf" + ALWAYS 1 + WORKING_DIRECTORY "${TINYDTLS_SOURCES_DIR}" + DEPENDERS autoheader + DEPENDEES download ) - # Let cmake know that it needs to execute the external_tinydtls target to generate those files. - add_custom_command(OUTPUT ${TINYDTLS_SOURCES_GENERATED} COMMAND "" DEPENDS external_tinydtls) + add_custom_command( + OUTPUT ${TINYDTLS_SOURCES_GENERATED} + COMMAND "true" + COMMENT "Let CMake know that it needs to execute the external_tinydtls target to generate those files." + DEPENDS external_tinydtls + ) endif() set(TINYDTLS_SOURCES ${TINYDTLS_SOURCES} ${TINYDTLS_SOURCES_GENERATED}) # Compile definitions for tinydtls set_source_files_properties(${TINYDTLS_SOURCES} PROPERTIES COMPILE_DEFINITIONS WITH_SHA256) - diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 44c6e1dd4..a61706bb7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,41 +2,38 @@ cmake_minimum_required(VERSION 3.13) project(lwm2munittests C) -add_compile_definitions(_POSIX_C_SOURCE=200809) - -include(${CMAKE_CURRENT_LIST_DIR}/../core/wakaama.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../coap/coap.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../data/data.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/../examples/shared/shared.cmake) - -add_compile_definitions(LWM2M_CLIENT_MODE) -add_compile_definitions(LWM2M_SUPPORT_TLV) -add_compile_definitions(LWM2M_SUPPORT_JSON) - -if(LWM2M_VERSION VERSION_GREATER "1.0") - add_compile_definitions(LWM2M_SUPPORT_SENML_JSON) -endif() - -# Enable all warnings for this test build -add_compile_options(-pedantic -Wall -Wextra -Wfloat-equal -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wswitch-default) - -include_directories(${WAKAAMA_HEADERS_DIR} ${COAP_HEADERS_DIR} ${DATA_HEADERS_DIR} ${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) -set_source_files_properties(${DATA_SOURCES_DIR}/senml_json.c PROPERTIES COMPILE_FLAGS -Wno-float-equal) - -file(GLOB SOURCES "*.c") - -add_executable(${PROJECT_NAME} ${SOURCES} ${WAKAAMA_SOURCES} ${COAP_SOURCES} ${DATA_SOURCES} ${SHARED_SOURCES}) -target_link_libraries(${PROJECT_NAME} cunit) +add_executable( + lwm2munittests + block1tests.c + convert_numbers_test.c + er_coap_coap_parse_message.c + memtest.h + senml_json_tests.c + tests.h + tlv_json_lwm2m_data_test.c + tlvtests.c + unittests.c + uritests.c +) + +target_link_libraries(lwm2munittests cunit) +target_compile_definitions(lwm2munittests PRIVATE LWM2M_CLIENT_MODE LWM2M_SUPPORT_TLV LWM2M_SUPPORT_JSON) + +# Our tests are designed for POSIX systems +target_compile_definitions(lwm2munittests PRIVATE _POSIX_C_SOURCE=200809) + +target_sources_wakaama(lwm2munittests) +target_sources_shared(lwm2munittests) if(SANITIZER) - target_compile_options(${PROJECT_NAME} PRIVATE -fsanitize=${SANITIZER} -fno-sanitize-recover=all) - target_link_options(${PROJECT_NAME} PRIVATE -fsanitize=${SANITIZER} -fno-sanitize-recover=all) + target_compile_options(lwm2munittests PRIVATE -fsanitize=${SANITIZER} -fno-sanitize-recover=all) + target_link_options(lwm2munittests PRIVATE -fsanitize=${SANITIZER} -fno-sanitize-recover=all) endif() if(COVERAGE) - target_compile_options(${PROJECT_NAME} PRIVATE --coverage) - target_link_options(${PROJECT_NAME} PRIVATE --coverage) + target_compile_options(lwm2munittests PRIVATE --coverage) + target_link_options(lwm2munittests PRIVATE --coverage) endif() -# Add our unit tests to it "test" target -add_test(NAME ${PROJECT_NAME}_test COMMAND ${PROJECT_NAME}) +# Add our unit tests to the "test" target +add_test(NAME lwm2munittests_test COMMAND lwm2munittests) diff --git a/tools/ci/run_ci.sh b/tools/ci/run_ci.sh index cb23fb8fa..99cba79af 100755 --- a/tools/ci/run_ci.sh +++ b/tools/ci/run_ci.sh @@ -34,6 +34,7 @@ OPT_WRAPPER_CMD="" RUN_BUILD=0 RUN_CLANG_FORMAT=0 RUN_CLEAN=0 +RUN_CMAKE_LINT=0 RUN_GITLINT=0 RUN_GIT_BLAME_IGNORE=0 RUN_TESTS=0 @@ -69,9 +70,10 @@ Options: Available steps (executed by --all): --run-gitlint Check git commits with gitlint - --run-clang-format Check code formatting with clang-format + --run-clang-format Check C code formatting --run-git-blame-ignore Validate .git-blame-ignore-revs --run-clean Remove all build artifacts + --run-cmake-lint Check CMake files formatting --run-build Build all targets --run-tests Build and execute tests " @@ -101,13 +103,17 @@ function run_clang_format() { exit 1 fi - echo "No code formatting errors found" + echo "No C code formatting errors found" } function run_clean() { rm -rf build-wakaama } +function run_cmake_lint() { + git ls-files '*CMakeLists.txt' '*.cmake' | xargs cmake-lint +} + function run_gitlint() { commits="${OPT_BRANCH_TARGET}...${OPT_BRANCH_SOURCE}" @@ -195,6 +201,7 @@ if ! PARSED_OPTS=$(getopt -o vah \ -l run-build \ -l run-clang-format \ -l run-clean \ + -l run-cmake-lint \ -l run-gitlint \ -l run-git-blame-ignore \ -l run-tests \ @@ -240,6 +247,10 @@ while true; do RUN_CLEAN=1 shift ;; + --run-cmake-lint) + RUN_CMAKE_LINT=1 + shift + ;; --run-build) RUN_BUILD=1 shift 1 @@ -287,6 +298,7 @@ while true; do -a|--all) RUN_CLANG_FORMAT=1 RUN_CLEAN=1 + RUN_CMAKE_LINT=1 RUN_GITLINT=1 RUN_GIT_BLAME_IGNORE=1 RUN_BUILD=1 @@ -362,6 +374,10 @@ if [ "${RUN_CLEAN}" -eq 1 ]; then run_clean fi +if [ "${RUN_CMAKE_LINT}" -eq 1 ]; then + run_cmake_lint +fi + if [ "${RUN_BUILD}" -eq 1 ]; then run_build fi diff --git a/tools/requirements-compliance.txt b/tools/requirements-compliance.txt new file mode 100644 index 000000000..e3fa90758 --- /dev/null +++ b/tools/requirements-compliance.txt @@ -0,0 +1,4 @@ +cmake-format +gitlint +pylint +-r ../tests/integration/requirements.txt diff --git a/wakaama.cmake b/wakaama.cmake new file mode 100644 index 000000000..fbbfc41f7 --- /dev/null +++ b/wakaama.cmake @@ -0,0 +1,136 @@ +set(WAKAAMA_TOP_LEVEL_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}") +set(WAKAAMA_EXAMPLE_DIRECTORY "${WAKAAMA_TOP_LEVEL_DIRECTORY}/examples") +set(WAKAAMA_EXAMPLE_SHARED_DIRECTORY "${WAKAAMA_EXAMPLE_DIRECTORY}/shared") + +# Add data format source files to an existing target. +# +# Separated from target_sources_wakaama() for testability reasons. +function(target_sources_data target) + target_sources( + ${target} + PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/data.c ${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/json.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/json_common.c ${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/senml_json.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/tlv.c + ) +endfunction() + +# Add CoAP source files to an existing target. +# +# Separated from target_sources_wakaama() for testability reasons. +function(target_sources_coap target) + target_sources( + ${target} + PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/coap/block.c ${WAKAAMA_TOP_LEVEL_DIRECTORY}/coap/er-coap-13/er-coap-13.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/coap/transaction.c + ) + # We should not (have to) do this! + target_include_directories(${target} PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/coap) +endfunction() + +# Add Wakaama source files to an existing target. +# +# The following definitions are needed and default values get applied if not set: +# +# - LWM2M_COAP_DEFAULT_BLOCK_SIZE +# - Either LWM2M_LITTLE_ENDIAN or LWM2M_BIG_ENDIAN +function(target_sources_wakaama target) + target_sources( + ${target} + PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/bootstrap.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/discover.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/internals.h + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/liblwm2m.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/list.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/management.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/objects.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/observe.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/packet.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/registration.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/uri.c + ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core/utils.c + ) + + target_include_directories(${target} PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/include) + + # We should not (have to) do this! + target_include_directories(${target} PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/core) + + # Extract pre-existing target specific definitions WARNING: Directory properties are not taken into account! + get_target_property(CURRENT_TARGET_COMPILE_DEFINITIONS ${target} COMPILE_DEFINITIONS) + + if(NOT CURRENT_TARGET_COMPILE_DEFINITIONS MATCHES "LWM2M_LITTLE_ENDIAN|LWM2M_BIG_ENDIAN") + # Replace TestBigEndian once we require CMake 3.20+ + include(TestBigEndian) + test_big_endian(machine_is_big_endian) + if(machine_is_big_endian) + target_compile_definitions(${target} PRIVATE LWM2M_BIG_ENDIAN) + message(STATUS "${target}: Endiannes not set, defaulting to big endian") + else() + target_compile_definitions(${target} PRIVATE LWM2M_LITTLE_ENDIAN) + message(STATUS "${target}: Endiannes not set, defaulting to little endian") + endif() + endif() + + # LWM2M_COAP_DEFAULT_BLOCK_SIZE is needed by source files -> always set it + if(NOT CURRENT_TARGET_COMPILE_DEFINITIONS MATCHES "LWM2M_COAP_DEFAULT_BLOCK_SIZE=") + target_compile_definitions(${target} PRIVATE "LWM2M_COAP_DEFAULT_BLOCK_SIZE=${LWM2M_COAP_DEFAULT_BLOCK_SIZE}") + message(STATUS "${target}: Default CoAP block size not set, using ${LWM2M_COAP_DEFAULT_BLOCK_SIZE}") + endif() + + # Detect invalid configuration already during CMake run + if(NOT CURRENT_TARGET_COMPILE_DEFINITIONS MATCHES "LWM2M_SERVER_MODE|LWM2M_BOOTSTRAP_SERVER_MODE|LWM2M_CLIENT_MODE") + message(FATAL_ERROR "${target}: At least one mode (client, server, bootstrap server) must be enabled!") + endif() + + target_sources_coap(${target}) + target_sources_data(${target}) +endfunction() + +# Add shared source files to an existing target. +function(target_sources_shared target) + get_target_property(TARGET_PROPERTY_DTLS ${target} DTLS) + + target_sources( + ${target} PRIVATE ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/commandline.c + ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/memtrace.c ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/platform.c + ) + + if(NOT TARGET_PROPERTY_DTLS) + target_sources(${target} PRIVATE ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/connection.c) + elseif(TARGET_PROPERTY_DTLS MATCHES "tinydtls") + include(${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/tinydtls.cmake) + # Prevent cryptic error messages down the road + if(NOT EXISTS ${TINYDTLS_SOURCES_DIR}/tinydtls.h) + message(FATAL_ERROR "${target}: tinydtls support requested, but submodule not checked out") + endif() + target_sources(${target} PRIVATE ${TINYDTLS_SOURCES} ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/dtlsconnection.c) + target_compile_definitions(${target} PRIVATE WITH_TINYDTLS) + target_include_directories(${target} PRIVATE ${TINYDTLS_SOURCES_DIR}) + else() + message(FATAL_ERROR "${target}: Unknown DTLS implementation '${TARGET_PROPERTY_DTLS} requested") + endif() + + target_include_directories(${target} PUBLIC ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}) +endfunction() + +# Warn about problematic code (not yet enforced) +add_compile_options( + -Waggregate-return + -Wall + -Wcast-align + -Wextra + -Wfloat-equal + -Wpointer-arith + -Wshadow + -Wswitch-default + -Wwrite-strings + -pedantic +) + +# The maximum buffer size that is provided for resource responses and must be respected due to the limited IP buffer. +# Larger data must be handled by the resource and will be sent chunk-wise through a TCP stream or CoAP blocks. Block +# size is set to 1024 bytes if not specified otherwise to avoid block transfers in common use cases. +set(LWM2M_COAP_DEFAULT_BLOCK_SIZE + 1024 + CACHE STRING "Default CoAP block size; Used if not set on a per-target basis" +)