py.mk 8.2 KB

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