@@ -50,51 +50,100 @@ emlearn_cnn_int8_CONFIG = CONFIG=int8
5050emlearn_cnn_fp32_SRC = src/tinymaix_cnn
5151emlearn_cnn_fp32_CONFIG = CONFIG=fp32
5252
53+ # Source directories for each module
54+ emlearn_trees_SRC = src/emlearn_trees
55+ emlearn_neighbors_SRC = src/emlearn_neighbors
56+ emlearn_iir_SRC = src/emlearn_iir
57+ emlearn_fft_SRC = src/emlearn_fft
58+ emlearn_kmeans_SRC = src/emlearn_kmeans
59+ emlearn_iir_q15_SRC = src/emlearn_iir_q15
60+ emlearn_arrayutils_SRC = src/emlearn_arrayutils
61+ emlearn_linreg_SRC = src/emlearn_linreg
62+ emlearn_logreg_SRC = src/emlearn_logreg
63+
64+ # Dependencies for each .mpy file: .c, .h, .py files, and Makefile
65+ $(foreach mod,$(MODULES),\
66+ $(eval $(MODULES_PATH ) /$(mod ) .mpy : \
67+ $(wildcard $($(mod)_SRC)/*.c) \
68+ $(wildcard $($(mod)_SRC)/*.h) \
69+ $(wildcard $($(mod)_SRC)/*.py) \
70+ $($(mod)_SRC)/Makefile))
71+
72+ # CNN modules share the same build directory, so they must build sequentially
73+ # Ensure int8 builds after fp32 to avoid race conditions
74+ $(MODULES_PATH ) /emlearn_cnn_int8.mpy : $(MODULES_PATH ) /emlearn_cnn_fp32.mpy
75+
5376# Generate list of .mpy files
5477MODULE_MPYS = $(addprefix $(MODULES_PATH ) /,$(addsuffix .mpy,$(MODULES ) ) )
5578
56- # Build dynamic native module
57- # defaults to
79+ # Build dynamic native module (without forced clean)
5880$(MODULES_PATH ) /% .mpy :
59- make -C $(or $($(* ) _SRC) ,src/$* ) \
60- ARCH=$(ARCH ) MPY_DIR=$(MPY_DIR_ABS ) CFLAGS_EXTRA=${CFLAGS_EXTRA} \
61- V=1 $($(* ) _CONFIG) clean dist
62-
63- check_unix_natmod : $(MODULE_MPYS )
81+ $(MAKE ) -C $(or $($(* ) _SRC) ,src/$* ) \
82+ ARCH=$(ARCH ) MPY_DIR=$(MPY_DIR_ABS ) CFLAGS_EXTRA=$(CFLAGS_EXTRA ) \
83+ V=1 $($(* ) _CONFIG) dist
84+
85+ # CNN modules need clean build due to shared build directory
86+ # They must also build sequentially (fp32 first, then int8)
87+ $(MODULES_PATH ) /emlearn_cnn_fp32.mpy :
88+ $(MAKE ) -C src/tinymaix_cnn \
89+ ARCH=$(ARCH ) MPY_DIR=$(MPY_DIR_ABS ) CFLAGS_EXTRA=$(CFLAGS_EXTRA ) \
90+ V=1 CONFIG=fp32 clean
91+ $(MAKE ) -C src/tinymaix_cnn \
92+ ARCH=$(ARCH ) MPY_DIR=$(MPY_DIR_ABS ) CFLAGS_EXTRA=$(CFLAGS_EXTRA ) \
93+ V=1 CONFIG=fp32 dist
94+
95+ $(MODULES_PATH ) /emlearn_cnn_int8.mpy : $(MODULES_PATH ) /emlearn_cnn_fp32.mpy
96+ $(MAKE ) -C src/tinymaix_cnn \
97+ ARCH=$(ARCH ) MPY_DIR=$(MPY_DIR_ABS ) CFLAGS_EXTRA=$(CFLAGS_EXTRA ) \
98+ V=1 CONFIG=int8 clean
99+ $(MAKE ) -C src/tinymaix_cnn \
100+ ARCH=$(ARCH ) MPY_DIR=$(MPY_DIR_ABS ) CFLAGS_EXTRA=$(CFLAGS_EXTRA ) \
101+ V=1 CONFIG=int8 dist
102+
103+ # Collect test files for dependency tracking
104+ TEST_PY := $(wildcard tests/test_* .py)
105+
106+ check_unix_natmod : $(MODULE_MPYS ) $(TEST_PY )
64107 MICROPYPATH=$(MODULES_PATH ) $(MICROPYTHON_BIN ) tests/test_all.py
65108
66109$(PORT_DIR ) :
67110 mkdir -p $@
68111
69- $(UNIX_MICROPYTHON ) : $(PORT_DIR )
70- 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
112+ # Collect all source and build files under src/ for port builds
113+ SRC_C := $(shell find src -name "* .c" 2>/dev/null)
114+ SRC_H := $(shell find src -name "* .h" 2>/dev/null)
115+ SRC_PY := $(shell find src -name "* .py" 2>/dev/null)
116+ SRC_BUILD := src/micropython.cmake src/dynmodule.mk $(wildcard src/* /micropython.mk)
117+ SRC_ALL = $(SRC_C ) $(SRC_H ) $(SRC_PY ) $(SRC_BUILD )
118+
119+ $(UNIX_MICROPYTHON ) : $(PORT_DIR ) $(SRC_ALL ) src/manifest_unix.py
120+ $(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
71121 cp $(MPY_DIR ) /ports/unix/build-standard/micropython $@
72122
73123unix : $(UNIX_MICROPYTHON )
74124
75- $(WEBASSEMBLY_MICROPYTHON ) : $(PORT_DIR )
125+ $(WEBASSEMBLY_MICROPYTHON ) : $(PORT_DIR ) $( SRC_ALL ) src/manifest_webassembly.py
76126 emcc --version
77127 mkdir -p $(PORT_DIR ) /../webassembly
78- 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
128+ $( 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
79129 cp $(MPY_DIR ) /ports/webassembly/build-pyscript/micropython.mjs $@
80130 cp $(MPY_DIR ) /ports/webassembly/build-pyscript/micropython.wasm dist/ports/webassembly/
81131
82132
83133webassembly : $(WEBASSEMBLY_MICROPYTHON )
84134
85135
86- check_unix : $(UNIX_MICROPYTHON )
87- $(UNIX_MICROPYTHON ) tests/test_all.py test_iir,test_fft,test_arrayutils,test_linreg,test_logreg
88- # TODO: enable more modules
136+ check_unix : $(UNIX_MICROPYTHON ) $(TEST_PY )
137+ $(UNIX_MICROPYTHON ) tests/test_all.py -test_cnn
89138
90- rp2 : $(PORT_DIR )
91- 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
139+ rp2 : $(PORT_DIR ) $( SRC_ALL ) src/manifest_unix.py
140+ $( 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
92141 mkdir -p ./dist/ports/rp2/RPI_PICO
93142 cp -r $(MPY_DIR ) /ports/rp2/build-RPI_PICO/firmware* ./dist/ports/rp2/RPI_PICO/
94143
95144
96- extmod :
97- 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
145+ extmod : $( SRC_ALL ) src/manifest_unix.py
146+ $( 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
98147 mkdir -p $(PORT_DIST_DIR )
99148 cp -r $(PORT_BUILD_DIR ) /firmware* $(PORT_DIST_DIR )
100149 cp -r $(PORT_BUILD_DIR ) /micropython* $(PORT_DIST_DIR )
0 commit comments