Skip to content

Commit f8918f4

Browse files
committed
build: Add LVGL JSON generation for enhanced bindings.
Add automatic LVGL API JSON generation to both makefile and CMake build systems: - Generate JSON with LVGL's gen_json.py script for complete API metadata - Pass JSON to gen_mpy.py via -J flag for enhanced callback structure analysis - Add stub generation targets to CMake (delegates to makefile for now) - JSON provides missing structure field information for proper callback binding This ensures the MicroPython binding generator always has access to complete LVGL API metadata for proper callback structure analysis and user_data handling. Signed-off-by: Andrew Leech <andrew@alelec.net>
1 parent 4537376 commit f8918f4

File tree

2 files changed

+103
-13
lines changed

2 files changed

+103
-13
lines changed

micropython.mk

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ ALL_LVGL_SRC = $(shell find $(LVGL_DIR) -type f -name '*.h') $(LV_CONF_PATH)
6666
LVGL_PP = $(BUILD)/lvgl/lvgl.pp.c
6767
LVGL_MPY = $(BUILD)/lvgl/lv_mpy.c
6868
LVGL_MPY_METADATA = $(BUILD)/lvgl/lv_mpy.json
69+
LVGL_JSON = $(BUILD)/lvgl/lvgl_api.json
6970
CFLAGS_USERMOD += $(LV_CFLAGS)
7071

7172
# MAKE SURE LV_CONF_PATH is a STRING
@@ -76,30 +77,68 @@ CFLAGS_USERMOD += -DLV_CONF_PATH='"$(LV_CONF_PATH)"'
7677
# CFLAGS DEBUG
7778
$(info CFLAGS_USERMOD is $(CFLAGS_USERMOD))
7879

79-
$(LVGL_MPY): $(ALL_LVGL_SRC) $(LVGL_BINDING_DIR)/gen/gen_mpy.py
80+
# Generate LVGL API JSON for enhanced binding generation
81+
$(LVGL_JSON): $(ALL_LVGL_SRC)
82+
$(ECHO) "LVGL-JSON $@"
83+
$(Q)mkdir -p $(dir $@)
84+
$(Q)if [ -f "$(LVGL_DIR)/scripts/gen_json/gen_json.py" ]; then \
85+
$(PYTHON) $(LVGL_DIR)/scripts/gen_json/gen_json.py \
86+
--output-path $@ \
87+
--lvgl-config $(LV_CONF_PATH); \
88+
else \
89+
echo '{}' > $@; \
90+
echo "Warning: LVGL JSON generator not found, using empty JSON"; \
91+
fi
92+
93+
$(LVGL_MPY): $(ALL_LVGL_SRC) $(LVGL_BINDING_DIR)/gen/gen_mpy.py $(LVGL_JSON)
8094
$(ECHO) "LVGL-GEN $@"
8195
$(Q)mkdir -p $(dir $@)
8296
$(Q)$(CPP) $(CFLAGS_USERMOD) -DPYCPARSER -x c -I $(LVGL_BINDING_DIR)/pycparser/utils/fake_libc_include $(INC) $(LVGL_DIR)/lvgl.h > $(LVGL_PP)
83-
$(Q)$(PYTHON) $(LVGL_BINDING_DIR)/gen/gen_mpy.py -M lvgl -MP lv -MD $(LVGL_MPY_METADATA) -E $(LVGL_PP) $(LVGL_DIR)/lvgl.h > $@
97+
$(Q)$(PYTHON) $(LVGL_BINDING_DIR)/gen/gen_mpy.py -M lvgl -MP lv -MD $(LVGL_MPY_METADATA) -J $(LVGL_JSON) -E $(LVGL_PP) $(LVGL_DIR)/lvgl.h > $@
8498

85-
# Python stub file generation
86-
LVGL_STUBS_DIR = $(BUILD)/lvgl/stubs
99+
# Python stub file generation and packaging
100+
LVGL_STUBS_TEMPLATE_DIR = $(LVGL_BINDING_DIR)/stubs
101+
LVGL_STUBS_BUILD_DIR = $(BUILD)/lvgl/stubs-package
102+
LVGL_STUBS_DIR = $(LVGL_STUBS_BUILD_DIR)/lvgl_stubs
87103
LVGL_STUBS_FILE = $(LVGL_STUBS_DIR)/lvgl.pyi
104+
LVGL_STUBS_WHEEL = $(LVGL_STUBS_BUILD_DIR)/dist/lvgl_stubs-*.whl
88105

89-
$(LVGL_STUBS_FILE): $(ALL_LVGL_SRC) $(LVGL_BINDING_DIR)/gen/gen_mpy.py
106+
# Copy stubs template and generate stub file
107+
$(LVGL_STUBS_FILE): $(LVGL_MPY_METADATA) $(LVGL_BINDING_DIR)/gen/gen_stubs.py $(LVGL_STUBS_TEMPLATE_DIR)
90108
$(ECHO) "LVGL-STUBS $@"
91-
$(Q)mkdir -p $(dir $@)
92-
$(Q)mkdir -p $(dir $(LVGL_PP))
93-
$(Q)$(CPP) $(CFLAGS_USERMOD) -DPYCPARSER -x c -I $(LVGL_BINDING_DIR)/pycparser/utils/fake_libc_include $(INC) $(LVGL_DIR)/lvgl.h > $(LVGL_PP)
94-
$(Q)$(PYTHON) $(LVGL_BINDING_DIR)/gen/gen_mpy.py -M lvgl -MP lv -MD $(LVGL_MPY_METADATA) -S $(LVGL_STUBS_DIR) -E $(LVGL_PP) $(LVGL_DIR)/lvgl.h > /dev/null
95-
96-
.PHONY: LVGL_MPY lvgl-stubs
109+
$(Q)mkdir -p $(LVGL_STUBS_BUILD_DIR)
110+
$(Q)cp -r $(LVGL_STUBS_TEMPLATE_DIR)/* $(LVGL_STUBS_BUILD_DIR)/
111+
$(Q)# Extract LVGL version and create __version__.py
112+
$(Q)LVGL_MAJOR=$$(grep "LVGL_VERSION_MAJOR" $(LVGL_DIR)/lv_version.h | grep -o '[0-9]\+'); \
113+
LVGL_MINOR=$$(grep "LVGL_VERSION_MINOR" $(LVGL_DIR)/lv_version.h | grep -o '[0-9]\+'); \
114+
LVGL_PATCH=$$(grep "LVGL_VERSION_PATCH" $(LVGL_DIR)/lv_version.h | grep -o '[0-9]\+'); \
115+
LVGL_VERSION="$${LVGL_MAJOR}.$${LVGL_MINOR}.$${LVGL_PATCH}"; \
116+
echo "Setting LVGL stubs version to: $${LVGL_VERSION}"; \
117+
echo "__version__ = \"$${LVGL_VERSION}\"" > $(LVGL_STUBS_DIR)/__version__.py
118+
$(Q)$(PYTHON) $(LVGL_BINDING_DIR)/gen/gen_stubs.py \
119+
--metadata $(LVGL_MPY_METADATA) \
120+
--stubs-dir $(LVGL_STUBS_DIR) \
121+
--lvgl-dir $(LVGL_DIR) \
122+
--module-name lvgl \
123+
--validate
124+
125+
# Build the wheel package
126+
$(LVGL_STUBS_WHEEL): $(LVGL_STUBS_FILE)
127+
$(ECHO) "LVGL-WHEEL $@"
128+
$(Q)cd $(LVGL_STUBS_BUILD_DIR) && $(PYTHON) -m build --wheel
129+
$(Q)touch $@
130+
131+
.PHONY: LVGL_MPY LVGL_STUBS LVGL_STUBS_WHEEL
97132
LVGL_MPY: $(LVGL_MPY)
98133

99134
# Generate Python stub files with documentation (slow - parses 200+ header files)
100-
lvgl-stubs: $(LVGL_STUBS_FILE)
135+
LVGL_STUBS: $(LVGL_STUBS_FILE)
101136
@echo "Generated LVGL Python stub files in $(LVGL_STUBS_DIR)/"
102137

138+
# Generate Python stub files and build distributable wheel package
139+
LVGL_STUBS_WHEEL: $(LVGL_STUBS_WHEEL)
140+
@echo "Built LVGL Python stubs wheel package in $(LVGL_STUBS_BUILD_DIR)/dist/"
141+
103142
CFLAGS_USERMOD += -Wno-unused-function
104143
CFLAGS_EXTRA += -Wno-unused-function
105144
SRC_USERMOD_LIB_C += $(subst $(TOP)/,,$(shell find $(LVGL_DIR)/src $(LVGL_DIR)/examples $(LVGL_GENERIC_DRV_DIR) -type f -name "*.c"))

mkrules_usermod.cmake

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ function(lv_bindings)
2727

2828
set(LV_PP ${LV_OUTPUT}.pp)
2929
set(LV_MPY_METADATA ${LV_OUTPUT}.json)
30+
set(LV_JSON ${LV_OUTPUT}.lvgl_api.json)
3031

3132
# message(STATUS "LV_CONF_PATH=${LV_CONF_PATH}")
3233
# message(STATUS "LV_COMPILE_OPTIONS=${LV_COMPILE_OPTIONS}")
@@ -51,6 +52,35 @@ function(lv_bindings)
5152
COMMAND_EXPAND_LISTS
5253
)
5354

55+
# Generate LVGL API JSON for enhanced binding generation
56+
if(EXISTS ${LVGL_DIR}/scripts/gen_json/gen_json.py)
57+
add_custom_command(
58+
OUTPUT
59+
${LV_JSON}
60+
COMMAND
61+
${Python3_EXECUTABLE} ${LVGL_DIR}/scripts/gen_json/gen_json.py
62+
--output-path ${LV_JSON}
63+
--lvgl-config ${LV_CONF_PATH}
64+
DEPENDS
65+
${LV_INPUT}
66+
${LV_DEPENDS}
67+
COMMENT
68+
"LV_BINDINGS JSON"
69+
VERBATIM
70+
)
71+
else()
72+
add_custom_command(
73+
OUTPUT
74+
${LV_JSON}
75+
COMMAND
76+
${CMAKE_COMMAND} -E echo "{}" > ${LV_JSON}
77+
COMMAND
78+
${CMAKE_COMMAND} -E echo "Warning: LVGL JSON generator not found, using empty JSON"
79+
COMMENT
80+
"LV_BINDINGS JSON (empty)"
81+
)
82+
endif()
83+
5484
# if(ESP_PLATFORM)
5585
# target_compile_options(${COMPONENT_LIB} PRIVATE ${LV_COMPILE_OPTIONS})
5686
# else()
@@ -89,10 +119,11 @@ function(lv_bindings)
89119
OUTPUT
90120
${LV_OUTPUT}
91121
COMMAND
92-
${Python3_EXECUTABLE} ${LV_BINDINGS_DIR}/gen/gen_mpy.py ${LV_GEN_OPTIONS} -DLV_CONF_PATH="${LV_CONF_PATH}" -MD ${LV_MPY_METADATA} -E ${LV_PP_FILTERED} ${LV_INPUT} > ${LV_OUTPUT} || (rm -f ${LV_OUTPUT} && /bin/false)
122+
${Python3_EXECUTABLE} ${LV_BINDINGS_DIR}/gen/gen_mpy.py ${LV_GEN_OPTIONS} -DLV_CONF_PATH="${LV_CONF_PATH}" -MD ${LV_MPY_METADATA} -J ${LV_JSON} -E ${LV_PP_FILTERED} ${LV_INPUT} > ${LV_OUTPUT} || (rm -f ${LV_OUTPUT} && /bin/false)
93123
DEPENDS
94124
${LV_BINDINGS_DIR}/gen/gen_mpy.py
95125
${LV_PP_FILTERED}
126+
${LV_JSON}
96127

97128
COMMENT
98129
"LV_BINDINGS GEN MPY"
@@ -101,6 +132,7 @@ function(lv_bindings)
101132

102133
endfunction()
103134

135+
104136
# Definitions for specific bindings
105137

106138
set(LVGL_DIR ${LV_BINDINGS_DIR}/lvgl)
@@ -128,6 +160,25 @@ function(all_lv_bindings)
128160
-M lvgl -MP lv
129161
)
130162

163+
# LVGL stub generation targets (delegated to makefile for simplicity)
164+
set(LV_MPY_METADATA ${LV_MP}.json)
165+
166+
add_custom_target(lvgl_stubs
167+
COMMAND
168+
${CMAKE_COMMAND} -E echo "Note: For stub generation, use the makefile targets:"
169+
COMMAND
170+
${CMAKE_COMMAND} -E echo " make USER_C_MODULES=path/to/lv_binding_micropython LVGL_STUBS"
171+
COMMENT "LVGL Python stub generation (see makefile)"
172+
)
173+
174+
add_custom_target(lvgl_stubs_wheel
175+
COMMAND
176+
${CMAKE_COMMAND} -E echo "Note: For stub wheel generation, use the makefile targets:"
177+
COMMAND
178+
${CMAKE_COMMAND} -E echo " make USER_C_MODULES=path/to/lv_binding_micropython LVGL_STUBS_WHEEL"
179+
COMMENT "LVGL Python stub wheel generation (see makefile)"
180+
)
181+
131182

132183
# ESPIDF bindings
133184

0 commit comments

Comments
 (0)