Makefile 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. include ../../py/mkenv.mk
  2. # qstr definitions (must come before including py.mk)
  3. QSTR_DEFS = qstrdefsport.h $(BUILD)/pins_qstr.h
  4. # include py core make definitions
  5. include $(TOP)/py/py.mk
  6. # If you set USE_ARDUINO_TOOLCHAIN=1 then this makefile will attempt to use
  7. # the toolchain that comes with Teensyduino
  8. ifeq ($(USE_ARDUINO_TOOLCHAIN),)
  9. USE_ARDUINO_TOOLCHAIN = 0
  10. endif
  11. ifeq ($(USE_ARDUINO_TOOLCHAIN),1)
  12. ifeq ($(ARDUINO),)
  13. $(error USE_ARDUINO_TOOLCHAIN requires that ARDUINO be set)
  14. endif
  15. endif
  16. ifeq ($(USE_ARDUINO_TOOLCHAIN),1)
  17. $(info Using ARDUINO toolchain)
  18. CROSS_COMPILE = $(ARDUINO)/hardware/tools/arm-none-eabi/bin/arm-none-eabi-
  19. else
  20. $(info Using toolchain from PATH)
  21. CROSS_COMPILE = arm-none-eabi-
  22. endif
  23. CFLAGS_TEENSY = -DF_CPU=96000000 -DUSB_SERIAL -D__MK20DX256__
  24. CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -msoft-float -mfloat-abi=soft -fsingle-precision-constant -Wdouble-promotion $(CFLAGS_TEENSY)
  25. INC += -I.
  26. INC += -I$(TOP)
  27. INC += -I$(TOP)/ports/stm32
  28. INC += -I$(BUILD)
  29. INC += -Icore
  30. CFLAGS = $(INC) -Wall -Wpointer-arith -std=gnu99 -nostdlib $(CFLAGS_CORTEX_M4)
  31. LDFLAGS = -nostdlib -T mk20dx256.ld -msoft-float -mfloat-abi=soft
  32. ifeq ($(USE_ARDUINO_TOOLCHAIN),1)
  33. LIBGCC_FILE_NAME = $(ARDUINO)/hardware/tools/arm-none-eabi/lib/gcc/arm-none-eabi/4.7.2/thumb2/libgcc.a
  34. LIBM_FILE_NAME = $(ARDUINO)/hardware/tools/arm-none-eabi/arm-none-eabi/lib/thumb2/libm.a
  35. LIBC_FILE_NAME = $(ARDUINO)/hardware/tools/arm-none-eabi/arm-none-eabi/lib/thumb2/libc.a
  36. else
  37. LIBGCC_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
  38. LIBM_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-file-name=libm.a)
  39. LIBC_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-file-name=libc.a)
  40. endif
  41. #$(info %%%%% LIBGCC_FILE_NAME = $(LIBGCC_FILE_NAME))
  42. #$(info %%%%% LIBM_FILE_NAME = $(LIBM_FILE_NAME))
  43. #$(info %%%%% LIBC_FILE_NAME = $(LIBC_FILE_NAME))
  44. #$(info %%%%% dirname LIBGCC_FILE_NAME = $(dir $(LIBGCC_FILE_NAME)))
  45. #$(info %%%%% dirname LIBM_FILE_NAME = $(dir $(LIBM_FILE_NAME)))
  46. #$(info %%%%% dirname LIBC_FILE_NAME = $(dir $(LIBC_FILE_NAME)))
  47. LIBS = -L $(dir $(LIBM_FILE_NAME)) -lm
  48. LIBS += -L $(dir $(LIBC_FILE_NAME)) -lc
  49. LIBS += -L $(dir $(LIBGCC_FILE_NAME)) -lgcc
  50. #Debugging/Optimization
  51. ifdef DEBUG
  52. CFLAGS += -Og -ggdb
  53. else
  54. CFLAGS += -Os #-DNDEBUG
  55. endif
  56. CFLAGS += -fdata-sections -ffunction-sections
  57. LDFLAGS += -Wl,--gc-sections
  58. USE_FROZEN = 1
  59. USE_MEMZIP = 0
  60. SRC_C = \
  61. hal_ftm.c \
  62. hal_gpio.c \
  63. help.c \
  64. main.c \
  65. lcd.c \
  66. led.c \
  67. modpyb.c \
  68. pin_defs_teensy.c \
  69. reg.c \
  70. teensy_hal.c \
  71. timer.c \
  72. uart.c \
  73. usb.c \
  74. STM_SRC_C = $(addprefix ports/stm32/,\
  75. gccollect.c \
  76. irq.c \
  77. pin.c \
  78. pin_named_pins.c \
  79. )
  80. STM_SRC_S = $(addprefix ports/stm32/,\
  81. gchelper.s \
  82. )
  83. LIB_SRC_C = $(addprefix lib/,\
  84. libc/string0.c \
  85. mp-readline/readline.c \
  86. utils/pyexec.c \
  87. utils/sys_stdio_mphal.c \
  88. )
  89. SRC_TEENSY = $(addprefix core/,\
  90. mk20dx128.c \
  91. pins_teensy.c \
  92. analog.c \
  93. usb_desc.c \
  94. usb_dev.c \
  95. usb_mem.c \
  96. usb_serial.c \
  97. yield.c \
  98. )
  99. OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(STM_SRC_C:.c=.o) $(STM_SRC_S:.s=.o) $(SRC_TEENSY:.c=.o))
  100. OBJ += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o))
  101. OBJ += $(BUILD)/pins_gen.o
  102. all: hex
  103. hex: $(BUILD)/micropython.hex
  104. ifeq ($(USE_MEMZIP),1)
  105. SRC_C += \
  106. lib/memzip/import.c \
  107. lib/memzip/lexermemzip.c \
  108. lib/memzip/memzip.c \
  109. OBJ += $(BUILD)/memzip-files.o
  110. MAKE_MEMZIP = $(TOP)/lib/memzip/make-memzip.py
  111. ifeq ($(MEMZIP_DIR),)
  112. MEMZIP_DIR = memzip_files
  113. endif
  114. $(BUILD)/memzip-files.o: $(BUILD)/memzip-files.c
  115. $(call compile_c)
  116. $(BUILD)/memzip-files.c: $(shell find ${MEMZIP_DIR} -type f)
  117. @$(ECHO) "Creating $@"
  118. $(Q)$(PYTHON) $(MAKE_MEMZIP) --zip-file $(BUILD)/memzip-files.zip --c-file $@ $(MEMZIP_DIR)
  119. endif # USE_MEMZIP
  120. ifeq ($(USE_FROZEN),1)
  121. ifeq ($(FROZEN_DIR),)
  122. FROZEN_DIR = memzip_files
  123. endif
  124. CFLAGS += -DMICROPY_MODULE_FROZEN_STR
  125. SRC_C += \
  126. lexerfrozen.c \
  127. $(BUILD)/frozen.c
  128. endif # USE_FROZEN
  129. ifeq ($(ARDUINO),)
  130. post_compile: $(BUILD)/micropython.hex
  131. $(ECHO) "Please define ARDUINO (where TeensyDuino is installed)"
  132. exit 1
  133. reboot:
  134. $(ECHO) "Please define ARDUINO (where TeensyDuino is installed)"
  135. exit 1
  136. else
  137. TOOLS_PATH = $(ARDUINO)/hardware/tools
  138. post_compile: $(BUILD)/micropython.hex
  139. $(ECHO) "Preparing $@ for upload"
  140. $(Q)$(TOOLS_PATH)/teensy_post_compile -file="$(basename $(<F))" -path="$(abspath $(<D))" -tools="$(TOOLS_PATH)"
  141. reboot:
  142. $(ECHO) "REBOOT"
  143. -$(Q)$(TOOLS_PATH)/teensy_reboot
  144. endif
  145. .PHONY: deploy
  146. deploy: post_compile reboot
  147. $(BUILD)/micropython.elf: $(OBJ)
  148. $(ECHO) "LINK $@"
  149. $(Q)$(CC) $(LDFLAGS) -o "$@" -Wl,-Map,$(@:.elf=.map) $^ $(LIBS)
  150. $(Q)$(SIZE) $@
  151. $(BUILD)/%.hex: $(BUILD)/%.elf
  152. $(ECHO) "HEX $<"
  153. $(Q)$(OBJCOPY) -O ihex -R .eeprom "$<" "$@"
  154. MAKE_PINS = make-pins.py
  155. BOARD_PINS = teensy_pins.csv
  156. AF_FILE = mk20dx256_af.csv
  157. PREFIX_FILE = mk20dx256_prefix.c
  158. GEN_PINS_SRC = $(BUILD)/pins_gen.c
  159. GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
  160. GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
  161. GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
  162. GEN_PINS_AF_PY = $(BUILD)/pins_af.py
  163. # List of sources for qstr extraction
  164. SRC_QSTR += $(SRC_C) $(STM_SRC_C) $(LIB_SRC_C)
  165. # Append any auto-generated sources that are needed by sources listed in
  166. # SRC_QSTR
  167. SRC_QSTR_AUTO_DEPS +=
  168. # Making OBJ use an order-only depenedency on the generated pins.h file
  169. # has the side effect of making the pins.h file before we actually compile
  170. # any of the objects. The normal dependency generation will deal with the
  171. # case when pins.h is modified. But when it doesn't exist, we don't know
  172. # which source files might need it.
  173. $(OBJ): | $(HEADER_BUILD)/pins.h
  174. # Use a pattern rule here so that make will only call make-pins.py once to make
  175. # both pins_$(BOARD).c and pins.h
  176. $(BUILD)/%_gen.c $(HEADER_BUILD)/%.h $(HEADER_BUILD)/%_af_const.h $(BUILD)/%_qstr.h: teensy_%.csv $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
  177. $(ECHO) "Create $@"
  178. $(Q)$(PYTHON) $(MAKE_PINS) --board $(BOARD_PINS) --af $(AF_FILE) --prefix $(PREFIX_FILE) --hdr $(GEN_PINS_HDR) --qstr $(GEN_PINS_QSTR) --af-const $(GEN_PINS_AF_CONST) --af-py $(GEN_PINS_AF_PY) > $(GEN_PINS_SRC)
  179. $(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c
  180. $(call compile_c)
  181. $(BUILD)/%.pp: $(BUILD)/%.c
  182. $(ECHO) "PreProcess $<"
  183. $(Q)$(CC) $(CFLAGS) -E -Wp,-C,-dD,-dI -o $@ $<
  184. include $(TOP)/py/mkrules.mk