micropython/ports/webassembly/Makefile

157 wiersze
3.9 KiB
Makefile

################################################################################
# Initial setup of Makefile environment.
# Select the variant to build for:
ifdef VARIANT_DIR
# Custom variant path - remove trailing slash and get the final component of
# the path as the variant name.
VARIANT ?= $(notdir $(VARIANT_DIR:/=))
else
# If not given on the command line, then default to standard.
VARIANT ?= standard
VARIANT_DIR ?= variants/$(VARIANT)
endif
ifeq ($(wildcard $(VARIANT_DIR)/.),)
$(error Invalid VARIANT specified: $(VARIANT_DIR))
endif
# If the build directory is not given, make it reflect the variant name.
BUILD ?= build-$(VARIANT)
include ../../py/mkenv.mk
include $(VARIANT_DIR)/mpconfigvariant.mk
# Use the default frozen manifest, variants may override this.
FROZEN_MANIFEST ?= variants/manifest.py
# Qstr definitions (must come before including py.mk).
QSTR_DEFS = qstrdefsport.h
# Include py core make definitions.
include $(TOP)/py/py.mk
include $(TOP)/extmod/extmod.mk
################################################################################
# Project specific settings and compiler/linker flags.
CC = emcc
LD = emcc
NODE ?= node
TERSER ?= npx terser
INC += -I.
INC += -I$(TOP)
INC += -I$(BUILD)
INC += -I$(VARIANT_DIR)
CFLAGS += -std=c99 -Wall -Werror -Wdouble-promotion -Wfloat-conversion
CFLAGS += -Os -DNDEBUG
CFLAGS += $(INC)
EXPORTED_FUNCTIONS_EXTRA += ,\
_mp_js_do_exec,\
_mp_js_do_exec_async,\
_mp_js_do_import,\
_mp_js_register_js_module,\
_proxy_c_init,\
_proxy_c_to_js_call,\
_proxy_c_to_js_delete_attr,\
_proxy_c_to_js_dir,\
_proxy_c_to_js_get_array,\
_proxy_c_to_js_get_dict,\
_proxy_c_to_js_get_type,\
_proxy_c_to_js_has_attr,\
_proxy_c_to_js_lookup_attr,\
_proxy_c_to_js_resume,\
_proxy_c_to_js_store_attr,\
_proxy_convert_mp_to_js_obj_cside
EXPORTED_RUNTIME_METHODS_EXTRA += ,\
PATH,\
PATH_FS,\
UTF8ToString,\
getValue,\
lengthBytesUTF8,\
setValue,\
stringToUTF8
JSFLAGS += -s EXPORTED_FUNCTIONS="\
_free,\
_malloc,\
_mp_js_init,\
_mp_js_repl_init,\
_mp_js_repl_process_char,\
_mp_hal_get_interrupt_char,\
_mp_sched_keyboard_interrupt$(EXPORTED_FUNCTIONS_EXTRA)"
JSFLAGS += -s EXPORTED_RUNTIME_METHODS="\
ccall,\
cwrap,\
FS$(EXPORTED_RUNTIME_METHODS_EXTRA)"
JSFLAGS += --js-library library.js
JSFLAGS += -s SUPPORT_LONGJMP=emscripten
JSFLAGS += -s MODULARIZE -s EXPORT_NAME=_createMicroPythonModule
################################################################################
# Source files and libraries.
SRC_SHARED = $(addprefix shared/,\
runtime/interrupt_char.c \
runtime/stdout_helpers.c \
runtime/pyexec.c \
readline/readline.c \
timeutils/timeutils.c \
)
SRC_C += \
lexer_dedent.c \
main.c \
modjs.c \
modjsffi.c \
mphalport.c \
objjsproxy.c \
proxy_c.c \
# List of sources for qstr extraction.
SRC_QSTR += $(SRC_C) $(SRC_SHARED)
SRC_JS += \
api.js \
objpyproxy.js \
proxy_js.js \
OBJ += $(PY_O)
OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
################################################################################
# Main targets.
.PHONY: all repl min test test_min
all: $(BUILD)/micropython.mjs
$(BUILD)/micropython.mjs: $(OBJ) library.js $(SRC_JS)
$(ECHO) "LINK $@"
$(Q)emcc $(LDFLAGS) -o $@ $(OBJ) $(JSFLAGS)
$(Q)cat $(SRC_JS) >> $@
$(BUILD)/micropython.min.mjs: $(BUILD)/micropython.mjs
$(TERSER) $< --compress --module -o $@
repl: $(BUILD)/micropython.mjs
$(NODE) $<
min: $(BUILD)/micropython.min.mjs
test: $(BUILD)/micropython.mjs $(TOP)/tests/run-tests.py
cd $(TOP)/tests && MICROPY_MICROPYTHON_MJS=../ports/webassembly/$< ./run-tests.py --target webassembly
test_min: $(BUILD)/micropython.min.mjs $(TOP)/tests/run-tests.py
cd $(TOP)/tests && MICROPY_MICROPYTHON_MJS=../ports/webassembly/$< ./run-tests.py --target webassembly
################################################################################
# Remaining make rules.
include $(TOP)/py/mkrules.mk