1- # Copyright 2023-2025 AVSystem <avsystem@avsystem.com>
1+ # Copyright 2023-2026 AVSystem <avsystem@avsystem.com>
22# AVSystem Anjay Lite LwM2M SDK
33# All rights reserved.
44#
@@ -15,10 +15,54 @@ project(anjay_lite C)
1515
1616set (CMAKE_C_STANDARD 99)
1717set (CMAKE_C_EXTENSIONS OFF )
18+ include (ExternalProject )
1819
19- # Below find_package() call is meant for IDE indexing purposes.
20- set (anjay_lite_DIR "cmake" )
21- find_package (anjay_lite REQUIRED )
20+ # Although we have cmake/anjay_lite-config.cmake which calls
21+ # anjay_lite_mbedtls.cmake internally, we couldn't use this
22+ # cmake script here because FetchContent builds mbedtls in a way
23+ # that can't be utilized by find_package(MbedTLS).
24+ #
25+ # When calling root project CMakeLists.txt, MbedTLS will be
26+ # either downloaded by ExternalProject call below, or user
27+ # will provide MBEDTLS_ROOT_DIR variable pointing to an existing
28+ # MbedTLS installation. MbedTLS fetched by ExternalProject will
29+ # be passed to subprojects via -DMBEDTLS_ROOT_DIR=... argument.
30+ # This allows to utilize single MbedTLS build for all subprojects.
31+ #
32+ # When calling subproject CMakeLists.txt directly, user is expected
33+ # to provide MBEDTLS_ROOT_DIR variable pointing to an existing MbedTLS
34+ # installation, otherwise, subproject will include anjay_lite_mbedtls.cmake
35+ # and download MbedTLS via FetchContent mechanism, once for each subproject.
36+ if (NOT MBEDTLS_ROOT_DIR)
37+ if (NOT MBEDTLS_VERSION)
38+ set (MBEDTLS_VERSION "3.6.4" )
39+ endif ()
40+
41+ message (STATUS "No MBEDTLS_ROOT_DIR provided. Fetching MbedTLS ${MBEDTLS_VERSION} ..." )
42+ set (MBEDTLS_BUILD_DIR "${CMAKE_BINARY_DIR} /_deps/mbedtls-build" )
43+ ExternalProject_Add (mbedtls
44+ GIT_REPOSITORY https://github.com/Mbed-TLS/mbedtls.git
45+ GIT_TAG v${MBEDTLS_VERSION}
46+ GIT_SHALLOW TRUE
47+
48+ SOURCE_DIR "${CMAKE_BINARY_DIR} /_deps/mbedtls-src"
49+ BINARY_DIR "${MBEDTLS_BUILD_DIR} "
50+
51+ CMAKE_ARGS
52+ -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
53+ -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
54+ -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
55+ -DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_EXE_LINKER_FLAGS}
56+ -DENABLE_PROGRAMS=OFF
57+ -DENABLE_TESTING=OFF
58+
59+ INSTALL_COMMAND "" # skip "make install"
60+ )
61+ set (TARGETS_MBEDTLS_DIR "${MBEDTLS_BUILD_DIR} " )
62+ else ()
63+ message ("Using MbedTLS from: ${MBEDTLS_ROOT_DIR} " )
64+ set (TARGETS_MBEDTLS_DIR "${MBEDTLS_ROOT_DIR} " )
65+ endif ()
2266
2367find_program (VALGRIND_EXECUTABLE valgrind )
2468
@@ -35,87 +79,100 @@ endforeach()
3579
3680message (STATUS "Command line flags: ${COMMAND_LINE_FLAGS} " )
3781
38- function (add_standalone_target NAME PATH WITH_VALGRIND )
82+ function (add_standalone_target NAME PATH WITH_VALGRIND WITH_MBEDTLS )
3983 set (workdir "${CMAKE_BINARY_DIR} /${NAME} " )
4084
41- string (REPLACE " " ";" unescaped_c_flags "${CMAKE_C_FLAGS} " )
42- string (REPLACE " " ";" unescaped_exe_linker_flags "${CMAKE_EXE_LINKER_FLAGS} " )
43-
44- add_custom_target (${NAME} ALL )
45- add_custom_command (TARGET ${NAME} COMMAND ${CMAKE_COMMAND} -E make_directory
46- "${workdir} " PRE_BUILD )
47- add_custom_command (
48- TARGET ${NAME}
49- COMMAND
50- ${CMAKE_COMMAND} -S "${CMAKE_CURRENT_SOURCE_DIR} /${PATH} " -B .
51- -DCMAKE_C_COMPILER= "${CMAKE_C_COMPILER} "
52- -DCMAKE_C_FLAGS= "${unescaped_c_flags} "
53- -DCMAKE_EXE_LINKER_FLAGS= "${unescaped_exe_linker_flags} "
54- ${COMMAND_LINE_FLAGS}
55- COMMAND ${CMAKE_COMMAND} --build . --target ${NAME} -- -j${NPROC}
56- WORKING_DIRECTORY "${workdir} "
57- POST_BUILD )
58-
59- if (WITH_VALGRIND AND VALGRIND_EXECUTABLE)
60- add_custom_target (
61- ${NAME} _with_valgrind
62- DEPENDS ${NAME}
63- COMMAND "${VALGRIND_EXECUTABLE} " --leak-check=full --track-origins=yes -q
64- --error-exitcode=63 "${workdir} /${NAME} " )
85+ set (DEPENDS_ON_LIST "" )
86+ if (TARGET mbedtls AND WITH_MBEDTLS)
87+ list (APPEND DEPENDS_ON_LIST mbedtls)
6588 endif ()
6689
67- if (${NAME} MATCHES "_tests" )
68- add_dependencies (run_tests ${NAME} )
69- add_custom_command (TARGET run_tests COMMAND "${workdir} /${NAME} " POST_BUILD )
90+ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR} /${PATH} )
91+ ExternalProject_Add (
92+ ${NAME}
93+ SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR} /${PATH} "
94+ BINARY_DIR "${workdir} "
95+ CMAKE_CACHE_ARGS
96+ -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
97+ -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
98+ -DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_EXE_LINKER_FLAGS}
99+ -DMBEDTLS_ROOT_DIR:STRING=${TARGETS_MBEDTLS_DIR}
100+ ${COMMAND_LINE_FLAGS}
101+ DEPENDS ${DEPENDS_ON_LIST}
102+ INSTALL_COMMAND "" # skip "make install"
103+ BUILD_ALWAYS 1
104+ )
105+
106+ if (WITH_VALGRIND AND VALGRIND_EXECUTABLE)
107+ add_custom_target (
108+ ${NAME} _with_valgrind
109+ DEPENDS ${NAME}
110+ COMMAND "${VALGRIND_EXECUTABLE} " --leak-check=full --track-origins=yes -q
111+ --error-exitcode=63 "${workdir} /${NAME} " )
112+ endif ()
113+
114+ if (${NAME} MATCHES "_tests" )
115+ add_dependencies (run_tests ${NAME} )
116+ add_custom_command (TARGET run_tests COMMAND "${workdir} /${NAME} " POST_BUILD )
117+ endif ()
70118 endif ()
71119endfunction ()
72120
73121# tests
74- add_standalone_target (dm_tests tests/anj/dm ON )
75- add_standalone_target (dm_without_composite_tests tests/anj/dm_without_composite ON )
76- add_standalone_target (observe_tests tests/anj/observe ON )
77- add_standalone_target (observe_without_composite_tests tests/anj/observe_without_composite ON )
78- add_standalone_target (exchange_tests tests/anj/exchange ON )
79- add_standalone_target (io_tests tests/anj/io ON )
80- add_standalone_target (io_tests_without_extended tests/anj/io_without_extended ON )
81- add_standalone_target (coap_tests tests/anj/coap ON )
82- add_standalone_target (net_tests tests/anj/net ON )
83- add_standalone_target (core_tests tests/anj/core ON )
84- add_standalone_target (downloader_tests tests/anj/downloader ON )
85- add_standalone_target (time_api_tests tests/anj/time ON )
86- add_standalone_target (log_tests tests/anj/log ON )
122+ add_standalone_target (standard_tests tests/anj/standard_tests ON ON )
123+ add_standalone_target (standard_tests_without_composite tests/anj/standard_tests_without_composite ON ON )
124+ add_standalone_target (standard_tests_without_external_data tests/anj/standard_tests_without_external_data ON ON )
125+ add_standalone_target (standard_tests_without_lwm2m_1_2 tests/anj/standard_tests_without_lwm2m_1_2 ON ON )
126+ add_standalone_target (log_tests tests/anj/log ON OFF )
127+ add_standalone_target (net_tests tests/anj/net ON OFF )
87128
88129# examples
89- add_standalone_target (anjay_lite_firmware_update examples/tutorial/firmware-update OFF )
90- add_standalone_target (anjay_lite_firmware_update_pull examples/tutorial/firmware-update-coap-downloader OFF )
91- add_standalone_target (anjay_lite_secure_firmware_update_pull examples/tutorial/firmware-update-coaps-downloader OFF )
92-
93- add_standalone_target (anjay_lite_bc_initialization examples/tutorial/BC-Initialization OFF )
94- add_standalone_target (anjay_lite_bc_mandatory_objects examples/tutorial/BC-MandatoryObjects OFF )
95- add_standalone_target (anjay_lite_bc_security examples/tutorial/BC-Security OFF )
96- add_standalone_target (anjay_lite_bc_object_impl examples/tutorial/BC-BasicObjectImplementation OFF )
97- add_standalone_target (anjay_lite_bc_notifications examples/tutorial/BC-Notifications OFF )
98- add_standalone_target (anjay_lite_bc_send examples/tutorial/BC-Send OFF )
99-
100- add_standalone_target (anjay_lite_at_bootstrap examples/tutorial/AT-Bootstrap OFF )
101- add_standalone_target (anjay_lite_at_persistence examples/tutorial/AT-Persistence OFF )
102- add_standalone_target (anjay_lite_at_queue_mode examples/tutorial/AT-QueueMode OFF )
103- add_standalone_target (anjay_lite_at_multi_instance_object examples/tutorial/AT-MultiInstanceObject OFF )
104- add_standalone_target (anjay_lite_at_multi_instance_object_dynamic examples/tutorial/AT-MultiInstanceObjectDynamic OFF )
105- add_standalone_target (anjay_lite_at_multi_instance_resource examples/tutorial/AT-MultiInstanceResource OFF )
106- add_standalone_target (anjay_lite_at_multi_instance_resource_dynamic examples/tutorial/AT-MultiInstanceResourceDynamic OFF )
107-
108- add_standalone_target (anjay_lite_minimal_network_api examples/custom-network/minimal OFF )
130+ add_standalone_target (anjay_lite_firmware_update examples/tutorial/firmware-update OFF OFF )
131+ add_standalone_target (anjay_lite_firmware_update_pull examples/tutorial/firmware-update-coap-downloader OFF OFF )
132+ add_standalone_target (anjay_lite_secure_firmware_update_pull examples/tutorial/firmware-update-coaps-downloader OFF ON )
133+
134+ add_standalone_target (anjay_lite_bc_initialization examples/tutorial/BC-Initialization OFF OFF )
135+ add_standalone_target (anjay_lite_bc_mandatory_objects examples/tutorial/BC-MandatoryObjects OFF OFF )
136+ add_standalone_target (anjay_lite_bc_security examples/tutorial/BC-Security OFF ON )
137+ add_standalone_target (anjay_lite_bc_object_impl examples/tutorial/BC-BasicObjectImplementation OFF OFF )
138+ add_standalone_target (anjay_lite_bc_notifications examples/tutorial/BC-Notifications OFF OFF )
139+ add_standalone_target (anjay_lite_bc_send examples/tutorial/BC-Send OFF OFF )
140+
141+ add_standalone_target (anjay_lite_at_bootstrap examples/tutorial/AT-Bootstrap OFF OFF )
142+ add_standalone_target (anjay_lite_at_persistence examples/tutorial/AT-Persistence OFF OFF )
143+ add_standalone_target (anjay_lite_at_queue_mode examples/tutorial/AT-QueueMode OFF OFF )
144+ add_standalone_target (anjay_lite_at_multi_instance_object examples/tutorial/AT-MultiInstanceObject OFF OFF )
145+ add_standalone_target (anjay_lite_at_multi_instance_object_dynamic examples/tutorial/AT-MultiInstanceObjectDynamic OFF OFF )
146+ add_standalone_target (anjay_lite_at_multi_instance_resource examples/tutorial/AT-MultiInstanceResource OFF OFF )
147+ add_standalone_target (anjay_lite_at_multi_instance_resource_dynamic examples/tutorial/AT-MultiInstanceResourceDynamic OFF OFF )
148+ add_standalone_target (anjay_lite_at_time_synchronization examples/tutorial/AT-TimeSynchronization OFF OFF )
149+ add_standalone_target (anjay_lite_at_time_synchronization_persistence examples/tutorial/AT-TimeSynchronizationPersistence OFF OFF )
150+ add_standalone_target (anjay_lite_at_micro_logs examples/tutorial/AT-MicroLogs OFF OFF )
151+
152+ add_standalone_target (anjay_lite_minimal_network_api examples/custom-network/minimal OFF OFF )
109153
110154# Sphinx and doxygen documentation
111- add_subdirectory (doc )
155+ # Note: documentation is configured and built only when the target is
156+ # explicitly invoked (e.g. via `make doc_sphinx`).
157+ function (add_doc_proxy_target TARGET_NAME )
158+ add_custom_target (${TARGET_NAME}
159+ COMMAND ${CMAKE_COMMAND} -S "${CMAKE_SOURCE_DIR} /doc" -B "${CMAKE_BINARY_DIR} /doc"
160+ COMMAND ${CMAKE_COMMAND} --build "${CMAKE_BINARY_DIR} /doc" --target ${TARGET_NAME}
161+ USES_TERMINAL
162+ )
163+ endfunction ()
164+
165+ add_doc_proxy_target (doc )
166+ add_doc_proxy_target (doc_sphinx )
167+ add_doc_proxy_target (doc_doxygen )
168+ add_doc_proxy_target (test_doc_snippet )
112169
113170# C++ header compatibility check
114- add_standalone_target (cxx_header_check tests/cxx_header_check OFF )
171+ add_standalone_target (cxx_header_check tests/cxx_header_check OFF OFF )
115172
116- add_standalone_target (codegen_compilation_check tests/codegen/compilation OFF )
117- add_standalone_target (codegen_object_registry_check tests/codegen/object_registry OFF )
118- add_standalone_target (codegen_add_object_tests tests/codegen/add_object OFF )
173+ add_standalone_target (codegen_compilation_check tests/codegen/compilation OFF OFF )
174+ add_standalone_target (codegen_object_registry_check tests/codegen/object_registry OFF OFF )
175+ add_standalone_target (codegen_add_object_tests tests/codegen/add_object OFF OFF )
119176
120177# Check for correct inclusion of anj/init.h
121178add_custom_target (init_header_check
0 commit comments