summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorAndrew Leech <andrew.leech@planetinnovation.com.au>2018-12-12 16:50:55 +1100
committerDamien George <damien.p.george@gmail.com>2019-03-08 22:58:42 +1100
commit89ff506513d52c0c415b2cf45335d60cefac527d (patch)
tree6929b54bd0f73994ccfdb09523186b7e6b40cda6 /py
parent2e516074daee76fb3e0710a893a0f40532bb3252 (diff)
py: Update and rework build system for including external C modules.
How to use this feature is documented in docs/develop/cmodules.rst.
Diffstat (limited to 'py')
-rw-r--r--py/mkenv.mk1
-rw-r--r--py/mkrules.mk17
-rw-r--r--py/objmodule.c2
-rw-r--r--py/py.mk19
4 files changed, 23 insertions, 16 deletions
diff --git a/py/mkenv.mk b/py/mkenv.mk
index 5f4b11b6b..87e92ec6f 100644
--- a/py/mkenv.mk
+++ b/py/mkenv.mk
@@ -61,7 +61,6 @@ 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 65d86834e..caa9527c7 100644
--- a/py/mkrules.mk
+++ b/py/mkrules.mk
@@ -20,12 +20,12 @@ endif
# can be located. By following this scheme, it allows a single build rule
# to be used to compile all .c files.
-vpath %.S . $(TOP)
+vpath %.S . $(TOP) $(USER_C_MODULES)
$(BUILD)/%.o: %.S
$(ECHO) "CC $<"
$(Q)$(CC) $(CFLAGS) -c -o $@ $<
-vpath %.s . $(TOP)
+vpath %.s . $(TOP) $(USER_C_MODULES)
$(BUILD)/%.o: %.s
$(ECHO) "AS $<"
$(Q)$(AS) -o $@ $<
@@ -42,14 +42,14 @@ $(Q)$(CC) $(CFLAGS) -c -MD -o $@ $<
$(RM) -f $(@:.o=.d)
endef
-vpath %.c . $(TOP)
+vpath %.c . $(TOP) $(USER_C_MODULES)
$(BUILD)/%.o: %.c
$(call compile_c)
QSTR_GEN_EXTRA_CFLAGS += -DNO_QSTR
QSTR_GEN_EXTRA_CFLAGS += -I$(BUILD)/tmp
-vpath %.c . $(TOP)
+vpath %.c . $(TOP) $(USER_C_MODULES)
$(BUILD)/%.pp: %.c
$(ECHO) "PreProcess $<"
@@ -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 USER_C_MODULES=
+ $(Q)$(MAKE) -C $(TOP)/mpy-cross
# 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,13 +123,6 @@ $(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 04d210260..9191c73ec 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -31,6 +31,8 @@
#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 ad7d12204..0fbc9f14b 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -131,9 +131,20 @@ 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
+# pre-define USERMOD variables as expanded so that variables are immediate
+# expanded as they're added to them
+SRC_USERMOD :=
+CFLAGS_USERMOD :=
+LDFLAGS_USERMOD :=
+$(foreach module, $(wildcard $(USER_C_MODULES)/*/micropython.mk), \
+ $(eval USERMOD_DIR = $(patsubst %/,%,$(dir $(module))))\
+ $(info Including User C Module from $(USERMOD_DIR))\
+ $(eval include $(module))\
+)
+
+SRC_MOD += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD))
+CFLAGS_MOD += $(CFLAGS_USERMOD)
+LDFLAGS_MOD += $(LDFLAGS_USERMOD)
endif
# py object files
@@ -335,6 +346,8 @@ $(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER
@$(ECHO) "GEN $@"
$(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
+SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
+
# Force nlr code to always be compiled with space-saving optimisation so
# that the function preludes are of a minimal and predictable form.
$(PY_BUILD)/nlr%.o: CFLAGS += -Os