-
-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathMakefile
More file actions
173 lines (132 loc) · 5.95 KB
/
Makefile
File metadata and controls
173 lines (132 loc) · 5.95 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
ARCH ?= x64
MPY_ABI_VERSION ?= 6.3
MPY_DIR ?= ../micropython
MICROPYTHON_BIN ?= micropython
# extmod settings
PORT=unix
BOARD=ESP32_GENERIC_S3
VERSION := $(shell git describe --tags --always)
MPY_DIR_ABS = $(abspath $(MPY_DIR))
C_MODULES_SRC_PATH = $(abspath ./src)
ifeq ($(PORT),unix)
MANIFEST_PATH=$(abspath ./src/manifest_unix.py)
endif
WEBASSEMBLY_MANIFEST_PATH=$(abspath ./src/manifest_webassembly.py)
MODULES_PATH = ./dist/$(ARCH)_$(MPY_ABI_VERSION)
PORT_DIR = ./dist/ports/$(PORT)
PORT_BUILD_DIR=$(MPY_DIR)/ports/$(PORT)/build-$(BOARD)
PORT_DIST_DIR=./dist/ports/$(PORT)/$(BOARD)
UNIX_MICROPYTHON = ./dist/ports/unix/micropython
WEBASSEMBLY_MICROPYTHON = ./dist/ports/webassembly/micropython.mjs
# List of modules
MODULES = emlearn_trees \
emlearn_neighbors \
emlearn_iir \
emlearn_fft \
emlearn_kmeans \
emlearn_iir_q15 \
emlearn_arrayutils \
emlearn_linreg \
emlearn_logreg \
emlearn_cnn_int8 \
emlearn_cnn_fp32
# Generate list of .mpy files
MODULE_MPYS = $(addprefix $(MODULES_PATH)/,$(addsuffix .mpy,$(MODULES)))
# Special cases
emlearn_cnn_int8_SRC = src/tinymaix_cnn
emlearn_cnn_int8_CONFIG = CONFIG=int8
emlearn_cnn_fp32_SRC = src/tinymaix_cnn
emlearn_cnn_fp32_CONFIG = CONFIG=fp32
# Source directories for each module
emlearn_trees_SRC = src/emlearn_trees
emlearn_neighbors_SRC = src/emlearn_neighbors
emlearn_iir_SRC = src/emlearn_iir
emlearn_fft_SRC = src/emlearn_fft
emlearn_kmeans_SRC = src/emlearn_kmeans
emlearn_iir_q15_SRC = src/emlearn_iir_q15
emlearn_arrayutils_SRC = src/emlearn_arrayutils
emlearn_linreg_SRC = src/emlearn_linreg
emlearn_logreg_SRC = src/emlearn_logreg
# Dependencies for each .mpy file: .c, .h, .py files, and Makefile
$(foreach mod,$(MODULES),\
$(eval $(MODULES_PATH)/$(mod).mpy: \
$(wildcard $($(mod)_SRC)/*.c) \
$(wildcard $($(mod)_SRC)/*.h) \
$(wildcard $($(mod)_SRC)/*.py) \
$($(mod)_SRC)/Makefile))
# CNN modules share the same build directory, so they must build sequentially
# Ensure int8 builds after fp32 to avoid race conditions
$(MODULES_PATH)/emlearn_cnn_int8.mpy: $(MODULES_PATH)/emlearn_cnn_fp32.mpy
# Generate list of .mpy files
MODULE_MPYS = $(addprefix $(MODULES_PATH)/,$(addsuffix .mpy,$(MODULES)))
# Build dynamic native module (without forced clean)
$(MODULES_PATH)/%.mpy:
$(MAKE) -C $(or $($(*)_SRC),src/$*) \
ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) CFLAGS_EXTRA=$(CFLAGS_EXTRA) \
V=1 $($(*)_CONFIG) dist
# CNN modules need clean build due to shared build directory
# They must also build sequentially (fp32 first, then int8)
$(MODULES_PATH)/emlearn_cnn_fp32.mpy:
$(MAKE) -C src/tinymaix_cnn \
ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) CFLAGS_EXTRA=$(CFLAGS_EXTRA) \
V=1 CONFIG=fp32 clean
$(MAKE) -C src/tinymaix_cnn \
ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) CFLAGS_EXTRA=$(CFLAGS_EXTRA) \
V=1 CONFIG=fp32 dist
$(MODULES_PATH)/emlearn_cnn_int8.mpy: $(MODULES_PATH)/emlearn_cnn_fp32.mpy
$(MAKE) -C src/tinymaix_cnn \
ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) CFLAGS_EXTRA=$(CFLAGS_EXTRA) \
V=1 CONFIG=int8 clean
$(MAKE) -C src/tinymaix_cnn \
ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) CFLAGS_EXTRA=$(CFLAGS_EXTRA) \
V=1 CONFIG=int8 dist
# Collect test files for dependency tracking
TEST_PY := $(wildcard tests/test_*.py)
check_unix_natmod: $(MODULE_MPYS) $(TEST_PY)
MICROPYPATH=$(MODULES_PATH) $(MICROPYTHON_BIN) tests/test_all.py
$(PORT_DIR):
mkdir -p $@
# Collect all source and build files under src/ for port builds
SRC_C := $(shell find src -name "*.c" 2>/dev/null)
SRC_H := $(shell find src -name "*.h" 2>/dev/null)
SRC_PY := $(shell find src -name "*.py" 2>/dev/null)
SRC_BUILD := src/micropython.cmake src/dynmodule.mk $(wildcard src/*/micropython.mk)
SRC_ALL = $(SRC_C) $(SRC_H) $(SRC_PY) $(SRC_BUILD)
$(UNIX_MICROPYTHON): $(PORT_DIR) $(SRC_ALL) src/manifest_unix.py
$(MAKE) -C $(MPY_DIR)/ports/unix V=1 MICROPY_PY_FFI=0 USER_C_MODULES=$(C_MODULES_SRC_PATH) FROZEN_MANIFEST=$(MANIFEST_PATH) CFLAGS_EXTRA="-Wno-unused-function -Wno-unused-function $(CFLAGS_EXTRA)" -j4
cp $(MPY_DIR)/ports/unix/build-standard/micropython $@
unix: $(UNIX_MICROPYTHON)
$(WEBASSEMBLY_MICROPYTHON): $(PORT_DIR) $(SRC_ALL) src/manifest_webassembly.py
emcc --version
mkdir -p $(PORT_DIR)/../webassembly
$(MAKE) -C $(MPY_DIR)/ports/webassembly VARIANT=pyscript V=1 USER_C_MODULES=$(C_MODULES_SRC_PATH) FROZEN_MANIFEST=$(WEBASSEMBLY_MANIFEST_PATH) CFLAGS_EXTRA="-Wno-unused-function -Wno-unused-function $(CFLAGS_EXTRA)" -j4
cp $(MPY_DIR)/ports/webassembly/build-pyscript/micropython.mjs $@
cp $(MPY_DIR)/ports/webassembly/build-pyscript/micropython.wasm dist/ports/webassembly/
webassembly: $(WEBASSEMBLY_MICROPYTHON)
check_unix: $(UNIX_MICROPYTHON) $(TEST_PY)
$(UNIX_MICROPYTHON) tests/test_all.py -test_cnn
rp2: $(PORT_DIR) $(SRC_ALL) src/manifest_unix.py
$(MAKE) -C $(MPY_DIR)/ports/rp2 V=1 USER_C_MODULES=$(C_MODULES_SRC_PATH)/micropython.cmake FROZEN_MANIFEST=$(MANIFEST_PATH) CFLAGS_EXTRA='-Wno-unused-function -Wno-unused-function' -j4
mkdir -p ./dist/ports/rp2/RPI_PICO
cp -r $(MPY_DIR)/ports/rp2/build-RPI_PICO/firmware* ./dist/ports/rp2/RPI_PICO/
extmod: $(SRC_ALL) src/manifest_unix.py
$(MAKE) -C $(MPY_DIR)/ports/esp32 V=1 BOARD=$(BOARD) USER_C_MODULES=$(C_MODULES_SRC_PATH)/micropython.cmake FROZEN_MANIFEST=$(MANIFEST_PATH) CFLAGS_EXTRA='-Wno-unused-function -Wno-unused-function' -j4
mkdir -p $(PORT_DIST_DIR)
cp -r $(PORT_BUILD_DIR)/firmware* $(PORT_DIST_DIR)
cp -r $(PORT_BUILD_DIR)/micropython* $(PORT_DIST_DIR)
.PHONY: clean unix
clean:
make -C src/emlearn_trees/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean
make -C src/emlearn_neighbors/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean
make -C src/emlearn_iir/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean
make -C src/emlearn_logreg/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean
rm -rf ./dist
RELEASE_NAME = emlearn-micropython-$(VERSION)
# NOTE: does not depend on dist.
release:
mkdir $(RELEASE_NAME)
cp -r dist/* $(RELEASE_NAME)
zip -r $(RELEASE_NAME).zip $(RELEASE_NAME)
#cp $(RELEASE_NAME).zip emlearn-micropython-latest.zip
check: check_unix_natmod
dist: $(MODULE_MPYS)