summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorAyke van Laethem <aykevanlaethem@gmail.com>2018-06-14 15:57:29 +0200
committerDamien George <damien.p.george@gmail.com>2019-03-08 22:49:00 +1100
commit2e516074daee76fb3e0710a893a0f40532bb3252 (patch)
treed871d641c10aff22e3d80ad4711310c4b7be4b31 /py
parentcf22f4793cb04e8e63a0d11f479a69c9be6c93ba (diff)
downloadmicropython-2e516074daee76fb3e0710a893a0f40532bb3252.tar.gz
micropython-2e516074daee76fb3e0710a893a0f40532bb3252.zip
py: Implement a module system for external, user C modules.
This system makes it a lot easier to include external libraries as static, native modules in MicroPython. Simply pass USER_C_MODULES (like FROZEN_MPY_DIR) as a make parameter.
Diffstat (limited to 'py')
-rw-r--r--py/mkenv.mk1
-rw-r--r--py/mkrules.mk9
-rw-r--r--py/objmodule.c2
-rw-r--r--py/py.mk9
4 files changed, 17 insertions, 4 deletions
diff --git a/py/mkenv.mk b/py/mkenv.mk
index 87e92ec6f9..5f4b11b6be 100644
--- a/py/mkenv.mk
+++ b/py/mkenv.mk
@@ -61,6 +61,7 @@ endif
MAKE_FROZEN = $(PYTHON) $(TOP)/tools/make-frozen.py
MPY_CROSS = $(TOP)/mpy-cross/mpy-cross
MPY_TOOL = $(PYTHON) $(TOP)/tools/mpy-tool.py
+GEN_CMODULES = $(PYTHON) $(TOP)/tools/gen-cmodules.py
all:
.PHONY: all
diff --git a/py/mkrules.mk b/py/mkrules.mk
index 30ac520aa1..65d86834ef 100644
--- a/py/mkrules.mk
+++ b/py/mkrules.mk
@@ -105,7 +105,7 @@ endif
ifneq ($(FROZEN_MPY_DIR),)
# to build the MicroPython cross compiler
$(TOP)/mpy-cross/mpy-cross: $(TOP)/py/*.[ch] $(TOP)/mpy-cross/*.[ch] $(TOP)/ports/windows/fmode.c
- $(Q)$(MAKE) -C $(TOP)/mpy-cross
+ $(Q)$(MAKE) -C $(TOP)/mpy-cross USER_C_MODULES=
# make a list of all the .py files that need compiling and freezing
FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py' | $(SED) -e 's=^$(FROZEN_MPY_DIR)/==')
@@ -123,6 +123,13 @@ $(BUILD)/frozen_mpy.c: $(FROZEN_MPY_MPY_FILES) $(BUILD)/genhdr/qstrdefs.generate
$(Q)$(MPY_TOOL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h $(FROZEN_MPY_MPY_FILES) > $@
endif
+# to build a list of modules for py/objmodule.c.
+ifneq ($(USER_C_MODULES),)
+$(BUILD)/genhdr/cmodules.h: | $(HEADER_BUILD)/mpversion.h
+ @$(ECHO) "GEN $@"
+ $(Q)$(GEN_CMODULES) $(USER_C_MODULES) > $@
+endif
+
ifneq ($(PROG),)
# Build a standalone executable (unix does this)
diff --git a/py/objmodule.c b/py/objmodule.c
index 9191c73ec3..04d210260d 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -31,8 +31,6 @@
#include "py/runtime.h"
#include "py/builtin.h"
-#include "genhdr/moduledefs.h"
-
STATIC void module_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
(void)kind;
mp_obj_module_t *self = MP_OBJ_TO_PTR(self_in);
diff --git a/py/py.mk b/py/py.mk
index 85e9072d7c..ad7d122048 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -129,6 +129,13 @@ $(BUILD)/$(BTREE_DIR)/%.o: CFLAGS += -Wno-old-style-definition -Wno-sign-compare
$(BUILD)/extmod/modbtree.o: CFLAGS += $(BTREE_DEFS)
endif
+# External modules written in C.
+ifneq ($(USER_C_MODULES),)
+CFLAGS_MOD += -DMICROPY_CMODULES_INCLUDE_H='"genhdr/cmodules.h"'
+include $(USER_C_MODULES)/*/micropython.mk
+SRC_QSTR += $(BUILD)/genhdr/cmodules.h
+endif
+
# py object files
PY_CORE_O_BASENAME = $(addprefix py/,\
mpstate.o \
@@ -300,7 +307,7 @@ endif
# Sources that may contain qstrings
SRC_QSTR_IGNORE = py/nlr%
-SRC_QSTR = $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
+SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
# Anything that depends on FORCE will be considered out-of-date
FORCE: