webassembly: Clean up Makefile and add variant support.

This commit cleans up and generalises the Makefile, adds support for
variants (following the unix port) and adds the "standard" variant as the
default variant.

Signed-off-by: Damien George <damien@micropython.org>
pull/13583/head
Damien George 2023-05-30 13:15:58 +10:00
rodzic 98a8ff7a1a
commit 691cd3a56d
4 zmienionych plików z 82 dodań i 19 usunięć

Wyświetl plik

@ -1,23 +1,67 @@
################################################################################
# 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
CROSS = 0
# 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
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)
JSFLAGS += -s EXPORTED_FUNCTIONS="\
_mp_js_init,\
_mp_js_init_repl,\
_mp_js_do_str,\
_mp_js_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
################################################################################
# Source files and libraries.
SRC_SHARED = $(addprefix shared/,\
runtime/interrupt_char.c \
runtime/stdout_helpers.c \
@ -26,33 +70,41 @@ SRC_SHARED = $(addprefix shared/,\
timeutils/timeutils.c \
)
SRC_C = \
SRC_C += \
main.c \
mphalport.c \
# List of sources for qstr extraction.
SRC_QSTR += $(SRC_C) $(SRC_SHARED)
SRC_JS ?= wrapper.js
OBJ += $(PY_O)
OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
JSFLAGS += -s ASYNCIFY
JSFLAGS += -s EXPORTED_FUNCTIONS="['_mp_js_init', '_mp_js_init_repl', '_mp_js_do_str', '_mp_js_process_char', '_mp_hal_get_interrupt_char', '_mp_sched_keyboard_interrupt']"
JSFLAGS += -s EXPORTED_RUNTIME_METHODS="['ccall', 'cwrap', 'FS']"
JSFLAGS += --js-library library.js
################################################################################
# Main targets.
.PHONY: all min test
all: $(BUILD)/micropython.js
$(BUILD)/micropython.js: $(OBJ) library.js wrapper.js
$(ECHO) "LINK $(BUILD)/firmware.js"
$(Q)emcc $(LDFLAGS) -o $(BUILD)/firmware.js $(OBJ) $(JSFLAGS)
cat wrapper.js $(BUILD)/firmware.js > $@
$(BUILD)/micropython.js: $(OBJ) library.js $(SRC_JS)
$(ECHO) "LINK $@"
$(Q)emcc $(LDFLAGS) -o $@ $(OBJ) $(JSFLAGS)
$(Q)cat $(SRC_JS) >> $@
min: $(BUILD)/micropython.js
uglifyjs $< -c -o $(BUILD)/micropython.min.js
$(BUILD)/micropython.min.js: $(BUILD)/micropython.js
$(TERSER) $< --compress --module -o $@
min: $(BUILD)/micropython.min.js
test: $(BUILD)/micropython.js $(TOP)/tests/run-tests.py
$(eval DIRNAME=ports/$(notdir $(CURDIR)))
cd $(TOP)/tests && MICROPY_MICROPYTHON=../ports/webassembly/node_run.sh ./run-tests.py -j1
################################################################################
# Remaining make rules.
include $(TOP)/py/mkrules.mk

Wyświetl plik

@ -25,17 +25,18 @@
* THE SOFTWARE.
*/
// Options to control how MicroPython is built for this port, overriding
// defaults in py/mpconfig.h.
#include <stdint.h>
#include <stdlib.h> // for malloc, for MICROPY_GC_SPLIT_HEAP_AUTO
// options to control how MicroPython is built
// Variant-specific definitions.
#include "mpconfigvariant.h"
#ifndef MICROPY_CONFIG_ROM_LEVEL
#define MICROPY_CONFIG_ROM_LEVEL (MICROPY_CONFIG_ROM_LEVEL_EXTRA_FEATURES)
// You can disable the built-in MicroPython compiler by setting the following
// config option to 0. If you do this then you won't get a REPL prompt, but you
// will still be able to execute pre-compiled scripts, compiled with mpy-cross.
#define MICROPY_ENABLE_COMPILER (1)
#endif
#define MICROPY_ALLOC_PATH_MAX (256)
#define MICROPY_READER_VFS (MICROPY_VFS)
@ -69,6 +70,13 @@
mp_handle_pending(true); \
} while (0);
// Whether the VM will periodically call mp_js_hook(), which checks for
// interrupt characters on stdin (or equivalent input).
#ifndef MICROPY_VARIANT_ENABLE_JS_HOOK
#define MICROPY_VARIANT_ENABLE_JS_HOOK (0)
#endif
#if MICROPY_VARIANT_ENABLE_JS_HOOK
#define MICROPY_VM_HOOK_COUNT (10)
#define MICROPY_VM_HOOK_INIT static uint vm_hook_divisor = MICROPY_VM_HOOK_COUNT;
#define MICROPY_VM_HOOK_POLL if (--vm_hook_divisor == 0) { \
@ -78,6 +86,7 @@
}
#define MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_POLL
#define MICROPY_VM_HOOK_RETURN MICROPY_VM_HOOK_POLL
#endif
// type definitions for the specific machine

Wyświetl plik

@ -0,0 +1 @@
#define MICROPY_VARIANT_ENABLE_JS_HOOK (1)

Wyświetl plik

@ -0,0 +1 @@
JSFLAGS += -s ASYNCIFY