mirror of
https://github.com/micropython/micropython.git
synced 2026-01-14 07:57:17 +01:00
Some checks failed
JavaScript code lint and formatting with Biome / eslint (push) Has been cancelled
Check code formatting / code-formatting (push) Has been cancelled
Check spelling with codespell / codespell (push) Has been cancelled
Build docs / build (push) Has been cancelled
Check examples / embedding (push) Has been cancelled
Package mpremote / build (push) Has been cancelled
.mpy file format and tools / test (push) Has been cancelled
Build ports metadata / build (push) Has been cancelled
alif port / build_alif (alif_ae3_build) (push) Has been cancelled
cc3200 port / build (push) Has been cancelled
esp32 port / build_idf (esp32_build_c2_c5_c6) (push) Has been cancelled
esp32 port / build_idf (esp32_build_cmod_spiram_s2) (push) Has been cancelled
esp32 port / build_idf (esp32_build_p4) (push) Has been cancelled
esp32 port / build_idf (esp32_build_s3_c3) (push) Has been cancelled
esp8266 port / build (push) Has been cancelled
mimxrt port / build (push) Has been cancelled
nrf port / build (push) Has been cancelled
powerpc port / build (push) Has been cancelled
qemu port / build_and_test_arm (bigendian) (push) Has been cancelled
qemu port / build_and_test_arm (sabrelite) (push) Has been cancelled
qemu port / build_and_test_arm (thumb_hardfp) (push) Has been cancelled
qemu port / build_and_test_arm (thumb_softfp) (push) Has been cancelled
qemu port / build_and_test_rv32 (push) Has been cancelled
qemu port / build_and_test_rv64 (push) Has been cancelled
renesas-ra port / build_renesas_ra_board (push) Has been cancelled
rp2 port / build (push) Has been cancelled
samd port / build (push) Has been cancelled
stm32 port / build_stm32 (stm32_misc_build) (push) Has been cancelled
stm32 port / build_stm32 (stm32_nucleo_build) (push) Has been cancelled
stm32 port / build_stm32 (stm32_pyb_build) (push) Has been cancelled
unix port / minimal (push) Has been cancelled
unix port / reproducible (push) Has been cancelled
unix port / standard (push) Has been cancelled
unix port / standard_v2 (push) Has been cancelled
unix port / coverage (push) Has been cancelled
unix port / coverage_32bit (push) Has been cancelled
unix port / nanbox (push) Has been cancelled
unix port / longlong (push) Has been cancelled
unix port / float (push) Has been cancelled
unix port / gil_enabled (push) Has been cancelled
unix port / stackless_clang (push) Has been cancelled
unix port / float_clang (push) Has been cancelled
unix port / settrace_stackless (push) Has been cancelled
unix port / repr_b (push) Has been cancelled
unix port / macos (push) Has been cancelled
unix port / qemu_mips (push) Has been cancelled
unix port / qemu_arm (push) Has been cancelled
unix port / qemu_riscv64 (push) Has been cancelled
unix port / sanitize_address (push) Has been cancelled
unix port / sanitize_undefined (push) Has been cancelled
webassembly port / build (push) Has been cancelled
windows port / build-vs (Debug, true, x64, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Debug, true, x86, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Debug, x64, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Debug, x86, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, true, x64, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, true, x64, dev, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, true, x64, standard, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, true, x64, standard, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, true, x86, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, true, x86, dev, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, true, x86, standard, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, true, x86, standard, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x64, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x64, standard, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x86, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x86, standard, 2022, [17, 18)) (push) Has been cancelled
windows port / build-mingw (i686, mingw32, dev) (push) Has been cancelled
windows port / build-mingw (i686, mingw32, standard) (push) Has been cancelled
windows port / build-mingw (x86_64, mingw64, dev) (push) Has been cancelled
windows port / build-mingw (x86_64, mingw64, standard) (push) Has been cancelled
windows port / cross-build-on-linux (push) Has been cancelled
zephyr port / build (push) Has been cancelled
Python code lint and formatting with ruff / ruff (push) Has been cancelled
This commit lets "tools/mpy_ld.py" store architecture flags in generated
MPY files if explicitly requested, like "mpy-cross" does.
To achieve this, a new command-line option ("--arch-flags") was added to
receive the architecture flags value, accepting the same arguments'
format as "mpy-cross", and performing the same input validation.
The rest of the MPY toolchain was also modified to let the user pass the
arch flags to standard native module makefiles. Given that there's
already a well-established "ARCH" argument, "ARCH_FLAGS" was chosen to
pass the optional flags to "mpy_ld.py".
Finally, documentation was updated to mention the new variable.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
248 lines
7.2 KiB
Makefile
248 lines
7.2 KiB
Makefile
# Makefile fragment for generating native .mpy files from C source
|
|
# MPY_DIR must be set to the top of the MicroPython source tree
|
|
|
|
BUILD ?= build
|
|
|
|
ECHO = @echo
|
|
RM = /bin/rm
|
|
MKDIR = /bin/mkdir
|
|
PYTHON = python3
|
|
MPY_CROSS = $(MPY_DIR)/mpy-cross/build/mpy-cross
|
|
MPY_TOOL = $(PYTHON) $(MPY_DIR)/tools/mpy-tool.py
|
|
MPY_LD = $(PYTHON) $(MPY_DIR)/tools/mpy_ld.py
|
|
|
|
Q = @
|
|
ifeq ("$(origin V)", "command line")
|
|
ifeq ($(V),1)
|
|
Q =
|
|
MPY_LD += '-vvv'
|
|
endif
|
|
endif
|
|
|
|
ARCH_UPPER = $(shell echo $(ARCH) | tr '[:lower:]' '[:upper:]')
|
|
CONFIG_H = $(BUILD)/$(MOD).config.h
|
|
|
|
CFLAGS += -I. -I$(MPY_DIR)
|
|
CFLAGS += -std=c99
|
|
CFLAGS += -Os
|
|
CFLAGS += -Wall -Werror -DNDEBUG
|
|
CFLAGS += -DNO_QSTR
|
|
CFLAGS += -DMICROPY_ENABLE_DYNRUNTIME
|
|
CFLAGS += -DMP_CONFIGFILE='<$(CONFIG_H)>'
|
|
|
|
CFLAGS_ARCH += -fpic -fno-common
|
|
CFLAGS_ARCH += -U_FORTIFY_SOURCE # prevent use of __*_chk libc functions
|
|
#CFLAGS_ARCH += -fdata-sections -ffunction-sections
|
|
|
|
MPY_CROSS_FLAGS += -march=$(ARCH)
|
|
|
|
SRC_O += $(addprefix $(BUILD)/, $(patsubst %.c,%.o,$(filter %.c,$(SRC))) $(patsubst %.S,%.o,$(filter %.S,$(SRC))))
|
|
SRC_MPY += $(addprefix $(BUILD)/, $(patsubst %.py,%.mpy,$(filter %.py,$(SRC))))
|
|
|
|
CLEAN_EXTRA += $(MOD).mpy .mpy_ld_cache
|
|
|
|
################################################################################
|
|
# Architecture configuration
|
|
|
|
ifeq ($(ARCH),x86)
|
|
|
|
# x86
|
|
CROSS =
|
|
CFLAGS_ARCH += -m32 -fno-stack-protector
|
|
MICROPY_FLOAT_IMPL ?= double
|
|
|
|
else ifeq ($(ARCH),x64)
|
|
|
|
# x64
|
|
CROSS =
|
|
CFLAGS_ARCH += -fno-stack-protector
|
|
MICROPY_FLOAT_IMPL ?= double
|
|
|
|
else ifeq ($(ARCH),armv6m)
|
|
|
|
# thumb
|
|
CROSS = arm-none-eabi-
|
|
CFLAGS_ARCH += -mthumb -mcpu=cortex-m0
|
|
MICROPY_FLOAT_IMPL ?= float
|
|
|
|
else ifeq ($(ARCH),armv7m)
|
|
|
|
# thumb
|
|
CROSS = arm-none-eabi-
|
|
CFLAGS_ARCH += -mthumb -mcpu=cortex-m3
|
|
MICROPY_FLOAT_IMPL ?= float
|
|
|
|
else ifeq ($(ARCH),armv7emsp)
|
|
|
|
# thumb
|
|
CROSS = arm-none-eabi-
|
|
CFLAGS_ARCH += -mthumb -mcpu=cortex-m4
|
|
CFLAGS_ARCH += -mfpu=fpv4-sp-d16 -mfloat-abi=hard
|
|
MICROPY_FLOAT_IMPL ?= float
|
|
|
|
else ifeq ($(ARCH),armv7emdp)
|
|
|
|
# thumb
|
|
CROSS = arm-none-eabi-
|
|
CFLAGS_ARCH += -mthumb -mcpu=cortex-m7
|
|
CFLAGS_ARCH += -mfpu=fpv5-d16 -mfloat-abi=hard
|
|
MICROPY_FLOAT_IMPL ?= double
|
|
|
|
else ifeq ($(ARCH),xtensa)
|
|
|
|
# xtensa
|
|
CROSS = xtensa-lx106-elf-
|
|
CFLAGS_ARCH += -mforce-l32
|
|
MICROPY_FLOAT_IMPL ?= none
|
|
|
|
else ifeq ($(ARCH),xtensawin)
|
|
|
|
# xtensawin
|
|
CROSS = xtensa-esp32-elf-
|
|
MICROPY_FLOAT_IMPL ?= float
|
|
|
|
else ifeq ($(ARCH),rv32imc)
|
|
|
|
# rv32imc
|
|
CROSS = riscv64-unknown-elf-
|
|
CFLAGS_ARCH += -march=rv32imac -mabi=ilp32 -mno-relax
|
|
# If Picolibc is available then select it explicitly. Ubuntu 24.04 ships its
|
|
# bare metal RISC-V toolchain with Picolibc rather than Newlib, and the default
|
|
# is "nosys" so a value must be provided. To avoid having per-distro
|
|
# workarounds, always select Picolibc if available.
|
|
PICOLIBC_SPECS := $(shell $(CROSS)gcc --print-file-name=picolibc.specs)
|
|
ifneq ($(PICOLIBC_SPECS),picolibc.specs)
|
|
CFLAGS_ARCH += -specs=$(PICOLIBC_SPECS)
|
|
USE_PICOLIBC := 1
|
|
PICOLIBC_ARCH := rv32imac
|
|
PICOLIBC_ABI := ilp32
|
|
endif
|
|
|
|
MICROPY_FLOAT_IMPL ?= none
|
|
|
|
else ifeq ($(ARCH),rv64imc)
|
|
|
|
# rv64imc
|
|
CROSS = riscv64-unknown-elf-
|
|
CFLAGS_ARCH += -march=rv64imac -mabi=lp64 -mno-relax
|
|
# If Picolibc is available then select it explicitly. Ubuntu 24.04 ships its
|
|
# bare metal RISC-V toolchain with Picolibc rather than Newlib, and the default
|
|
# is "nosys" so a value must be provided. To avoid having per-distro
|
|
# workarounds, always select Picolibc if available.
|
|
PICOLIBC_SPECS := $(shell $(CROSS)gcc --print-file-name=picolibc.specs)
|
|
ifneq ($(PICOLIBC_SPECS),picolibc.specs)
|
|
CFLAGS_ARCH += -specs=$(PICOLIBC_SPECS)
|
|
USE_PICOLIBC := 1
|
|
PICOLIBC_ARCH := rv64imac
|
|
PICOLIBC_ABI := lp64
|
|
endif
|
|
|
|
MICROPY_FLOAT_IMPL ?= none
|
|
|
|
else
|
|
$(error architecture '$(ARCH)' not supported)
|
|
endif
|
|
|
|
ifneq ($(findstring -musl,$(shell $(CROSS)gcc -dumpmachine)),)
|
|
USE_MUSL := 1
|
|
endif
|
|
|
|
MICROPY_FLOAT_IMPL_UPPER = $(shell echo $(MICROPY_FLOAT_IMPL) | tr '[:lower:]' '[:upper:]')
|
|
CFLAGS += $(CFLAGS_ARCH) -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_$(MICROPY_FLOAT_IMPL_UPPER)
|
|
|
|
ifeq ($(LINK_RUNTIME),1)
|
|
# All of these picolibc-specific directives are here to work around a
|
|
# limitation of Ubuntu 22.04's RISC-V bare metal toolchain. In short, the
|
|
# specific version of GCC in use (10.2.0) does not seem to take into account
|
|
# extra paths provided by an explicitly passed specs file when performing name
|
|
# resolution via `--print-file-name`.
|
|
#
|
|
# If Picolibc is used and libc.a fails to resolve, then said file's path will
|
|
# be computed by searching the Picolibc libraries root for a libc.a file in a
|
|
# subdirectory whose path is built using the current `-march` and `-mabi`
|
|
# flags that are passed to GCC. The `PICOLIBC_ROOT` environment variable is
|
|
# checked to override the starting point for the library file search, and if
|
|
# it is not set then the default value is used, assuming that this is running
|
|
# on an Ubuntu 22.04 machine.
|
|
#
|
|
# This should be revised when the CI base image is updated to a newer Ubuntu
|
|
# version (that hopefully contains a newer RISC-V compiler) or to another Linux
|
|
# distribution.
|
|
ifeq ($(USE_PICOLIBC),1)
|
|
LIBM_NAME := libc.a
|
|
else ifeq ($(USE_MUSL),1)
|
|
LIBM_NAME := libc.a
|
|
else
|
|
LIBM_NAME := libm.a
|
|
endif
|
|
LIBGCC_PATH := $(realpath $(shell $(CROSS)gcc $(CFLAGS) --print-libgcc-file-name))
|
|
LIBM_PATH := $(realpath $(shell $(CROSS)gcc $(CFLAGS) --print-file-name=$(LIBM_NAME)))
|
|
ifeq ($(USE_PICOLIBC),1)
|
|
ifeq ($(LIBM_PATH),)
|
|
# The CROSS toolchain prefix usually ends with a dash, but that may not be
|
|
# always the case. If the prefix ends with a dash it has to be taken out as
|
|
# Picolibc's architecture directory won't have it in its name. GNU Make does
|
|
# not have any facility to perform character-level text manipulation so we
|
|
# shell out to sed.
|
|
CROSS_PREFIX := $(shell echo $(CROSS) | sed -e 's/-$$//')
|
|
PICOLIBC_ROOT ?= /usr/lib/picolibc/$(CROSS_PREFIX)/lib
|
|
LIBM_PATH := $(PICOLIBC_ROOT)/$(PICOLIBC_ARCH)/$(PICOLIBC_ABI)/$(LIBM_NAME)
|
|
endif
|
|
endif
|
|
MPY_LD_FLAGS += $(addprefix -l, $(LIBGCC_PATH) $(LIBM_PATH))
|
|
endif
|
|
ifneq ($(MPY_EXTERN_SYM_FILE),)
|
|
MPY_LD_FLAGS += --externs "$(realpath $(MPY_EXTERN_SYM_FILE))"
|
|
endif
|
|
ifneq ($(ARCH_FLAGS),)
|
|
MPY_LD_FLAGS += --arch-flags "$(ARCH_FLAGS)"
|
|
endif
|
|
|
|
CFLAGS += $(CFLAGS_EXTRA)
|
|
|
|
################################################################################
|
|
# Build rules
|
|
|
|
.PHONY: all clean
|
|
|
|
all: $(MOD).mpy
|
|
|
|
clean:
|
|
$(RM) -rf $(BUILD) $(CLEAN_EXTRA)
|
|
|
|
# Create build destination directories first
|
|
BUILD_DIRS = $(sort $(dir $(CONFIG_H) $(SRC_O) $(SRC_MPY)))
|
|
$(CONFIG_H) $(SRC_O) $(SRC_MPY): | $(BUILD_DIRS)
|
|
$(BUILD_DIRS):
|
|
$(Q)$(MKDIR) -p $@
|
|
|
|
# Preprocess all source files to generate $(CONFIG_H)
|
|
$(CONFIG_H): $(SRC)
|
|
$(ECHO) "GEN $@"
|
|
$(Q)$(MPY_LD) --arch $(ARCH) --preprocess -o $@ $^
|
|
|
|
# Build .o from .c source files
|
|
$(BUILD)/%.o: %.c $(CONFIG_H) Makefile
|
|
$(ECHO) "CC $<"
|
|
$(Q)$(CROSS)gcc $(CFLAGS) -o $@ -c $<
|
|
|
|
# Build .o from .S source files
|
|
$(BUILD)/%.o: %.S $(CONFIG_H) Makefile
|
|
$(ECHO) "AS $<"
|
|
$(Q)$(CROSS)gcc $(CFLAGS) -o $@ -c $<
|
|
|
|
# Build .mpy from .py source files
|
|
$(BUILD)/%.mpy: %.py
|
|
$(ECHO) "MPY $<"
|
|
$(Q)$(MPY_CROSS) $(MPY_CROSS_FLAGS) -o $@ $<
|
|
|
|
# Build native .mpy from object files
|
|
$(BUILD)/$(MOD).native.mpy: $(SRC_O)
|
|
$(ECHO) "LINK $<"
|
|
$(Q)$(MPY_LD) --arch $(ARCH) --qstrs $(CONFIG_H) $(MPY_LD_FLAGS) -o $@ $^
|
|
|
|
# Build final .mpy from all intermediate .mpy files
|
|
$(MOD).mpy: $(BUILD)/$(MOD).native.mpy $(SRC_MPY)
|
|
$(ECHO) "GEN $@"
|
|
$(Q)$(MPY_TOOL) --merge -o $@ $^
|