py.mk 8.6 KB

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