py.mk 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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. # some code is performance bottleneck and compiled with other optimization options
  13. CSUPEROPT = -O3
  14. # this sets the config file for FatFs
  15. CFLAGS_MOD += -DFFCONF_H=\"lib/oofatfs/ffconf.h\"
  16. ifeq ($(MICROPY_PY_USSL),1)
  17. CFLAGS_MOD += -DMICROPY_PY_USSL=1
  18. ifeq ($(MICROPY_SSL_AXTLS),1)
  19. CFLAGS_MOD += -DMICROPY_SSL_AXTLS=1 -I$(TOP)/lib/axtls/ssl -I$(TOP)/lib/axtls/crypto -I$(TOP)/lib/axtls/config
  20. LDFLAGS_MOD += -Lbuild -laxtls
  21. else ifeq ($(MICROPY_SSL_MBEDTLS),1)
  22. # Can be overridden by ports which have "builtin" mbedTLS
  23. MICROPY_SSL_MBEDTLS_INCLUDE ?= $(TOP)/lib/mbedtls/include
  24. CFLAGS_MOD += -DMICROPY_SSL_MBEDTLS=1 -I$(MICROPY_SSL_MBEDTLS_INCLUDE)
  25. LDFLAGS_MOD += -L$(TOP)/lib/mbedtls/library -lmbedx509 -lmbedtls -lmbedcrypto
  26. endif
  27. endif
  28. #ifeq ($(MICROPY_PY_LWIP),1)
  29. #CFLAGS_MOD += -DMICROPY_PY_LWIP=1 -I../lib/lwip/src/include -I../lib/lwip/src/include/ipv4 -I../extmod/lwip-include
  30. #endif
  31. ifeq ($(MICROPY_PY_LWIP),1)
  32. LWIP_DIR = lib/lwip/src
  33. INC += -I$(TOP)/lib/lwip/src/include -I$(TOP)/lib/lwip/src/include/ipv4 -I$(TOP)/extmod/lwip-include
  34. CFLAGS_MOD += -DMICROPY_PY_LWIP=1
  35. SRC_MOD += extmod/modlwip.c lib/netutils/netutils.c
  36. SRC_MOD += $(addprefix $(LWIP_DIR)/,\
  37. core/def.c \
  38. core/dns.c \
  39. core/init.c \
  40. core/mem.c \
  41. core/memp.c \
  42. core/netif.c \
  43. core/pbuf.c \
  44. core/raw.c \
  45. core/stats.c \
  46. core/sys.c \
  47. core/tcp.c \
  48. core/tcp_in.c \
  49. core/tcp_out.c \
  50. core/timers.c \
  51. core/udp.c \
  52. core/ipv4/autoip.c \
  53. core/ipv4/icmp.c \
  54. core/ipv4/igmp.c \
  55. core/ipv4/inet.c \
  56. core/ipv4/inet_chksum.c \
  57. core/ipv4/ip_addr.c \
  58. core/ipv4/ip.c \
  59. core/ipv4/ip_frag.c \
  60. )
  61. ifeq ($(MICROPY_PY_LWIP_SLIP),1)
  62. CFLAGS_MOD += -DMICROPY_PY_LWIP_SLIP=1
  63. SRC_MOD += $(LWIP_DIR)/netif/slipif.c
  64. endif
  65. endif
  66. ifeq ($(MICROPY_PY_BTREE),1)
  67. BTREE_DIR = lib/berkeley-db-1.xx
  68. BTREE_DEFS = -D__DBINTERFACE_PRIVATE=1 -Dmpool_error=printf -Dabort=abort_ -Dvirt_fd_t=mp_obj_t "-DVIRT_FD_T_HEADER=<py/obj.h>" $(BTREE_DEFS_EXTRA)
  69. INC += -I$(TOP)/$(BTREE_DIR)/PORT/include
  70. SRC_MOD += extmod/modbtree.c
  71. SRC_MOD += $(addprefix $(BTREE_DIR)/,\
  72. btree/bt_close.c \
  73. btree/bt_conv.c \
  74. btree/bt_debug.c \
  75. btree/bt_delete.c \
  76. btree/bt_get.c \
  77. btree/bt_open.c \
  78. btree/bt_overflow.c \
  79. btree/bt_page.c \
  80. btree/bt_put.c \
  81. btree/bt_search.c \
  82. btree/bt_seq.c \
  83. btree/bt_split.c \
  84. btree/bt_utils.c \
  85. mpool/mpool.c \
  86. )
  87. CFLAGS_MOD += -DMICROPY_PY_BTREE=1
  88. # we need to suppress certain warnings to get berkeley-db to compile cleanly
  89. # and we have separate BTREE_DEFS so the definitions don't interfere with other source code
  90. $(BUILD)/$(BTREE_DIR)/%.o: CFLAGS += -Wno-old-style-definition -Wno-sign-compare -Wno-unused-parameter $(BTREE_DEFS)
  91. $(BUILD)/extmod/modbtree.o: CFLAGS += $(BTREE_DEFS)
  92. endif
  93. # py object files
  94. PY_O_BASENAME = \
  95. mpstate.o \
  96. nlrx86.o \
  97. nlrx64.o \
  98. nlrthumb.o \
  99. nlrxtensa.o \
  100. nlrsetjmp.o \
  101. malloc.o \
  102. gc.o \
  103. qstr.o \
  104. vstr.o \
  105. mpprint.o \
  106. unicode.o \
  107. mpz.o \
  108. reader.o \
  109. lexer.o \
  110. parse.o \
  111. scope.o \
  112. compile.o \
  113. emitcommon.o \
  114. emitbc.o \
  115. asmbase.o \
  116. asmx64.o \
  117. emitnx64.o \
  118. asmx86.o \
  119. emitnx86.o \
  120. asmthumb.o \
  121. emitnthumb.o \
  122. emitinlinethumb.o \
  123. asmarm.o \
  124. emitnarm.o \
  125. asmxtensa.o \
  126. emitnxtensa.o \
  127. emitinlinextensa.o \
  128. formatfloat.o \
  129. parsenumbase.o \
  130. parsenum.o \
  131. emitglue.o \
  132. persistentcode.o \
  133. runtime.o \
  134. runtime_utils.o \
  135. scheduler.o \
  136. nativeglue.o \
  137. stackctrl.o \
  138. argcheck.o \
  139. warning.o \
  140. map.o \
  141. obj.o \
  142. objarray.o \
  143. objattrtuple.o \
  144. objbool.o \
  145. objboundmeth.o \
  146. objcell.o \
  147. objclosure.o \
  148. objcomplex.o \
  149. objdict.o \
  150. objenumerate.o \
  151. objexcept.o \
  152. objfilter.o \
  153. objfloat.o \
  154. objfun.o \
  155. objgenerator.o \
  156. objgetitemiter.o \
  157. objint.o \
  158. objint_longlong.o \
  159. objint_mpz.o \
  160. objlist.o \
  161. objmap.o \
  162. objmodule.o \
  163. objobject.o \
  164. objpolyiter.o \
  165. objproperty.o \
  166. objnone.o \
  167. objnamedtuple.o \
  168. objrange.o \
  169. objreversed.o \
  170. objset.o \
  171. objsingleton.o \
  172. objslice.o \
  173. objstr.o \
  174. objstrunicode.o \
  175. objstringio.o \
  176. objtuple.o \
  177. objtype.o \
  178. objzip.o \
  179. opmethods.o \
  180. sequence.o \
  181. stream.o \
  182. binary.o \
  183. builtinimport.o \
  184. builtinevex.o \
  185. builtinhelp.o \
  186. modarray.o \
  187. modbuiltins.o \
  188. modcollections.o \
  189. modgc.o \
  190. modio.o \
  191. modmath.o \
  192. modcmath.o \
  193. modmicropython.o \
  194. modstruct.o \
  195. modsys.o \
  196. moduerrno.o \
  197. modthread.o \
  198. vm.o \
  199. bc.o \
  200. showbc.o \
  201. repl.o \
  202. smallint.o \
  203. frozenmod.o \
  204. ../extmod/moductypes.o \
  205. ../extmod/modujson.o \
  206. ../extmod/modure.o \
  207. ../extmod/moduzlib.o \
  208. ../extmod/moduheapq.o \
  209. ../extmod/modutimeq.o \
  210. ../extmod/moduhashlib.o \
  211. ../extmod/modubinascii.o \
  212. ../extmod/virtpin.o \
  213. ../extmod/machine_mem.o \
  214. ../extmod/machine_pinbase.o \
  215. ../extmod/machine_signal.o \
  216. ../extmod/machine_pulse.o \
  217. ../extmod/machine_i2c.o \
  218. ../extmod/machine_spi.o \
  219. ../extmod/modussl_axtls.o \
  220. ../extmod/modussl_mbedtls.o \
  221. ../extmod/modurandom.o \
  222. ../extmod/moduselect.o \
  223. ../extmod/modwebsocket.o \
  224. ../extmod/modwebrepl.o \
  225. ../extmod/modframebuf.o \
  226. ../extmod/vfs.o \
  227. ../extmod/vfs_reader.o \
  228. ../extmod/vfs_fat.o \
  229. ../extmod/vfs_fat_diskio.o \
  230. ../extmod/vfs_fat_file.o \
  231. ../extmod/vfs_fat_misc.o \
  232. ../extmod/utime_mphal.o \
  233. ../extmod/uos_dupterm.o \
  234. ../lib/embed/abort_.o \
  235. ../lib/utils/printf.o \
  236. # prepend the build destination prefix to the py object files
  237. PY_O = $(addprefix $(PY_BUILD)/, $(PY_O_BASENAME))
  238. # object file for frozen files
  239. ifneq ($(FROZEN_DIR),)
  240. PY_O += $(BUILD)/$(BUILD)/frozen.o
  241. endif
  242. # object file for frozen bytecode (frozen .mpy files)
  243. ifneq ($(FROZEN_MPY_DIR),)
  244. PY_O += $(BUILD)/$(BUILD)/frozen_mpy.o
  245. endif
  246. # Sources that may contain qstrings
  247. SRC_QSTR_IGNORE = nlr% emitnx86% emitnx64% emitnthumb% emitnarm% emitnxtensa%
  248. SRC_QSTR = $(SRC_MOD) $(addprefix py/,$(filter-out $(SRC_QSTR_IGNORE),$(PY_O_BASENAME:.o=.c)) emitnative.c)
  249. # Anything that depends on FORCE will be considered out-of-date
  250. FORCE:
  251. .PHONY: FORCE
  252. $(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
  253. $(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@
  254. # mpconfigport.mk is optional, but changes to it may drastically change
  255. # overall config, so they need to be caught
  256. MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
  257. # qstr data
  258. # Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get
  259. # created before we run the script to generate the .h
  260. # Note: we need to protect the qstr names from the preprocessor, so we wrap
  261. # the lines in "" and then unwrap after the preprocessor is finished.
  262. $(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)
  263. $(ECHO) "GEN $@"
  264. $(Q)cat $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(CFLAGS) - | $(SED) 's/^"\(Q(.*)\)"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
  265. $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
  266. # Force nlr code to always be compiled with space-saving optimisation so
  267. # that the function preludes are of a minimal and predictable form.
  268. $(PY_BUILD)/nlr%.o: CFLAGS += -Os
  269. # emitters
  270. $(PY_BUILD)/emitnx64.o: CFLAGS += -DN_X64
  271. $(PY_BUILD)/emitnx64.o: py/emitnative.c
  272. $(call compile_c)
  273. $(PY_BUILD)/emitnx86.o: CFLAGS += -DN_X86
  274. $(PY_BUILD)/emitnx86.o: py/emitnative.c
  275. $(call compile_c)
  276. $(PY_BUILD)/emitnthumb.o: CFLAGS += -DN_THUMB
  277. $(PY_BUILD)/emitnthumb.o: py/emitnative.c
  278. $(call compile_c)
  279. $(PY_BUILD)/emitnarm.o: CFLAGS += -DN_ARM
  280. $(PY_BUILD)/emitnarm.o: py/emitnative.c
  281. $(call compile_c)
  282. $(PY_BUILD)/emitnxtensa.o: CFLAGS += -DN_XTENSA
  283. $(PY_BUILD)/emitnxtensa.o: py/emitnative.c
  284. $(call compile_c)
  285. # optimising gc for speed; 5ms down to 4ms on pybv2
  286. $(PY_BUILD)/gc.o: CFLAGS += $(CSUPEROPT)
  287. # optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
  288. $(PY_BUILD)/vm.o: CFLAGS += $(CSUPEROPT)
  289. # Optimizing vm.o for modern deeply pipelined CPUs with branch predictors
  290. # may require disabling tail jump optimization. This will make sure that
  291. # each opcode has its own dispatching jump which will improve branch
  292. # branch predictor efficiency.
  293. # http://article.gmane.org/gmane.comp.lang.lua.general/75426
  294. # http://hg.python.org/cpython/file/b127046831e2/Python/ceval.c#l828
  295. # http://www.emulators.com/docs/nx25_nostradamus.htm
  296. #-fno-crossjumping