forked from xuos/xiuos
				
			
		
			
				
	
	
		
			298 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Makefile
		
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Makefile
		
	
	
	
# where py object files go (they have a name prefix to prevent filename clashes)
 | 
						|
PY_BUILD = $(BUILD)/py
 | 
						|
 | 
						|
# where autogenerated header files go
 | 
						|
HEADER_BUILD = $(BUILD)/genhdr
 | 
						|
 | 
						|
# file containing qstr defs for the core Python bit
 | 
						|
PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h
 | 
						|
 | 
						|
# If qstr autogeneration is not disabled we specify the output header
 | 
						|
# for all collected qstrings.
 | 
						|
ifneq ($(QSTR_AUTOGEN_DISABLE),1)
 | 
						|
QSTR_DEFS_COLLECTED = $(HEADER_BUILD)/qstrdefs.collected.h
 | 
						|
endif
 | 
						|
 | 
						|
# Any files listed by these variables will cause a full regeneration of qstrs
 | 
						|
# DEPENDENCIES: included in qstr processing; REQUIREMENTS: not included
 | 
						|
QSTR_GLOBAL_DEPENDENCIES += $(PY_SRC)/mpconfig.h mpconfigport.h
 | 
						|
QSTR_GLOBAL_REQUIREMENTS += $(HEADER_BUILD)/mpversion.h
 | 
						|
 | 
						|
# some code is performance bottleneck and compiled with other optimization options
 | 
						|
CSUPEROPT = -O3
 | 
						|
 | 
						|
# Enable building 32-bit code on 64-bit host.
 | 
						|
ifeq ($(MICROPY_FORCE_32BIT),1)
 | 
						|
CC += -m32
 | 
						|
CXX += -m32
 | 
						|
LD += -m32
 | 
						|
endif
 | 
						|
 | 
						|
# External modules written in C.
 | 
						|
ifneq ($(USER_C_MODULES),)
 | 
						|
# pre-define USERMOD variables as expanded so that variables are immediate
 | 
						|
# expanded as they're added to them
 | 
						|
SRC_USERMOD :=
 | 
						|
SRC_USERMOD_CXX :=
 | 
						|
CFLAGS_USERMOD :=
 | 
						|
CXXFLAGS_USERMOD :=
 | 
						|
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))
 | 
						|
SRC_MOD_CXX += $(patsubst $(USER_C_MODULES)/%.cpp,%.cpp,$(SRC_USERMOD_CXX))
 | 
						|
CFLAGS_MOD += $(CFLAGS_USERMOD)
 | 
						|
CXXFLAGS_MOD += $(CXXFLAGS_USERMOD)
 | 
						|
LDFLAGS_MOD += $(LDFLAGS_USERMOD)
 | 
						|
endif
 | 
						|
 | 
						|
# py object files
 | 
						|
PY_CORE_O_BASENAME = $(addprefix py/,\
 | 
						|
	mpstate.o \
 | 
						|
	nlr.o \
 | 
						|
	nlrx86.o \
 | 
						|
	nlrx64.o \
 | 
						|
	nlrthumb.o \
 | 
						|
	nlrpowerpc.o \
 | 
						|
	nlrxtensa.o \
 | 
						|
	nlrsetjmp.o \
 | 
						|
	malloc.o \
 | 
						|
	gc.o \
 | 
						|
	pystack.o \
 | 
						|
	qstr.o \
 | 
						|
	vstr.o \
 | 
						|
	mpprint.o \
 | 
						|
	unicode.o \
 | 
						|
	mpz.o \
 | 
						|
	reader.o \
 | 
						|
	lexer.o \
 | 
						|
	parse.o \
 | 
						|
	scope.o \
 | 
						|
	compile.o \
 | 
						|
	emitcommon.o \
 | 
						|
	emitbc.o \
 | 
						|
	asmbase.o \
 | 
						|
	asmx64.o \
 | 
						|
	emitnx64.o \
 | 
						|
	asmx86.o \
 | 
						|
	emitnx86.o \
 | 
						|
	asmthumb.o \
 | 
						|
	emitnthumb.o \
 | 
						|
	emitinlinethumb.o \
 | 
						|
	asmarm.o \
 | 
						|
	emitnarm.o \
 | 
						|
	asmxtensa.o \
 | 
						|
	emitnxtensa.o \
 | 
						|
	emitinlinextensa.o \
 | 
						|
	emitnxtensawin.o \
 | 
						|
	formatfloat.o \
 | 
						|
	parsenumbase.o \
 | 
						|
	parsenum.o \
 | 
						|
	emitglue.o \
 | 
						|
	persistentcode.o \
 | 
						|
	runtime.o \
 | 
						|
	runtime_utils.o \
 | 
						|
	scheduler.o \
 | 
						|
	nativeglue.o \
 | 
						|
	pairheap.o \
 | 
						|
	ringbuf.o \
 | 
						|
	stackctrl.o \
 | 
						|
	argcheck.o \
 | 
						|
	warning.o \
 | 
						|
	profile.o \
 | 
						|
	map.o \
 | 
						|
	obj.o \
 | 
						|
	objarray.o \
 | 
						|
	objattrtuple.o \
 | 
						|
	objbool.o \
 | 
						|
	objboundmeth.o \
 | 
						|
	objcell.o \
 | 
						|
	objclosure.o \
 | 
						|
	objcomplex.o \
 | 
						|
	objdeque.o \
 | 
						|
	objdict.o \
 | 
						|
	objenumerate.o \
 | 
						|
	objexcept.o \
 | 
						|
	objfilter.o \
 | 
						|
	objfloat.o \
 | 
						|
	objfun.o \
 | 
						|
	objgenerator.o \
 | 
						|
	objgetitemiter.o \
 | 
						|
	objint.o \
 | 
						|
	objint_longlong.o \
 | 
						|
	objint_mpz.o \
 | 
						|
	objlist.o \
 | 
						|
	objmap.o \
 | 
						|
	objmodule.o \
 | 
						|
	objobject.o \
 | 
						|
	objpolyiter.o \
 | 
						|
	objproperty.o \
 | 
						|
	objnone.o \
 | 
						|
	objnamedtuple.o \
 | 
						|
	objrange.o \
 | 
						|
	objreversed.o \
 | 
						|
	objset.o \
 | 
						|
	objsingleton.o \
 | 
						|
	objslice.o \
 | 
						|
	objstr.o \
 | 
						|
	objstrunicode.o \
 | 
						|
	objstringio.o \
 | 
						|
	objtuple.o \
 | 
						|
	objtype.o \
 | 
						|
	objzip.o \
 | 
						|
	opmethods.o \
 | 
						|
	sequence.o \
 | 
						|
	stream.o \
 | 
						|
	binary.o \
 | 
						|
	builtinimport.o \
 | 
						|
	builtinevex.o \
 | 
						|
	builtinhelp.o \
 | 
						|
	modarray.o \
 | 
						|
	modbuiltins.o \
 | 
						|
	modcollections.o \
 | 
						|
	modgc.o \
 | 
						|
	modio.o \
 | 
						|
	modmath.o \
 | 
						|
	modcmath.o \
 | 
						|
	modmicropython.o \
 | 
						|
	modstruct.o \
 | 
						|
	modsys.o \
 | 
						|
	moduerrno.o \
 | 
						|
	modthread.o \
 | 
						|
	vm.o \
 | 
						|
	bc.o \
 | 
						|
	showbc.o \
 | 
						|
	repl.o \
 | 
						|
	smallint.o \
 | 
						|
	frozenmod.o \
 | 
						|
	)
 | 
						|
 | 
						|
PY_EXTMOD_O_BASENAME = \
 | 
						|
	extmod/moduasyncio.o \
 | 
						|
	extmod/moductypes.o \
 | 
						|
	extmod/modujson.o \
 | 
						|
	extmod/modure.o \
 | 
						|
	extmod/moduzlib.o \
 | 
						|
	extmod/moduheapq.o \
 | 
						|
	extmod/modutimeq.o \
 | 
						|
	extmod/moduhashlib.o \
 | 
						|
	extmod/moducryptolib.o \
 | 
						|
	extmod/modubinascii.o \
 | 
						|
	extmod/virtpin.o \
 | 
						|
	extmod/machine_mem.o \
 | 
						|
	extmod/machine_pinbase.o \
 | 
						|
	extmod/machine_signal.o \
 | 
						|
	extmod/machine_pulse.o \
 | 
						|
	extmod/machine_i2c.o \
 | 
						|
	extmod/machine_spi.o \
 | 
						|
	extmod/modbluetooth.o \
 | 
						|
	extmod/modussl_axtls.o \
 | 
						|
	extmod/modussl_mbedtls.o \
 | 
						|
	extmod/modurandom.o \
 | 
						|
	extmod/moduselect.o \
 | 
						|
	extmod/moduwebsocket.o \
 | 
						|
	extmod/modwebrepl.o \
 | 
						|
	extmod/modframebuf.o \
 | 
						|
	extmod/vfs.o \
 | 
						|
	extmod/vfs_blockdev.o \
 | 
						|
	extmod/vfs_reader.o \
 | 
						|
	extmod/vfs_posix.o \
 | 
						|
	extmod/vfs_posix_file.o \
 | 
						|
	extmod/vfs_fat.o \
 | 
						|
	extmod/vfs_fat_diskio.o \
 | 
						|
	extmod/vfs_fat_file.o \
 | 
						|
	extmod/vfs_lfs.o \
 | 
						|
	extmod/utime_mphal.o \
 | 
						|
	extmod/uos_dupterm.o \
 | 
						|
	lib/embed/abort_.o \
 | 
						|
	lib/utils/printf.o \
 | 
						|
 | 
						|
# prepend the build destination prefix to the py object files
 | 
						|
PY_CORE_O = $(addprefix $(BUILD)/, $(PY_CORE_O_BASENAME))
 | 
						|
PY_EXTMOD_O = $(addprefix $(BUILD)/, $(PY_EXTMOD_O_BASENAME))
 | 
						|
 | 
						|
# this is a convenience variable for ports that want core, extmod and frozen code
 | 
						|
PY_O = $(PY_CORE_O) $(PY_EXTMOD_O)
 | 
						|
 | 
						|
# object file for frozen code specified via a manifest
 | 
						|
ifneq ($(FROZEN_MANIFEST),)
 | 
						|
PY_O += $(BUILD)/$(BUILD)/frozen_content.o
 | 
						|
endif
 | 
						|
 | 
						|
# object file for frozen files
 | 
						|
ifneq ($(FROZEN_DIR),)
 | 
						|
PY_O += $(BUILD)/$(BUILD)/frozen.o
 | 
						|
endif
 | 
						|
 | 
						|
# object file for frozen bytecode (frozen .mpy files)
 | 
						|
ifneq ($(FROZEN_MPY_DIR),)
 | 
						|
PY_O += $(BUILD)/$(BUILD)/frozen_mpy.o
 | 
						|
endif
 | 
						|
 | 
						|
# Sources that may contain qstrings
 | 
						|
SRC_QSTR_IGNORE = py/nlr%
 | 
						|
SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
 | 
						|
 | 
						|
# Anything that depends on FORCE will be considered out-of-date
 | 
						|
FORCE:
 | 
						|
.PHONY: FORCE
 | 
						|
 | 
						|
$(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
 | 
						|
	$(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@
 | 
						|
 | 
						|
# mpconfigport.mk is optional, but changes to it may drastically change
 | 
						|
# overall config, so they need to be caught
 | 
						|
MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
 | 
						|
 | 
						|
# qstr data
 | 
						|
# Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get
 | 
						|
# created before we run the script to generate the .h
 | 
						|
# 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.
 | 
						|
# See more information about this process in docs/develop/qstr.rst.
 | 
						|
$(HEADER_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) $(PY_SRC)/makeqstrdata.py mpconfigport.h $(MPCONFIGPORT_MK) $(PY_SRC)/mpconfig.h | $(HEADER_BUILD)
 | 
						|
	$(ECHO) "GEN $@"
 | 
						|
	$(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(CFLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
 | 
						|
	$(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
 | 
						|
 | 
						|
$(HEADER_BUILD)/compressed.data.h: $(HEADER_BUILD)/compressed.collected
 | 
						|
	$(ECHO) "GEN $@"
 | 
						|
	$(Q)$(PYTHON) $(PY_SRC)/makecompresseddata.py $< > $@
 | 
						|
 | 
						|
# build a list of registered modules for py/objmodule.c.
 | 
						|
$(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)/mpversion.h
 | 
						|
	@$(ECHO) "GEN $@"
 | 
						|
	$(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
 | 
						|
 | 
						|
SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
 | 
						|
 | 
						|
# 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)
 | 
						|
 | 
						|
# 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
 | 
						|
 | 
						|
# optimising gc for speed; 5ms down to 4ms on pybv2
 | 
						|
$(PY_BUILD)/gc.o: CFLAGS += $(CSUPEROPT)
 | 
						|
 | 
						|
# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
 | 
						|
$(PY_BUILD)/vm.o: CFLAGS += $(CSUPEROPT)
 | 
						|
# 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.
 | 
						|
# https://marc.info/?l=lua-l&m=129778596120851
 | 
						|
# http://hg.python.org/cpython/file/b127046831e2/Python/ceval.c#l828
 | 
						|
# http://www.emulators.com/docs/nx25_nostradamus.htm
 | 
						|
#-fno-crossjumping
 | 
						|
 | 
						|
# Include rules for extmod related code
 | 
						|
include $(TOP)/extmod/extmod.mk
 |