forked from eclipse-wakaama/wakaama
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wakaama.cmake
226 lines (195 loc) · 8.65 KB
/
wakaama.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
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")
# Mode
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)
# 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)
# Logging
set(WAKAAMA_LOG_LEVEL
LOG_DISABLED
CACHE STRING "The lowest log level provided at build time"
)
set_property(
CACHE WAKAAMA_LOG_LEVEL
PROPERTY STRINGS
LOG_DISABLED
DBG
INFO
WARN
ERR
FATAL
)
option(WAKAAMA_LOG_CUSTOM_HANDLER "Provide a custom handler for logging messages" OFF)
set(WAKAAMA_LOG_MAX_MSG_TXT_SIZE
200
CACHE STRING "The buffer size for the log message (without additional data)"
)
# Possibility to disable the examples
option(WAKAAMA_ENABLE_EXAMPLES "Build all the example applications" ON)
# Set the defines for Wakaama mode configuration
function(set_mode_defines target)
# Mode
if(WAKAAMA_MODE_CLIENT)
target_compile_definitions(${target} PUBLIC LWM2M_CLIENT_MODE)
endif()
if(WAKAAMA_MODE_SERVER)
target_compile_definitions(${target} PUBLIC LWM2M_SERVER_MODE)
endif()
if(WAKAAMA_MODE_BOOTSTRAP_SERVER)
target_compile_definitions(${target} PUBLIC LWM2M_BOOTSTRAP_SERVER_MODE)
endif()
endfunction()
# Set the defines for client specific configuration
function(set_client_defines target)
if(WAKAAMA_CLIENT_INITIATED_BOOTSTRAP)
target_compile_definitions(${target} PUBLIC LWM2M_BOOTSTRAP)
endif()
if(WAKAAMA_CLIENT_LWM2M_V_1_0)
target_compile_definitions(${target} PUBLIC LWM2M_VERSION_1_0)
endif()
endfunction()
# Set the defines for logging configuration
function(set_logging_defines target)
# Logging
target_compile_definitions(${target} PUBLIC LWM2M_LOG_LEVEL=LWM2M_${WAKAAMA_LOG_LEVEL})
if(WAKAAMA_LOG_CUSTOM_HANDLER)
target_compile_definitions(${target} PUBLIC LWM2M_LOG_CUSTOM_HANDLER)
endif()
target_compile_definitions(${target} PUBLIC LWM2M_LOG_MAX_MSG_TXT_SIZE=${WAKAAMA_LOG_MAX_MSG_TXT_SIZE})
endfunction()
# Set all the requested defines on target
function(set_defines target)
set_mode_defines(${target})
set_client_defines(${target})
set_logging_defines(${target})
endfunction()
# 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
${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/cbor.c
${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/senml_common.c
${WAKAAMA_TOP_LEVEL_DIRECTORY}/data/senml_cbor.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/logging.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)
target_compile_definitions(
${target} PUBLIC "$<IF:$<STREQUAL:${CMAKE_C_BYTE_ORDER},BIG_ENDIAN>,LWM2M_BIG_ENDIAN,LWM2M_LITTLE_ENDIAN>"
)
# set defines
set_defines(${target})
# Extract pre-existing target specific definitions WARNING: Directory properties are not taken into account!
get_target_property(CURRENT_TARGET_COMPILE_DEFINITIONS ${target} COMPILE_DEFINITIONS)
# 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_CONN_IMPL ${target} CONNECTION_IMPLEMENTATION)
target_sources(
${target} PRIVATE ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/commandline.c
${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/platform.c
)
set_defines(${target})
if(NOT TARGET_PROPERTY_CONN_IMPL)
target_sources(${target} PRIVATE ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/connection.c)
elseif(TARGET_PROPERTY_CONN_IMPL MATCHES "tinydtls")
include(${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/tinydtls.cmake)
target_sources(${target} PRIVATE ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY}/dtlsconnection.c)
target_compile_definitions(${target} PRIVATE WITH_TINYDTLS)
target_sources_tinydtls(${target})
elseif(TARGET_PROPERTY_CONN_IMPL MATCHES "testing")
target_include_directories(${target} PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/tests/helper/)
target_sources(${target} PRIVATE ${WAKAAMA_TOP_LEVEL_DIRECTORY}/tests/helper/connection.c)
else()
message(
FATAL_ERROR "${target}: Unknown connection (DTLS) implementation '${TARGET_PROPERTY_CONN_IMPL} requested"
)
endif()
target_include_directories(${target} PUBLIC ${WAKAAMA_EXAMPLE_SHARED_DIRECTORY})
endfunction()
# Enforce a certain level of hygiene
add_compile_options(
-Waggregate-return
-Wall
-Wcast-align
-Wextra
-Wfloat-equal
-Wpointer-arith
-Wshadow
-Wswitch-default
-Wwrite-strings
-pedantic
# Reduce noise: Unused parameters are common in this ifdef-littered code-base, but of no danger
-Wno-unused-parameter
# Reduce noise: Too many false positives
-Wno-uninitialized
# Turn (most) warnings into errors
-Werror
# Disabled because of existing, non-trivially fixable code
-Wno-error=cast-align
)
# 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"
)