dynruntime.mk 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # Makefile fragment for generating native .mpy files from C source
  2. # MPY_DIR must be set to the top of the MicroPython source tree
  3. BUILD ?= build
  4. ECHO = @echo
  5. RM = /bin/rm
  6. MKDIR = /bin/mkdir
  7. PYTHON = python3
  8. MPY_CROSS = $(MPY_DIR)/mpy-cross/mpy-cross
  9. MPY_TOOL = $(PYTHON) $(MPY_DIR)/tools/mpy-tool.py
  10. MPY_LD = $(PYTHON) $(MPY_DIR)/tools/mpy_ld.py
  11. Q = @
  12. ifeq ("$(origin V)", "command line")
  13. ifeq ($(V),1)
  14. Q =
  15. MPY_LD += '-vvv'
  16. endif
  17. endif
  18. ARCH_UPPER = $(shell echo $(ARCH) | tr '[:lower:]' '[:upper:]')
  19. CONFIG_H = $(BUILD)/$(MOD).config.h
  20. CFLAGS += -I. -I$(MPY_DIR)
  21. CFLAGS += -std=c99
  22. CFLAGS += -Os
  23. CFLAGS += -Wall -Werror -DNDEBUG
  24. CFLAGS += -DNO_QSTR
  25. CFLAGS += -DMICROPY_ENABLE_DYNRUNTIME
  26. CFLAGS += -DMP_CONFIGFILE='<$(CONFIG_H)>'
  27. CFLAGS += -fpic -fno-common
  28. CFLAGS += -U _FORTIFY_SOURCE # prevent use of __*_chk libc functions
  29. #CFLAGS += -fdata-sections -ffunction-sections
  30. MPY_CROSS_FLAGS += -march=$(ARCH)
  31. SRC_O += $(addprefix $(BUILD)/, $(patsubst %.c,%.o,$(filter %.c,$(SRC))))
  32. SRC_MPY += $(addprefix $(BUILD)/, $(patsubst %.py,%.mpy,$(filter %.py,$(SRC))))
  33. ################################################################################
  34. # Architecture configuration
  35. ifeq ($(ARCH),x86)
  36. # x86
  37. CROSS =
  38. CFLAGS += -m32 -fno-stack-protector
  39. MPY_CROSS_FLAGS += -mcache-lookup-bc
  40. MICROPY_FLOAT_IMPL ?= double
  41. else ifeq ($(ARCH),x64)
  42. # x64
  43. CROSS =
  44. CFLAGS += -fno-stack-protector
  45. MPY_CROSS_FLAGS += -mcache-lookup-bc
  46. MICROPY_FLOAT_IMPL ?= double
  47. else ifeq ($(ARCH),armv7m)
  48. # thumb
  49. CROSS = arm-none-eabi-
  50. CFLAGS += -mthumb -mcpu=cortex-m3
  51. MICROPY_FLOAT_IMPL ?= none
  52. else ifeq ($(ARCH),armv7emsp)
  53. # thumb
  54. CROSS = arm-none-eabi-
  55. CFLAGS += -mthumb -mcpu=cortex-m4
  56. CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard
  57. MICROPY_FLOAT_IMPL ?= float
  58. else ifeq ($(ARCH),armv7emdp)
  59. # thumb
  60. CROSS = arm-none-eabi-
  61. CFLAGS += -mthumb -mcpu=cortex-m7
  62. CFLAGS += -mfpu=fpv5-d16 -mfloat-abi=hard
  63. MICROPY_FLOAT_IMPL ?= double
  64. else ifeq ($(ARCH),xtensa)
  65. # xtensa
  66. CROSS = xtensa-lx106-elf-
  67. CFLAGS += -mforce-l32
  68. MICROPY_FLOAT_IMPL ?= none
  69. else ifeq ($(ARCH),xtensawin)
  70. # xtensawin
  71. CROSS = xtensa-esp32-elf-
  72. CFLAGS +=
  73. MICROPY_FLOAT_IMPL ?= float
  74. else
  75. $(error architecture '$(ARCH)' not supported)
  76. endif
  77. MICROPY_FLOAT_IMPL_UPPER = $(shell echo $(MICROPY_FLOAT_IMPL) | tr '[:lower:]' '[:upper:]')
  78. CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_$(MICROPY_FLOAT_IMPL_UPPER)
  79. CFLAGS += $(CFLAGS_EXTRA)
  80. ################################################################################
  81. # Build rules
  82. .PHONY: all clean
  83. all: $(MOD).mpy
  84. clean:
  85. $(RM) -rf $(BUILD) $(CLEAN_EXTRA)
  86. # Create build destination directories first
  87. BUILD_DIRS = $(sort $(dir $(CONFIG_H) $(SRC_O) $(SRC_MPY)))
  88. $(CONFIG_H) $(SRC_O) $(SRC_MPY): | $(BUILD_DIRS)
  89. $(BUILD_DIRS):
  90. $(Q)$(MKDIR) -p $@
  91. # Preprocess all source files to generate $(CONFIG_H)
  92. $(CONFIG_H): $(SRC)
  93. $(ECHO) "GEN $@"
  94. $(Q)$(MPY_LD) --arch $(ARCH) --preprocess -o $@ $^
  95. # Build .o from .c source files
  96. $(BUILD)/%.o: %.c $(CONFIG_H) Makefile
  97. $(ECHO) "CC $<"
  98. $(Q)$(CROSS)gcc $(CFLAGS) -o $@ -c $<
  99. # Build .mpy from .py source files
  100. $(BUILD)/%.mpy: %.py
  101. $(ECHO) "MPY $<"
  102. $(Q)$(MPY_CROSS) $(MPY_CROSS_FLAGS) -o $@ $<
  103. # Build native .mpy from object files
  104. $(BUILD)/$(MOD).native.mpy: $(SRC_O)
  105. $(ECHO) "LINK $<"
  106. $(Q)$(MPY_LD) --arch $(ARCH) --qstrs $(CONFIG_H) -o $@ $^
  107. # Build final .mpy from all intermediate .mpy files
  108. $(MOD).mpy: $(BUILD)/$(MOD).native.mpy $(SRC_MPY)
  109. $(ECHO) "GEN $@"
  110. $(Q)$(MPY_TOOL) --merge -o $@ $^