py.mk 7.1 KB

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