2014-01-07 09:54:15 -05:00
|
|
|
# where py object files go (they have a name prefix to prevent filename clashes)
|
2014-01-24 04:05:30 -05:00
|
|
|
PY_BUILD = $(BUILD)/py
|
2014-01-07 09:54:15 -05:00
|
|
|
|
2014-04-16 17:10:33 -04:00
|
|
|
# where autogenerated header files go
|
2014-04-17 13:03:27 -04:00
|
|
|
HEADER_BUILD = $(BUILD)/genhdr
|
2014-01-21 16:40:13 -05:00
|
|
|
|
2014-04-16 17:10:33 -04:00
|
|
|
# file containing qstr defs for the core Python bit
|
2014-01-21 16:40:13 -05:00
|
|
|
PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h
|
|
|
|
|
2020-11-19 17:23:35 -05:00
|
|
|
TRANSLATION ?= en_US
|
2018-07-31 19:53:54 -04:00
|
|
|
|
2016-03-16 03:47:40 -04:00
|
|
|
# If qstr autogeneration is not disabled we specify the output header
|
|
|
|
# for all collected qstrings.
|
|
|
|
ifneq ($(QSTR_AUTOGEN_DISABLE),1)
|
py: Add rules for automated extraction of qstrs from sources.
- add template rule that converts a specified source file into a qstring file
- add special rule for generating a central header that contains all
extracted/autogenerated strings - defined by QSTR_DEFS_COLLECTED
variable. Each platform appends a list of sources that may contain
qstrings into a new build variable: SRC_QSTR. Any autogenerated
prerequisities are should be appened to SRC_QSTR_AUTO_DEPS variable.
- remove most qstrings from py/qstrdefs, keep only qstrings that
contain special characters - these cannot be easily detected in the
sources without additional annotations
- remove most manual qstrdefs, use qstrdef autogen for: py, cc3200,
stmhal, teensy, unix, windows, pic16bit:
- remove all micropython generic qstrdefs except for the special strings that contain special characters (e.g. /,+,<,> etc.)
- remove all port specific qstrdefs except for special strings
- append sources for qstr generation in platform makefiles (SRC_QSTR)
2016-03-10 04:22:41 -05:00
|
|
|
QSTR_DEFS_COLLECTED = $(HEADER_BUILD)/qstrdefs.collected.h
|
2016-03-16 03:47:40 -04:00
|
|
|
endif
|
py: Add rules for automated extraction of qstrs from sources.
- add template rule that converts a specified source file into a qstring file
- add special rule for generating a central header that contains all
extracted/autogenerated strings - defined by QSTR_DEFS_COLLECTED
variable. Each platform appends a list of sources that may contain
qstrings into a new build variable: SRC_QSTR. Any autogenerated
prerequisities are should be appened to SRC_QSTR_AUTO_DEPS variable.
- remove most qstrings from py/qstrdefs, keep only qstrings that
contain special characters - these cannot be easily detected in the
sources without additional annotations
- remove most manual qstrdefs, use qstrdef autogen for: py, cc3200,
stmhal, teensy, unix, windows, pic16bit:
- remove all micropython generic qstrdefs except for the special strings that contain special characters (e.g. /,+,<,> etc.)
- remove all port specific qstrdefs except for special strings
- append sources for qstr generation in platform makefiles (SRC_QSTR)
2016-03-10 04:22:41 -05:00
|
|
|
|
2021-04-23 15:26:42 -04:00
|
|
|
# Any files listed by these variables will cause a full regeneration of qstrs
|
|
|
|
# DEPENDENCIES: included in qstr processing; REQUIREMENTS: not included
|
2018-06-09 01:23:13 -04:00
|
|
|
QSTR_GLOBAL_DEPENDENCIES += $(PY_SRC)/mpconfig.h mpconfigport.h
|
2021-04-23 15:26:42 -04:00
|
|
|
QSTR_GLOBAL_REQUIREMENTS += $(HEADER_BUILD)/mpversion.h
|
2018-06-09 01:23:13 -04:00
|
|
|
|
2014-04-23 19:59:43 -04:00
|
|
|
# some code is performance bottleneck and compiled with other optimization options
|
2020-12-14 18:57:31 -05:00
|
|
|
CSUPEROPT = -O3
|
2014-04-23 19:59:43 -04:00
|
|
|
|
2019-10-22 20:56:37 -04:00
|
|
|
# Enable building 32-bit code on 64-bit host.
|
|
|
|
ifeq ($(MICROPY_FORCE_32BIT),1)
|
|
|
|
CC += -m32
|
|
|
|
CXX += -m32
|
|
|
|
LD += -m32
|
|
|
|
endif
|
|
|
|
|
2018-06-14 09:57:29 -04:00
|
|
|
# External modules written in C.
|
|
|
|
ifneq ($(USER_C_MODULES),)
|
2019-08-27 02:37:43 -04:00
|
|
|
# pre-define USERMOD variables as expanded so that variables are immediate
|
2018-12-12 00:50:55 -05:00
|
|
|
# expanded as they're added to them
|
2019-08-27 02:37:43 -04:00
|
|
|
SRC_USERMOD :=
|
2020-10-08 10:44:55 -04:00
|
|
|
SRC_USERMOD_CXX :=
|
2018-12-12 00:50:55 -05:00
|
|
|
CFLAGS_USERMOD :=
|
2020-10-08 10:44:55 -04:00
|
|
|
CXXFLAGS_USERMOD :=
|
2018-12-12 00:50:55 -05:00
|
|
|
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))
|
2020-10-08 10:44:55 -04:00
|
|
|
SRC_MOD_CXX += $(patsubst $(USER_C_MODULES)/%.cpp,%.cpp,$(SRC_USERMOD_CXX))
|
2018-12-12 00:50:55 -05:00
|
|
|
CFLAGS_MOD += $(CFLAGS_USERMOD)
|
2020-10-08 10:44:55 -04:00
|
|
|
CXXFLAGS_MOD += $(CXXFLAGS_USERMOD)
|
2018-12-12 00:50:55 -05:00
|
|
|
LDFLAGS_MOD += $(LDFLAGS_USERMOD)
|
2016-06-14 17:52:45 -04:00
|
|
|
endif
|
|
|
|
|
2020-03-17 10:33:03 -04:00
|
|
|
ifeq ($(CIRCUITPY_ULAB),1)
|
2021-04-02 14:07:55 -04:00
|
|
|
ULAB_SRCS := $(shell find $(TOP)/extmod/ulab/code -type f -name "*.c")
|
|
|
|
SRC_MOD += $(patsubst $(TOP)/%,%,$(ULAB_SRCS))
|
2021-04-01 15:06:52 -04:00
|
|
|
CFLAGS_MOD += -DCIRCUITPY_ULAB=1 -DMODULE_ULAB_ENABLED=1 -iquote $(TOP)/extmod/ulab/code
|
2020-11-15 12:48:53 -05:00
|
|
|
$(BUILD)/extmod/ulab/code/%.o: CFLAGS += -Wno-missing-declarations -Wno-missing-prototypes -Wno-unused-parameter -Wno-float-equal -Wno-sign-compare -Wno-cast-align -Wno-shadow -DCIRCUITPY
|
2020-02-04 11:24:37 -05:00
|
|
|
endif
|
|
|
|
|
2014-01-07 09:54:15 -05:00
|
|
|
# py object files
|
2018-02-21 19:32:31 -05:00
|
|
|
PY_CORE_O_BASENAME = $(addprefix py/,\
|
2015-01-01 18:30:53 -05:00
|
|
|
mpstate.o \
|
2017-12-28 00:46:30 -05:00
|
|
|
nlr.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
nlrx86.o \
|
|
|
|
nlrx64.o \
|
|
|
|
nlrthumb.o \
|
2021-04-23 15:26:42 -04:00
|
|
|
nlrpowerpc.o \
|
2014-11-27 15:29:33 -05:00
|
|
|
nlrxtensa.o \
|
2014-04-16 17:16:45 -04:00
|
|
|
nlrsetjmp.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
malloc.o \
|
2014-01-07 10:20:33 -05:00
|
|
|
gc.o \
|
2018-01-23 19:22:05 -05:00
|
|
|
gc_long_lived.o \
|
py: Introduce a Python stack for scoped allocation.
This patch introduces the MICROPY_ENABLE_PYSTACK option (disabled by
default) which enables a "Python stack" that allows to allocate and free
memory in a scoped, or Last-In-First-Out (LIFO) way, similar to alloca().
A new memory allocation API is introduced along with this Py-stack. It
includes both "local" and "nonlocal" LIFO allocation. Local allocation is
intended to be equivalent to using alloca(), whereby the same function must
free the memory. Nonlocal allocation is where another function may free
the memory, so long as it's still LIFO.
Follow-up patches will convert all uses of alloca() and VLA to the new
scoped allocation API. The old behaviour (using alloca()) will still be
available, but when MICROPY_ENABLE_PYSTACK is enabled then alloca() is no
longer required or used.
The benefits of enabling this option are (or will be once subsequent
patches are made to convert alloca()/VLA):
- Toolchains without alloca() can use this feature to obtain correct and
efficient scoped memory allocation (compared to using the heap instead
of alloca(), which is slower).
- Even if alloca() is available, enabling the Py-stack gives slightly more
efficient use of stack space when calling nested Python functions, due to
the way that compilers implement alloca().
- Enabling the Py-stack with the stackless mode allows for even more
efficient stack usage, as well as retaining high performance (because the
heap is no longer used to build and destroy stackless code states).
- With Py-stack and stackless enabled, Python-calling-Python is no longer
recursive in the C mp_execute_bytecode function.
The micropython.pystack_use() function is included to measure usage of the
Python stack.
2017-11-26 07:28:40 -05:00
|
|
|
pystack.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
qstr.o \
|
|
|
|
vstr.o \
|
2015-04-09 18:56:15 -04:00
|
|
|
mpprint.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
unicode.o \
|
2014-02-22 14:25:23 -05:00
|
|
|
mpz.o \
|
2016-11-16 00:04:57 -05:00
|
|
|
reader.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
lexer.o \
|
|
|
|
parse.o \
|
|
|
|
scope.o \
|
|
|
|
compile.o \
|
|
|
|
emitcommon.o \
|
|
|
|
emitbc.o \
|
2016-11-27 17:24:50 -05:00
|
|
|
asmbase.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
asmx64.o \
|
|
|
|
emitnx64.o \
|
2014-09-06 18:06:36 -04:00
|
|
|
asmx86.o \
|
|
|
|
emitnx86.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
asmthumb.o \
|
|
|
|
emitnthumb.o \
|
|
|
|
emitinlinethumb.o \
|
2014-08-16 16:55:53 -04:00
|
|
|
asmarm.o \
|
|
|
|
emitnarm.o \
|
2016-12-09 00:39:39 -05:00
|
|
|
asmxtensa.o \
|
|
|
|
emitnxtensa.o \
|
py: Add inline Xtensa assembler.
This patch adds the MICROPY_EMIT_INLINE_XTENSA option, which, when
enabled, allows the @micropython.asm_xtensa decorator to be used.
The following opcodes are currently supported (ax is a register, a0-a15):
ret_n()
callx0(ax)
j(label)
jx(ax)
beqz(ax, label)
bnez(ax, label)
mov(ax, ay)
movi(ax, imm) # imm can be full 32-bit, uses l32r if needed
and_(ax, ay, az)
or_(ax, ay, az)
xor(ax, ay, az)
add(ax, ay, az)
sub(ax, ay, az)
mull(ax, ay, az)
l8ui(ax, ay, imm)
l16ui(ax, ay, imm)
l32i(ax, ay, imm)
s8i(ax, ay, imm)
s16i(ax, ay, imm)
s32i(ax, ay, imm)
l16si(ax, ay, imm)
addi(ax, ay, imm)
ball(ax, ay, label)
bany(ax, ay, label)
bbc(ax, ay, label)
bbs(ax, ay, label)
beq(ax, ay, label)
bge(ax, ay, label)
bgeu(ax, ay, label)
blt(ax, ay, label)
bnall(ax, ay, label)
bne(ax, ay, label)
bnone(ax, ay, label)
Upon entry to the assembly function the registers a0, a12, a13, a14 are
pushed to the stack and the stack pointer (a1) decreased by 16. Upon
exit, these registers and the stack pointer are restored, and ret.n is
executed to return to the caller (caller address is in a0).
Note that the ABI for the Xtensa emitters is non-windowing.
2016-12-09 01:03:33 -05:00
|
|
|
emitinlinextensa.o \
|
2021-04-23 15:26:42 -04:00
|
|
|
emitnxtensawin.o \
|
2014-03-10 09:27:02 -04:00
|
|
|
formatfloat.o \
|
2014-03-01 14:50:50 -05:00
|
|
|
parsenumbase.o \
|
2014-02-22 13:12:43 -05:00
|
|
|
parsenum.o \
|
2014-03-27 19:26:35 -04:00
|
|
|
emitglue.o \
|
2016-11-15 19:55:41 -05:00
|
|
|
persistentcode.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
runtime.o \
|
2016-04-25 12:28:12 -04:00
|
|
|
runtime_utils.o \
|
2017-02-16 02:05:06 -05:00
|
|
|
scheduler.o \
|
2014-08-28 18:37:02 -04:00
|
|
|
nativeglue.o \
|
2020-01-13 01:10:41 -05:00
|
|
|
pairheap.o \
|
2021-04-23 15:26:42 -04:00
|
|
|
ringbuf.o \
|
2014-06-24 20:03:34 -04:00
|
|
|
stackctrl.o \
|
2014-04-19 19:13:22 -04:00
|
|
|
argcheck.o \
|
2015-01-01 02:29:28 -05:00
|
|
|
warning.o \
|
2021-04-23 15:26:42 -04:00
|
|
|
profile.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
map.o \
|
2020-09-16 12:57:09 -04:00
|
|
|
enum.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
obj.o \
|
2014-01-18 12:24:47 -05:00
|
|
|
objarray.o \
|
2015-04-21 10:14:24 -04:00
|
|
|
objattrtuple.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objbool.o \
|
|
|
|
objboundmeth.o \
|
|
|
|
objcell.o \
|
|
|
|
objclosure.o \
|
|
|
|
objcomplex.o \
|
2018-02-05 17:06:42 -05:00
|
|
|
objdeque.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objdict.o \
|
2014-01-14 18:55:01 -05:00
|
|
|
objenumerate.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objexcept.o \
|
2014-01-14 20:37:08 -05:00
|
|
|
objfilter.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objfloat.o \
|
|
|
|
objfun.o \
|
|
|
|
objgenerator.o \
|
2014-01-24 19:17:36 -05:00
|
|
|
objgetitemiter.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objint.o \
|
2014-01-17 13:01:36 -05:00
|
|
|
objint_longlong.o \
|
2014-02-22 14:25:23 -05:00
|
|
|
objint_mpz.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objlist.o \
|
2014-01-14 20:10:09 -05:00
|
|
|
objmap.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objmodule.o \
|
2014-03-22 17:31:28 -04:00
|
|
|
objobject.o \
|
2015-12-14 16:48:12 -05:00
|
|
|
objpolyiter.o \
|
2014-04-13 13:59:45 -04:00
|
|
|
objproperty.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objnone.o \
|
2014-02-27 15:22:04 -05:00
|
|
|
objnamedtuple.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objrange.o \
|
2014-08-12 13:33:40 -04:00
|
|
|
objreversed.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objset.o \
|
2015-05-05 15:18:07 -04:00
|
|
|
objsingleton.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objslice.o \
|
|
|
|
objstr.o \
|
2014-06-13 15:01:26 -04:00
|
|
|
objstrunicode.o \
|
2014-04-26 13:26:14 -04:00
|
|
|
objstringio.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
objtuple.o \
|
|
|
|
objtype.o \
|
2014-01-21 16:40:13 -05:00
|
|
|
objzip.o \
|
2014-04-13 04:53:15 -04:00
|
|
|
opmethods.o \
|
protocols: Allow them to be (optionally) type-safe
Protocols are nice, but there is no way for C code to verify whether
a type's "protocol" structure actually implements some particular
protocol. As a result, you can pass an object that implements the
"vfs" protocol to one that expects the "stream" protocol, and the
opposite of awesomeness ensues.
This patch adds an OPTIONAL (but enabled by default) protocol identifier
as the first member of any protocol structure. This identifier is
simply a unique QSTR chosen by the protocol designer and used by each
protocol implementer. When checking for protocol support, instead of
just checking whether the object's type has a non-NULL protocol field,
use `mp_proto_get` which implements the protocol check when possible.
The existing protocols are now named:
protocol_framebuf
protocol_i2c
protocol_pin
protocol_stream
protocol_spi
protocol_vfs
(most of these are unused in CP and are just inherited from MP; vfs and
stream are definitely used though)
I did not find any crashing examples, but here's one to give a flavor of what
is improved, using `micropython_coverage`. Before the change,
the vfs "ioctl" protocol is invoked, and the result is not intelligible
as json (but it could have resulted in a hard fault, potentially):
>>> import uos, ujson
>>> u = uos.VfsPosix('/tmp')
>>> ujson.load(u)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: syntax error in JSON
After the change, the vfs object is correctly detected as not supporting
the stream protocol:
>>> ujson.load(p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: stream operation not supported
2019-12-03 15:50:37 -05:00
|
|
|
proto.o \
|
2018-05-14 17:41:17 -04:00
|
|
|
reload.o \
|
2014-01-20 17:19:19 -05:00
|
|
|
sequence.o \
|
2014-01-07 19:43:48 -05:00
|
|
|
stream.o \
|
2014-02-14 10:16:35 -05:00
|
|
|
binary.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
builtinimport.o \
|
2014-02-03 17:44:10 -05:00
|
|
|
builtinevex.o \
|
2017-01-21 07:17:51 -05:00
|
|
|
builtinhelp.o \
|
2014-03-25 10:18:18 -04:00
|
|
|
modarray.o \
|
2014-12-09 11:19:48 -05:00
|
|
|
modbuiltins.o \
|
2014-03-25 10:18:18 -04:00
|
|
|
modcollections.o \
|
2014-05-05 19:16:43 -04:00
|
|
|
modgc.o \
|
2014-04-03 07:57:53 -04:00
|
|
|
modio.o \
|
2014-03-25 10:18:18 -04:00
|
|
|
modmath.o \
|
2014-04-17 12:11:03 -04:00
|
|
|
modcmath.o \
|
2014-03-25 10:18:18 -04:00
|
|
|
modmicropython.o \
|
2014-04-09 20:45:38 -04:00
|
|
|
modstruct.o \
|
2014-04-12 23:43:18 -04:00
|
|
|
modsys.o \
|
2016-05-10 05:54:25 -04:00
|
|
|
moduerrno.o \
|
2016-04-22 18:52:33 -04:00
|
|
|
modthread.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
vm.o \
|
2014-09-04 09:44:01 -04:00
|
|
|
bc.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
showbc.o \
|
|
|
|
repl.o \
|
2014-04-04 07:13:51 -04:00
|
|
|
smallint.o \
|
2015-01-20 04:52:12 -05:00
|
|
|
frozenmod.o \
|
2018-02-21 19:32:31 -05:00
|
|
|
)
|
2018-02-21 19:13:04 -05:00
|
|
|
|
|
|
|
PY_EXTMOD_O_BASENAME = \
|
2020-03-12 01:46:20 -04:00
|
|
|
extmod/moduasyncio.o \
|
2018-02-21 19:32:31 -05:00
|
|
|
extmod/moductypes.o \
|
|
|
|
extmod/modujson.o \
|
|
|
|
extmod/modure.o \
|
|
|
|
extmod/moduzlib.o \
|
|
|
|
extmod/moduheapq.o \
|
|
|
|
extmod/modutimeq.o \
|
|
|
|
extmod/moduhashlib.o \
|
|
|
|
extmod/modubinascii.o \
|
|
|
|
extmod/virtpin.o \
|
|
|
|
extmod/modurandom.o \
|
|
|
|
extmod/moduselect.o \
|
|
|
|
extmod/modframebuf.o \
|
|
|
|
extmod/vfs.o \
|
2021-04-23 15:26:42 -04:00
|
|
|
extmod/vfs_blockdev.o \
|
2018-02-21 19:32:31 -05:00
|
|
|
extmod/vfs_reader.o \
|
2018-06-05 23:11:33 -04:00
|
|
|
extmod/vfs_posix.o \
|
|
|
|
extmod/vfs_posix_file.o \
|
2018-02-21 19:32:31 -05:00
|
|
|
extmod/vfs_fat.o \
|
|
|
|
extmod/vfs_fat_diskio.o \
|
|
|
|
extmod/vfs_fat_file.o \
|
2021-04-23 15:26:42 -04:00
|
|
|
extmod/vfs_lfs.o \
|
2018-02-21 19:32:31 -05:00
|
|
|
extmod/utime_mphal.o \
|
|
|
|
lib/embed/abort_.o \
|
|
|
|
lib/utils/printf.o \
|
2014-01-07 09:54:15 -05:00
|
|
|
|
|
|
|
# prepend the build destination prefix to the py object files
|
2018-02-21 19:32:31 -05:00
|
|
|
PY_CORE_O = $(addprefix $(BUILD)/, $(PY_CORE_O_BASENAME))
|
|
|
|
PY_EXTMOD_O = $(addprefix $(BUILD)/, $(PY_EXTMOD_O_BASENAME))
|
2018-02-21 19:13:04 -05:00
|
|
|
|
|
|
|
# this is a convenience variable for ports that want core, extmod and frozen code
|
|
|
|
PY_O = $(PY_CORE_O) $(PY_EXTMOD_O)
|
2014-01-07 09:54:15 -05:00
|
|
|
|
2021-04-23 15:26:42 -04:00
|
|
|
# object file for frozen code specified via a manifest
|
|
|
|
ifneq ($(FROZEN_MANIFEST),)
|
|
|
|
PY_O += $(BUILD)/$(BUILD)/frozen_content.o
|
|
|
|
endif
|
|
|
|
|
2016-11-07 22:28:30 -05:00
|
|
|
# object file for frozen files
|
2016-10-20 18:08:43 -04:00
|
|
|
ifneq ($(FROZEN_DIR),)
|
2017-08-23 14:05:59 -04:00
|
|
|
PY_O += $(BUILD)/frozen.o
|
2016-10-20 18:08:43 -04:00
|
|
|
endif
|
|
|
|
|
2017-08-23 14:05:59 -04:00
|
|
|
# Combine old singular FROZEN_MPY_DIR with new multiple value form.
|
|
|
|
FROZEN_MPY_DIRS += $(FROZEN_MPY_DIR)
|
|
|
|
|
2016-11-07 22:28:30 -05:00
|
|
|
# object file for frozen bytecode (frozen .mpy files)
|
2017-08-23 14:05:59 -04:00
|
|
|
ifneq ($(FROZEN_MPY_DIRS),)
|
|
|
|
PY_O += $(BUILD)/frozen_mpy.o
|
2016-11-07 22:28:30 -05:00
|
|
|
endif
|
|
|
|
|
py: Add rules for automated extraction of qstrs from sources.
- add template rule that converts a specified source file into a qstring file
- add special rule for generating a central header that contains all
extracted/autogenerated strings - defined by QSTR_DEFS_COLLECTED
variable. Each platform appends a list of sources that may contain
qstrings into a new build variable: SRC_QSTR. Any autogenerated
prerequisities are should be appened to SRC_QSTR_AUTO_DEPS variable.
- remove most qstrings from py/qstrdefs, keep only qstrings that
contain special characters - these cannot be easily detected in the
sources without additional annotations
- remove most manual qstrdefs, use qstrdef autogen for: py, cc3200,
stmhal, teensy, unix, windows, pic16bit:
- remove all micropython generic qstrdefs except for the special strings that contain special characters (e.g. /,+,<,> etc.)
- remove all port specific qstrdefs except for special strings
- append sources for qstr generation in platform makefiles (SRC_QSTR)
2016-03-10 04:22:41 -05:00
|
|
|
# Sources that may contain qstrings
|
2018-04-10 01:06:47 -04:00
|
|
|
SRC_QSTR_IGNORE = py/nlr%
|
2018-08-01 15:16:36 -04:00
|
|
|
SRC_QSTR_EMITNATIVE = py/emitn%
|
2021-04-22 20:55:39 -04:00
|
|
|
SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
|
2018-08-01 14:44:18 -04:00
|
|
|
# Sources that only hold QSTRs after pre-processing.
|
2018-08-02 14:07:22 -04:00
|
|
|
SRC_QSTR_PREPROCESSOR = $(addprefix $(TOP)/, $(filter $(SRC_QSTR_EMITNATIVE),$(PY_CORE_O_BASENAME:.o=.c)))
|
py: Add rules for automated extraction of qstrs from sources.
- add template rule that converts a specified source file into a qstring file
- add special rule for generating a central header that contains all
extracted/autogenerated strings - defined by QSTR_DEFS_COLLECTED
variable. Each platform appends a list of sources that may contain
qstrings into a new build variable: SRC_QSTR. Any autogenerated
prerequisities are should be appened to SRC_QSTR_AUTO_DEPS variable.
- remove most qstrings from py/qstrdefs, keep only qstrings that
contain special characters - these cannot be easily detected in the
sources without additional annotations
- remove most manual qstrdefs, use qstrdef autogen for: py, cc3200,
stmhal, teensy, unix, windows, pic16bit:
- remove all micropython generic qstrdefs except for the special strings that contain special characters (e.g. /,+,<,> etc.)
- remove all port specific qstrdefs except for special strings
- append sources for qstr generation in platform makefiles (SRC_QSTR)
2016-03-10 04:22:41 -05:00
|
|
|
|
2014-04-03 19:32:58 -04:00
|
|
|
# Anything that depends on FORCE will be considered out-of-date
|
|
|
|
FORCE:
|
|
|
|
.PHONY: FORCE
|
|
|
|
|
2015-04-22 12:38:05 -04:00
|
|
|
$(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
|
2018-07-31 19:53:54 -04:00
|
|
|
$(STEPECHO) "GEN $@"
|
2020-01-12 00:37:54 -05:00
|
|
|
$(Q)$(PYTHON3) $(PY_SRC)/makeversionhdr.py $@
|
2014-04-03 19:32:58 -04:00
|
|
|
|
2019-04-05 15:39:44 -04:00
|
|
|
# build a list of registered modules for py/objmodule.c.
|
|
|
|
$(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)/mpversion.h
|
2019-12-05 22:45:53 -05:00
|
|
|
@$(STEPECHO) "GEN $@"
|
2020-01-12 00:37:54 -05:00
|
|
|
$(Q)$(PYTHON3) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
|
2019-04-05 15:39:44 -04:00
|
|
|
|
|
|
|
SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
|
|
|
|
|
2015-06-10 18:24:54 -04:00
|
|
|
# mpconfigport.mk is optional, but changes to it may drastically change
|
|
|
|
# overall config, so they need to be caught
|
|
|
|
MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
|
|
|
|
|
2019-12-16 16:33:55 -05:00
|
|
|
$(HEADER_BUILD)/$(TRANSLATION).mo: $(TOP)/locale/$(TRANSLATION).po | $(HEADER_BUILD)
|
2018-07-31 19:53:54 -04:00
|
|
|
$(Q)msgfmt -o $@ $^
|
|
|
|
|
|
|
|
$(HEADER_BUILD)/qstrdefs.preprocessed.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) mpconfigport.h $(MPCONFIGPORT_MK) $(PY_SRC)/mpconfig.h | $(HEADER_BUILD)
|
|
|
|
$(STEPECHO) "GEN $@"
|
|
|
|
$(Q)cat $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(CFLAGS) - | $(SED) 's/^"\(Q(.*)\)"/\1/' > $@
|
|
|
|
|
2014-01-21 16:40:13 -05:00
|
|
|
# qstr data
|
2018-07-31 19:53:54 -04:00
|
|
|
$(HEADER_BUILD)/qstrdefs.enum.h: $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h
|
|
|
|
$(STEPECHO) "GEN $@"
|
2018-11-09 03:11:43 -05:00
|
|
|
$(Q)$(PYTHON3) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
|
2018-07-31 19:53:54 -04:00
|
|
|
|
2014-04-17 13:03:27 -04:00
|
|
|
# Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get
|
2014-01-24 04:05:30 -05:00
|
|
|
# created before we run the script to generate the .h
|
2015-05-30 18:14:34 -04:00
|
|
|
# Note: we need to protect the qstr names from the preprocessor, so we wrap
|
|
|
|
# the lines in "" and then unwrap after the preprocessor is finished.
|
2018-07-31 19:53:54 -04:00
|
|
|
$(HEADER_BUILD)/qstrdefs.generated.h: $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/$(TRANSLATION).mo $(HEADER_BUILD)/qstrdefs.preprocessed.h
|
|
|
|
$(STEPECHO) "GEN $@"
|
2018-11-09 03:11:43 -05:00
|
|
|
$(Q)$(PYTHON3) $(PY_SRC)/makeqstrdata.py --compression_filename $(HEADER_BUILD)/compression.generated.h --translation $(HEADER_BUILD)/$(TRANSLATION).mo $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
|
2018-07-31 19:53:54 -04:00
|
|
|
|
|
|
|
$(PY_BUILD)/qstr.o: $(HEADER_BUILD)/qstrdefs.generated.h
|
2014-01-21 16:40:13 -05:00
|
|
|
|
2020-05-20 21:27:09 -04:00
|
|
|
# Standard C functions like memset need to be compiled with special flags so
|
|
|
|
# the compiler does not optimise these functions in terms of themselves.
|
|
|
|
CFLAGS_BUILTIN ?= -ffreestanding -fno-builtin -fno-lto
|
|
|
|
$(BUILD)/lib/libc/string0.o: CFLAGS += $(CFLAGS_BUILTIN)
|
|
|
|
|
2020-05-20 21:27:09 -04:00
|
|
|
# Standard C functions like memset need to be compiled with special flags so
|
|
|
|
# the compiler does not optimise these functions in terms of themselves.
|
|
|
|
CFLAGS_BUILTIN ?= -ffreestanding -fno-builtin -fno-lto
|
|
|
|
$(BUILD)/lib/libc/string0.o: CFLAGS += $(CFLAGS_BUILTIN)
|
|
|
|
|
2017-03-02 05:56:10 -05:00
|
|
|
# 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
|
|
|
|
|
2014-01-07 10:20:33 -05:00
|
|
|
# optimising gc for speed; 5ms down to 4ms on pybv2
|
2019-06-12 11:08:22 -04:00
|
|
|
ifndef SUPEROPT_GC
|
|
|
|
SUPEROPT_GC = 1
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(SUPEROPT_GC),1)
|
2014-04-23 19:59:43 -04:00
|
|
|
$(PY_BUILD)/gc.o: CFLAGS += $(CSUPEROPT)
|
2019-06-12 11:08:22 -04:00
|
|
|
endif
|
2014-01-07 10:20:33 -05:00
|
|
|
|
2014-01-07 09:54:15 -05:00
|
|
|
# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
|
2019-06-12 11:08:22 -04:00
|
|
|
ifndef SUPEROPT_VM
|
|
|
|
SUPEROPT_VM = 1
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(SUPEROPT_VM),1)
|
2019-06-12 13:09:09 -04:00
|
|
|
$(PY_BUILD)/vm.o: CFLAGS += $(CSUPEROPT)
|
2019-06-12 11:08:22 -04:00
|
|
|
endif
|
|
|
|
|
2014-12-28 00:44:09 -05:00
|
|
|
# Optimizing vm.o for modern deeply pipelined CPUs with branch predictors
|
|
|
|
# may require disabling tail jump optimization. This will make sure that
|
|
|
|
# each opcode has its own dispatching jump which will improve branch
|
|
|
|
# branch predictor efficiency.
|
2018-11-30 16:23:53 -05:00
|
|
|
# https://marc.info/?l=lua-l&m=129778596120851
|
2014-12-28 00:44:09 -05:00
|
|
|
# http://hg.python.org/cpython/file/b127046831e2/Python/ceval.c#l828
|
|
|
|
# http://www.emulators.com/docs/nx25_nostradamus.htm
|
|
|
|
#-fno-crossjumping
|
2021-04-23 15:26:42 -04:00
|
|
|
|
|
|
|
# Include rules for extmod related code
|
|
|
|
include $(TOP)/extmod/extmod.mk
|