py.mk 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. # where py object files go (they have a name prefix to prevent filename clashes)
  2. PY_BUILD = $(BUILD)/py
  3. # where autogenerated header files go
  4. HEADER_BUILD = $(BUILD)/genhdr
  5. # file containing qstr defs for the core Python bit
  6. PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h
  7. # If qstr autogeneration is not disabled we specify the output header
  8. # for all collected qstrings.
  9. ifneq ($(QSTR_AUTOGEN_DISABLE),1)
  10. QSTR_DEFS_COLLECTED = $(HEADER_BUILD)/qstrdefs.collected.h
  11. endif
  12. # Any files listed by these variables will cause a full regeneration of qstrs
  13. # DEPENDENCIES: included in qstr processing; REQUIREMENTS: not included
  14. QSTR_GLOBAL_DEPENDENCIES += $(PY_SRC)/mpconfig.h mpconfigport.h
  15. QSTR_GLOBAL_REQUIREMENTS += $(HEADER_BUILD)/mpversion.h
  16. # some code is performance bottleneck and compiled with other optimization options
  17. CSUPEROPT = -O3
  18. # Enable building 32-bit code on 64-bit host.
  19. ifeq ($(MICROPY_FORCE_32BIT),1)
  20. CC += -m32
  21. CXX += -m32
  22. LD += -m32
  23. endif
  24. # External modules written in C.
  25. ifneq ($(USER_C_MODULES),)
  26. # pre-define USERMOD variables as expanded so that variables are immediate
  27. # expanded as they're added to them
  28. SRC_USERMOD :=
  29. SRC_USERMOD_CXX :=
  30. CFLAGS_USERMOD :=
  31. CXXFLAGS_USERMOD :=
  32. LDFLAGS_USERMOD :=
  33. $(foreach module, $(wildcard $(USER_C_MODULES)/*/micropython.mk), \
  34. $(eval USERMOD_DIR = $(patsubst %/,%,$(dir $(module))))\
  35. $(info Including User C Module from $(USERMOD_DIR))\
  36. $(eval include $(module))\
  37. )
  38. SRC_MOD += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD))
  39. SRC_MOD_CXX += $(patsubst $(USER_C_MODULES)/%.cpp,%.cpp,$(SRC_USERMOD_CXX))
  40. CFLAGS_MOD += $(CFLAGS_USERMOD)
  41. CXXFLAGS_MOD += $(CXXFLAGS_USERMOD)
  42. LDFLAGS_MOD += $(LDFLAGS_USERMOD)
  43. endif
  44. # py object files
  45. PY_CORE_O_BASENAME = $(addprefix py/,\
  46. mpstate.o \
  47. nlr.o \
  48. nlrx86.o \
  49. nlrx64.o \
  50. nlrthumb.o \
  51. nlrpowerpc.o \
  52. nlrxtensa.o \
  53. nlrsetjmp.o \
  54. malloc.o \
  55. gc.o \
  56. pystack.o \
  57. qstr.o \
  58. vstr.o \
  59. mpprint.o \
  60. unicode.o \
  61. mpz.o \
  62. reader.o \
  63. lexer.o \
  64. parse.o \
  65. scope.o \
  66. compile.o \
  67. emitcommon.o \
  68. emitbc.o \
  69. asmbase.o \
  70. asmx64.o \
  71. emitnx64.o \
  72. asmx86.o \
  73. emitnx86.o \
  74. asmthumb.o \
  75. emitnthumb.o \
  76. emitinlinethumb.o \
  77. asmarm.o \
  78. emitnarm.o \
  79. asmxtensa.o \
  80. emitnxtensa.o \
  81. emitinlinextensa.o \
  82. emitnxtensawin.o \
  83. formatfloat.o \
  84. parsenumbase.o \
  85. parsenum.o \
  86. emitglue.o \
  87. persistentcode.o \
  88. runtime.o \
  89. runtime_utils.o \
  90. scheduler.o \
  91. nativeglue.o \
  92. pairheap.o \
  93. ringbuf.o \
  94. stackctrl.o \
  95. argcheck.o \
  96. warning.o \
  97. profile.o \
  98. map.o \
  99. obj.o \
  100. objarray.o \
  101. objattrtuple.o \
  102. objbool.o \
  103. objboundmeth.o \
  104. objcell.o \
  105. objclosure.o \
  106. objcomplex.o \
  107. objdeque.o \
  108. objdict.o \
  109. objenumerate.o \
  110. objexcept.o \
  111. objfilter.o \
  112. objfloat.o \
  113. objfun.o \
  114. objgenerator.o \
  115. objgetitemiter.o \
  116. objint.o \
  117. objint_longlong.o \
  118. objint_mpz.o \
  119. objlist.o \
  120. objmap.o \
  121. objmodule.o \
  122. objobject.o \
  123. objpolyiter.o \
  124. objproperty.o \
  125. objnone.o \
  126. objnamedtuple.o \
  127. objrange.o \
  128. objreversed.o \
  129. objset.o \
  130. objsingleton.o \
  131. objslice.o \
  132. objstr.o \
  133. objstrunicode.o \
  134. objstringio.o \
  135. objtuple.o \
  136. objtype.o \
  137. objzip.o \
  138. opmethods.o \
  139. sequence.o \
  140. stream.o \
  141. binary.o \
  142. builtinimport.o \
  143. builtinevex.o \
  144. builtinhelp.o \
  145. modarray.o \
  146. modbuiltins.o \
  147. modcollections.o \
  148. modgc.o \
  149. modio.o \
  150. modmath.o \
  151. modcmath.o \
  152. modmicropython.o \
  153. modstruct.o \
  154. modsys.o \
  155. moduerrno.o \
  156. modthread.o \
  157. vm.o \
  158. bc.o \
  159. showbc.o \
  160. repl.o \
  161. smallint.o \
  162. frozenmod.o \
  163. )
  164. PY_EXTMOD_O_BASENAME = \
  165. extmod/moduasyncio.o \
  166. extmod/moductypes.o \
  167. extmod/modujson.o \
  168. extmod/modure.o \
  169. extmod/moduzlib.o \
  170. extmod/moduheapq.o \
  171. extmod/modutimeq.o \
  172. extmod/moduhashlib.o \
  173. extmod/moducryptolib.o \
  174. extmod/modubinascii.o \
  175. extmod/virtpin.o \
  176. extmod/machine_mem.o \
  177. extmod/machine_pinbase.o \
  178. extmod/machine_signal.o \
  179. extmod/machine_pulse.o \
  180. extmod/machine_i2c.o \
  181. extmod/machine_spi.o \
  182. extmod/modbluetooth.o \
  183. extmod/modussl_axtls.o \
  184. extmod/modussl_mbedtls.o \
  185. extmod/modurandom.o \
  186. extmod/moduselect.o \
  187. extmod/moduwebsocket.o \
  188. extmod/modwebrepl.o \
  189. extmod/modframebuf.o \
  190. extmod/vfs.o \
  191. extmod/vfs_blockdev.o \
  192. extmod/vfs_reader.o \
  193. extmod/vfs_posix.o \
  194. extmod/vfs_posix_file.o \
  195. extmod/vfs_fat.o \
  196. extmod/vfs_fat_diskio.o \
  197. extmod/vfs_fat_file.o \
  198. extmod/vfs_lfs.o \
  199. extmod/utime_mphal.o \
  200. extmod/uos_dupterm.o \
  201. lib/embed/abort_.o \
  202. lib/utils/printf.o \
  203. # prepend the build destination prefix to the py object files
  204. PY_CORE_O = $(addprefix $(BUILD)/, $(PY_CORE_O_BASENAME))
  205. PY_EXTMOD_O = $(addprefix $(BUILD)/, $(PY_EXTMOD_O_BASENAME))
  206. # this is a convenience variable for ports that want core, extmod and frozen code
  207. PY_O = $(PY_CORE_O) $(PY_EXTMOD_O)
  208. # object file for frozen code specified via a manifest
  209. ifneq ($(FROZEN_MANIFEST),)
  210. PY_O += $(BUILD)/$(BUILD)/frozen_content.o
  211. endif
  212. # object file for frozen files
  213. ifneq ($(FROZEN_DIR),)
  214. PY_O += $(BUILD)/$(BUILD)/frozen.o
  215. endif
  216. # object file for frozen bytecode (frozen .mpy files)
  217. ifneq ($(FROZEN_MPY_DIR),)
  218. PY_O += $(BUILD)/$(BUILD)/frozen_mpy.o
  219. endif
  220. # Sources that may contain qstrings
  221. SRC_QSTR_IGNORE = py/nlr%
  222. SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
  223. # Anything that depends on FORCE will be considered out-of-date
  224. FORCE:
  225. .PHONY: FORCE
  226. $(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
  227. $(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@
  228. # mpconfigport.mk is optional, but changes to it may drastically change
  229. # overall config, so they need to be caught
  230. MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
  231. # qstr data
  232. # Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get
  233. # created before we run the script to generate the .h
  234. # Note: we need to protect the qstr names from the preprocessor, so we wrap
  235. # the lines in "" and then unwrap after the preprocessor is finished.
  236. # See more information about this process in docs/develop/qstr.rst.
  237. $(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)
  238. $(ECHO) "GEN $@"
  239. $(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(CFLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
  240. $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
  241. $(HEADER_BUILD)/compressed.data.h: $(HEADER_BUILD)/compressed.collected
  242. $(ECHO) "GEN $@"
  243. $(Q)$(PYTHON) $(PY_SRC)/makecompresseddata.py $< > $@
  244. # build a list of registered modules for py/objmodule.c.
  245. $(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)/mpversion.h
  246. @$(ECHO) "GEN $@"
  247. $(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
  248. SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
  249. # Standard C functions like memset need to be compiled with special flags so
  250. # the compiler does not optimise these functions in terms of themselves.
  251. CFLAGS_BUILTIN ?= -ffreestanding -fno-builtin -fno-lto
  252. $(BUILD)/lib/libc/string0.o: CFLAGS += $(CFLAGS_BUILTIN)
  253. # Force nlr code to always be compiled with space-saving optimisation so
  254. # that the function preludes are of a minimal and predictable form.
  255. $(PY_BUILD)/nlr%.o: CFLAGS += -Os
  256. # optimising gc for speed; 5ms down to 4ms on pybv2
  257. $(PY_BUILD)/gc.o: CFLAGS += $(CSUPEROPT)
  258. # optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
  259. $(PY_BUILD)/vm.o: CFLAGS += $(CSUPEROPT)
  260. # Optimizing vm.o for modern deeply pipelined CPUs with branch predictors
  261. # may require disabling tail jump optimization. This will make sure that
  262. # each opcode has its own dispatching jump which will improve branch
  263. # branch predictor efficiency.
  264. # https://marc.info/?l=lua-l&m=129778596120851
  265. # http://hg.python.org/cpython/file/b127046831e2/Python/ceval.c#l828
  266. # http://www.emulators.com/docs/nx25_nostradamus.htm
  267. #-fno-crossjumping
  268. # Include rules for extmod related code
  269. include $(TOP)/extmod/extmod.mk