-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
302 lines (261 loc) · 13.7 KB
/
Makefile
File metadata and controls
302 lines (261 loc) · 13.7 KB
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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
#
# IoT Sensor Telemetry Protocol
# Copyright(C) 2026 Matthew Gream (https://libiotdata.org)
#
# Makefile - iotdata library, test and support Makefile
#
# Targets:
# all - Build library and both test suites
# tests - Build and run all tests
# test-default - Build and run default variant tests
# test-custom - Build and run custom variant tests
# test-complete - Build and run comprehensive all-field-type tests
# test-failures - Build and run failure oriented tests
# test-example - Build and run example default variant test
# test-versions - Build and run all compile-time variant smoke tests
# minimal - Build and show full versus minimal build sizes (native)
# minimal-esp32 - Build and show full versus minimal build sizes (esp32 cross)
# lib - Build static library
# clean - Remove build artifacts
# format - Run clang-format across the code (*.c/*.h)
# prettier - Run prettier across the documentation (*.md)
#
# Compile-time options (pass via EXTRA=):
# IOTDATA_VARIANT_MAPS_DEFAULT Default variant maps (weather station)
# IOTDATA_VARIANT_MAPS <sym> Custom variant maps array symbol
# IOTDATA_VARIANT_MAPS_COUNT <n> Number of entries in custom maps
# IOTDATA_ENABLE_SELECTIVE Only compile explicitly enabled elements
# IOTDATA_ENABLE_xxx Enable individual field types
# IOTDATA_ENABLE_TLV Enable TLV
# IOTDATA_NO_DECODE Exclude decoder
# IOTDATA_NO_ENCODE Exclude encoder
# IOTDATA_NO_PRINT Exclude Print output support
# IOTDATA_NO_DUMP Exclude Dump output support
# IOTDATA_NO_JSON Exclude JSON support
# IOTDATA_NO_TLV_SPECIFIC Exclude TLV specific type handling
# IOTDATA_NO_CHECKS_STATE Remove runtime state checks
# IOTDATA_NO_CHECKS_TYPES Remove runtime type checks (e.g. temp limits)
# IOTDATA_NO_ERROR_STRINGS Exclude error strings (iotdata_strerror)
# IOTDATA_NO_FLOATING_DOUBLES Use float instead of double for position
# IOTDATA_NO_FLOATING Integer-only mode (no float/double)
#
CC=gcc
CFLAGS_DEFINES=
CFLAGS_COMMON=-Wall -Wextra -Wpedantic
CFLAGS_STRICT=-Werror \
-Wstrict-prototypes \
-Wold-style-definition \
-Wcast-align -Wcast-qual -Wconversion \
-Wfloat-equal -Wformat=2 -Wformat-security \
-Winit-self -Wjump-misses-init \
-Wlogical-op -Wmissing-include-dirs \
-Wnested-externs -Wpointer-arith \
-Wredundant-decls -Wshadow \
-Wstrict-overflow=2 -Wswitch-default \
-Wundef \
-Wunreachable-code -Wunused \
-Wwrite-strings
CFLAGS_OPT=-Os
# CFLAGS_OPT=-O6
CFLAGS = $(CFLAGS_COMMON) $(CFLAGS_STRICT) $(CFLAGS_DEFINES) $(CFLAGS_OPT)
CFLAGS_NO_FLOATING_POINT=-mno-sse -mno-mmx -mno-80387
CFLAGS_VERSIONS=-DIOTDATA_VARIANT_MAPS=test_version_variants -DIOTDATA_VARIANT_MAPS_COUNT=1
CFLAGS_SELECTIVE=-DIOTDATA_ENABLE_SELECTIVE \
-DIOTDATA_ENABLE_TLV \
-DIOTDATA_ENABLE_BATTERY -DIOTDATA_ENABLE_LINK \
-DIOTDATA_ENABLE_ENVIRONMENT -DIOTDATA_ENABLE_TEMPERATURE -DIOTDATA_ENABLE_PRESSURE -DIOTDATA_ENABLE_HUMIDITY \
-DIOTDATA_ENABLE_WIND -DIOTDATA_ENABLE_WIND_SPEED -DIOTDATA_ENABLE_WIND_DIRECTION -DIOTDATA_ENABLE_WIND_GUST \
-DIOTDATA_ENABLE_RAIN -DIOTDATA_ENABLE_RAIN_RATE -DIOTDATA_ENABLE_RAIN_SIZE \
-DIOTDATA_ENABLE_SOLAR -DIOTDATA_ENABLE_CLOUDS \
-DIOTDATA_ENABLE_AIR_QUALITY -DIOTDATA_ENABLE_AIR_QUALITY_INDEX -DIOTDATA_ENABLE_AIR_QUALITY_PM -DIOTDATA_ENABLE_AIR_QUALITY_GAS \
-DIOTDATA_ENABLE_RADIATION -DIOTDATA_ENABLE_RADIATION_CPM -DIOTDATA_ENABLE_RADIATION_DOSE \
-DIOTDATA_ENABLE_DEPTH -DIOTDATA_ENABLE_POSITION -DIOTDATA_ENABLE_DATETIME \
-DIOTDATA_ENABLE_FLAGS -DIOTDATA_ENABLE_IMAGE
AR = ar
LDFLAGS =
LIBS = -lm -lcjson
LIBS_NOJSON = -lm
LIBS_NOJSON_NO_MATH =
LIBS_NO_MATH=-lcjson
EXTRA ?= -DIOTDATA_VARIANT_MAPS_DEFAULT
CC_MACHINE := $(shell $(CC) -dumpmachine)
ifneq ($(findstring x86_64,$(CC_MACHINE)),)
CFLAGS_NO_FLOATING_POINT = -mno-sse -mno-mmx -mno-80387
else ifneq ($(findstring i686,$(CC_MACHINE)),)
CFLAGS_NO_FLOATING_POINT = -mno-sse -mno-mmx -mno-80387
else ifneq ($(findstring i386,$(CC_MACHINE)),)
CFLAGS_NO_FLOATING_POINT = -mno-sse -mno-mmx -mno-80387
else
CFLAGS_NO_FLOATING_POINT =
endif
CFLAGS_STACK_USAGE=-fstack-usage
CFLAGS_TEST=-I.
STACK_USAGE_FILE_LIST=tests/*.su
STACK_USAGE_FILE_EXAMPLE_IOTDATA=tests/test_example-iotdata.su
LIB_SRC = iotdata.c
LIB_OBJ = iotdata.o
LIB_HDR = iotdata.h
LIB_STATIC = libiotdata.a
TEST_DEFAULT_SRC = tests/test_default.c
TEST_DEFAULT_BIN = tests/test_default
TEST_CUSTOM_SRC = tests/test_custom.c
TEST_CUSTOM_BIN = tests/test_custom
TEST_COMPLETE_SRC = tests/test_complete.c
TEST_COMPLETE_BIN = tests/test_complete
TEST_EXAMPLE_SRC = tests/test_example.c
TEST_EXAMPLE_BIN = tests/test_example
TEST_FAILURES_SRC = tests/test_failures.c
TEST_FAILURES_BIN = tests/test_failures
TEST_VERSION_SRC = tests/test_version.c
MINIMAL_OBJ=iotdata_full.o iotdata_minimal.o
VERSION_BINS = \
tests/test_version_FULL \
tests/test_version_NO_PRINT \
tests/test_version_NO_DUMP \
tests/test_version_NO_JSON \
tests/test_version_NO_DECODE \
tests/test_version_NO_ENCODE \
tests/test_version_NO_FLOATING \
tests/test_version_NO_FLOATING_NO_JSON \
tests/test_version_NO_ERROR_STRINGS \
tests/test_version_NO_FLOATING_DOUBLES \
tests/test_version_SELECTIVE \
tests/test_version_NO_CHECKS
################################################################################
all: lib $(TEST_DEFAULT_BIN) $(TEST_CUSTOM_BIN) $(TEST_COMPLETE_BIN) $(TEST_FAILURES_BIN) $(TEST_EXAMPLE_BIN)
################################################################################
lib: $(LIB_STATIC)
$(LIB_OBJ): $(LIB_SRC) $(LIB_HDR)
$(CC) $(CFLAGS) $(EXTRA) -c $(LIB_SRC) -o $(LIB_OBJ)
$(LIB_STATIC): $(LIB_OBJ)
$(AR) rcs $(LIB_STATIC) $(LIB_OBJ)
################################################################################
$(TEST_DEFAULT_BIN): $(TEST_DEFAULT_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) -DIOTDATA_VARIANT_MAPS_DEFAULT $(TEST_DEFAULT_SRC) $(LIB_SRC) $(LIBS) -o $(TEST_DEFAULT_BIN)
$(TEST_CUSTOM_BIN): $(TEST_CUSTOM_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) -DIOTDATA_VARIANT_MAPS=custom_variants -DIOTDATA_VARIANT_MAPS_COUNT=3 $(TEST_CUSTOM_SRC) $(LIB_SRC) $(LIBS) -o $(TEST_CUSTOM_BIN)
$(TEST_COMPLETE_BIN): $(TEST_COMPLETE_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) -DIOTDATA_VARIANT_MAPS=complete_variants -DIOTDATA_VARIANT_MAPS_COUNT=2 $(TEST_COMPLETE_SRC) $(LIB_SRC) $(LIBS) -o $(TEST_COMPLETE_BIN)
$(TEST_FAILURES_BIN): $(TEST_FAILURES_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) -DIOTDATA_VARIANT_MAPS=failure_variants -DIOTDATA_VARIANT_MAPS_COUNT=2 $(TEST_FAILURES_SRC) $(LIB_SRC) $(LIBS) -o $(TEST_FAILURES_BIN)
test-default: $(TEST_DEFAULT_BIN)
./$(TEST_DEFAULT_BIN)
test-custom: $(TEST_CUSTOM_BIN)
./$(TEST_CUSTOM_BIN)
test-complete: $(TEST_COMPLETE_BIN)
./$(TEST_COMPLETE_BIN)
test-failures: $(TEST_FAILURES_BIN)
./$(TEST_FAILURES_BIN)
test-suites: $(TEST_DEFAULT_BIN) $(TEST_CUSTOM_BIN) $(TEST_COMPLETE_BIN) $(TEST_FAILURES_BIN)
./$(TEST_DEFAULT_BIN)
./$(TEST_CUSTOM_BIN)
./$(TEST_COMPLETE_BIN)
./$(TEST_FAILURES_BIN)
################################################################################
tests/test_version_FULL: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_NO_PRINT: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_PRINT \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_NO_DUMP: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_DUMP \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_NO_JSON: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_JSON \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS_NOJSON) -o $@
tests/test_version_NO_DECODE: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_DECODE \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_NO_ENCODE: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_ENCODE \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_NO_FLOATING: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_FLOATING \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS_NO_MATH) -o $@
tests/test_version_NO_FLOATING_NO_JSON: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_FLOATING -DIOTDATA_NO_JSON $(CFLAGS_NO_FLOATING_POINT) \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS_NOJSON_NO_MATH) -o $@
tests/test_version_NO_ERROR_STRINGS: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_ERROR_STRINGS \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_NO_FLOATING_DOUBLES: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_FLOATING_DOUBLES \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_SELECTIVE: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) $(CFLAGS_SELECTIVE) \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
tests/test_version_NO_CHECKS: $(TEST_VERSION_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_VERSIONS) -DIOTDATA_NO_CHECKS_STATE -DIOTDATA_NO_CHECKS_TYPES \
$(TEST_VERSION_SRC) $(LIB_SRC) $(LIBS) -o $@
test-versions: $(VERSION_BINS)
@for t in $(VERSION_BINS); do ./$$t; done
################################################################################
$(TEST_EXAMPLE_BIN): $(TEST_EXAMPLE_SRC) $(LIB_HDR) $(LIB_SRC)
$(CC) $(CFLAGS) $(CFLAGS_TEST) $(CFLAGS_STACK_USAGE) -DIOTDATA_VARIANT_MAPS_DEFAULT $(TEST_EXAMPLE_SRC) $(LIB_SRC) $(LIBS) -o $(TEST_EXAMPLE_BIN)
test-example: $(TEST_EXAMPLE_BIN)
./$(TEST_EXAMPLE_BIN)
################################################################################
tests: test-suites test-versions test-example
################################################################################
format:
clang-format --verbose -i $$(find . -name build -prune -o \( -name '*.c' -o -name '*.h' \) -print)
prettier:
prettier --write $$(find . -name build -prune -o \( -name '*.md' \) -print)
clean:
rm -f $(LIB_OBJ) $(LIB_STATIC) $(TEST_DEFAULT_BIN) $(TEST_CUSTOM_BIN) $(TEST_COMPLETE_BIN) $(TEST_FAILURES_BIN) $(TEST_EXAMPLE_BIN) $(VERSION_BINS) $(MINIMAL_OBJ) $(STACK_USAGE_FILE_LIST)
.PHONY: all test-default test-custom test-complete test-failures test-suites test-example test-versions tests lib format clean minimal
################################################################################
stack-usage:
@cat $(STACK_USAGE_FILE_EXAMPLE_IOTDATA) | sort -t"$$(printf '\t')" -k2 -rn | head -10 | column -t
################################################################################
example-simulator:
$(MAKE) -C examples/simulator
example-gateway-linux:
$(MAKE) -C examples/gateway_mqtt_lora_linux
example-sensor-esp32:
$(MAKE) -C examples/simulator_sensor_lora_esp32
examples: example-simulator example-gateway-linux example-sensor-esp32
example-simulator-clean:
$(MAKE) -C examples/simulator clean
example-gateway-linux-clean:
$(MAKE) -C examples/gateway_mqtt_lora_linux clean
example-sensor-esp32-clean:
$(MAKE) -C examples/simulator_sensor_lora_esp32 clean
examples-clean: example-simulator-clean example-gateway-linux-clean example-sensor-esp32-clean
.PHONY: examples example-simulator example-gateway-linux example-sensor-esp32 examples-clean example-simulator-clean example-gateway-linux-clean example-sensor-esp32-clean
################################################################################
minimal:
@echo "--- Complete library (platform) ---"
$(CC) $(CFLAGS) -DIOTDATA_VARIANT_MAPS_DEFAULT -c $(LIB_SRC) -o iotdata_platform_full.o
@size iotdata_platform_full.o
@echo "--- Minimal encoder (platform) (battery + environment, integer-only) ---"
$(CC) $(CFLAGS) $(CFLAGS_NO_FLOATING_POINT) \
-DIOTDATA_NO_DECODE \
-DIOTDATA_ENABLE_SELECTIVE -DIOTDATA_ENABLE_BATTERY -DIOTDATA_ENABLE_ENVIRONMENT \
-DIOTDATA_NO_JSON -DIOTDATA_NO_DUMP -DIOTDATA_NO_PRINT \
-DIOTDATA_NO_FLOATING -DIOTDATA_NO_ERROR_STRINGS -DIOTDATA_NO_CHECKS_STATE -DIOTDATA_NO_CHECKS_TYPES \
-c $(LIB_SRC) -o iotdata_platform_minimal.o
@echo "Minimal object size:"
@size iotdata_platform_minimal.o
@objdump -t iotdata_platform_minimal.o | grep ' \.data\| \.rodata' | sort -k5 -rn
@rm -f iotdata_platform_full.o iotdata_platform_minimal.o
################################################################################
ESP_CC = riscv32-esp-elf-gcc
ESP_CFLAGS_BASE = -march=rv32imc -mabi=ilp32 -Os
minimal-esp32:
@echo "--- Complete library (esp32c3) (no JSON) ---"
$(ESP_CC) $(ESP_CFLAGS_BASE) -DIOTDATA_NO_JSON -c $(LIB_SRC) -o iotdata_esp32c3_full.o
@riscv32-esp-elf-size iotdata_esp32c3_full.o
@echo "--- Minimal encoder (esp32c3) (battery + environment, integer-only) ---"
$(ESP_CC) $(ESP_CFLAGS_BASE) \
-DIOTDATA_NO_DECODE \
-DIOTDATA_ENABLE_SELECTIVE -DIOTDATA_ENABLE_BATTERY -DIOTDATA_ENABLE_ENVIRONMENT \
-DIOTDATA_NO_JSON -DIOTDATA_NO_DUMP -DIOTDATA_NO_PRINT \
-DIOTDATA_NO_FLOATING -DIOTDATA_NO_ERROR_STRINGS -DIOTDATA_NO_CHECKS_STATE -DIOTDATA_NO_CHECKS_TYPES \
-c $(LIB_SRC) -o iotdata_esp32c3_minimal.o
@echo "Minimal object size:"
@riscv32-esp-elf-size iotdata_esp32c3_minimal.o
@riscv32-esp-elf-objdump -t iotdata_esp32c3_minimal.o | grep ' \.data\| \.rodata' | sort -k5 -rn
@rm -f iotdata_esp32c3_full.o iotdata_esp32c3_minimal.o
################################################################################