rules.mk 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. OBJ_DIR := $(OBJ_DIR)/$(TARGET)
  2. # Include source folder paths to virtual paths
  3. VPATH = $(sort $(dir $(C_SOURCES)) $(dir $(ASM_SOURCES)) $(dir $(CPP_SOURCES)))
  4. # Gather object
  5. OBJECTS = $(addprefix $(OBJ_DIR)/, $(notdir $(C_SOURCES:.c=.o)))
  6. OBJECTS += $(addprefix $(OBJ_DIR)/, $(notdir $(ASM_SOURCES:.s=.o)))
  7. OBJECTS += $(addprefix $(OBJ_DIR)/, $(notdir $(CPP_SOURCES:.cpp=.o)))
  8. # Generate dependencies
  9. DEPS = $(OBJECTS:.o=.d)
  10. ifdef DFU_SERIAL
  11. DFU_OPTIONS += -S $(DFU_SERIAL)
  12. endif
  13. $(shell test -d $(OBJ_DIR) || mkdir -p $(OBJ_DIR))
  14. BUILD_FLAGS_SHELL=\
  15. echo "$(CFLAGS)" > $(OBJ_DIR)/BUILD_FLAGS.tmp; \
  16. diff -u $(OBJ_DIR)/BUILD_FLAGS $(OBJ_DIR)/BUILD_FLAGS.tmp 2>&1 > /dev/null \
  17. && ( echo "CFLAGS ok"; rm $(OBJ_DIR)/BUILD_FLAGS.tmp) \
  18. || ( echo "CFLAGS has been changed"; mv $(OBJ_DIR)/BUILD_FLAGS.tmp $(OBJ_DIR)/BUILD_FLAGS )
  19. $(info $(shell $(BUILD_FLAGS_SHELL)))
  20. CHECK_AND_REINIT_SUBMODULES_SHELL=\
  21. if git submodule status | egrep -q '^[-]|^[+]' ; then \
  22. echo "INFO: Need to reinitialize git submodules"; \
  23. git submodule sync; \
  24. git submodule update --init; \
  25. fi
  26. $(info $(shell $(CHECK_AND_REINIT_SUBMODULES_SHELL)))
  27. all: $(OBJ_DIR)/$(PROJECT).elf $(OBJ_DIR)/$(PROJECT).hex $(OBJ_DIR)/$(PROJECT).bin $(OBJ_DIR)/$(PROJECT).dfu $(OBJ_DIR)/$(PROJECT).json
  28. @:
  29. $(OBJ_DIR)/$(PROJECT).elf: $(OBJECTS)
  30. @echo "\tLD\t" $@
  31. @$(LD) $(LDFLAGS) $(OBJECTS) -o $@
  32. @$(SZ) $@
  33. $(OBJ_DIR)/$(PROJECT).hex: $(OBJ_DIR)/$(PROJECT).elf
  34. @echo "\tHEX\t" $@
  35. @$(HEX) $< $@
  36. $(OBJ_DIR)/$(PROJECT).bin: $(OBJ_DIR)/$(PROJECT).elf
  37. @echo "\tBIN\t" $@
  38. @$(BIN) $< $@
  39. $(OBJ_DIR)/$(PROJECT).dfu: $(OBJ_DIR)/$(PROJECT).bin
  40. @echo "\tDFU\t" $@
  41. @../scripts/bin2dfu.py \
  42. -i $(OBJ_DIR)/$(PROJECT).bin \
  43. -o $(OBJ_DIR)/$(PROJECT).dfu \
  44. -a $(FLASH_ADDRESS) \
  45. -l "Flipper Zero $(shell echo $(TARGET) | tr a-z A-Z)" > /dev/null
  46. $(OBJ_DIR)/$(PROJECT).json: $(OBJ_DIR)/$(PROJECT).dfu
  47. @echo "\tJSON\t" $@
  48. @../scripts/meta.py generate -p $(PROJECT) $(CFLAGS) > $(OBJ_DIR)/$(PROJECT).json
  49. $(OBJ_DIR)/%.o: %.c $(OBJ_DIR)/BUILD_FLAGS
  50. @echo "\tCC\t" $(subst $(PROJECT_ROOT)/,,$(realpath $<)) "->" $@
  51. @$(CC) $(CFLAGS) -c $< -o $@
  52. $(OBJ_DIR)/%.o: %.s $(OBJ_DIR)/BUILD_FLAGS
  53. @echo "\tASM\t" $(subst $(PROJECT_ROOT)/,,$(realpath $<)) "->" $@
  54. @$(AS) $(CFLAGS) -c $< -o $@
  55. $(OBJ_DIR)/%.o: %.cpp $(OBJ_DIR)/BUILD_FLAGS
  56. @echo "\tCPP\t" $(subst $(PROJECT_ROOT)/,,$(realpath $<)) "->" $@
  57. @$(CPP) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
  58. $(OBJ_DIR)/flash: $(OBJ_DIR)/$(PROJECT).bin
  59. openocd $(OPENOCD_OPTS) -c "program $(OBJ_DIR)/$(PROJECT).bin reset exit $(FLASH_ADDRESS)"
  60. touch $@
  61. $(OBJ_DIR)/upload: $(OBJ_DIR)/$(PROJECT).bin
  62. dfu-util -d 0483:df11 -D $(OBJ_DIR)/$(PROJECT).bin -a 0 -s $(FLASH_ADDRESS) $(DFU_OPTIONS)
  63. touch $@
  64. flash: $(OBJ_DIR)/flash
  65. upload: $(OBJ_DIR)/upload
  66. debug: flash
  67. arm-none-eabi-gdb-py \
  68. -ex 'target extended-remote | openocd -c "gdb_port pipe" $(OPENOCD_OPTS)' \
  69. -ex "set confirm off" \
  70. -ex "source ../debug/FreeRTOS/FreeRTOS.py" \
  71. -ex "source ../debug/PyCortexMDebug/PyCortexMDebug.py" \
  72. -ex "svd_load $(SVD_FILE)" \
  73. -ex "compare-sections" \
  74. $(OBJ_DIR)/$(PROJECT).elf; \
  75. debug_other:
  76. arm-none-eabi-gdb-py \
  77. -ex 'target extended-remote | openocd -c "gdb_port pipe" $(OPENOCD_OPTS)' \
  78. -ex "set confirm off" \
  79. -ex "source ../debug/PyCortexMDebug/PyCortexMDebug.py" \
  80. -ex "svd_load $(SVD_FILE)" \
  81. blackmagic:
  82. arm-none-eabi-gdb-py \
  83. -ex 'target extended-remote $(BLACKMAGIC)' \
  84. -ex 'monitor swdp_scan' \
  85. -ex 'monitor debug_bmp enable' \
  86. -ex 'attach 1' \
  87. -ex "set confirm off" \
  88. -ex "source ../debug/FreeRTOS/FreeRTOS.py" \
  89. -ex "source ../debug/PyCortexMDebug/PyCortexMDebug.py" \
  90. -ex "svd_load $(SVD_FILE)" \
  91. -ex "compare-sections" \
  92. $(OBJ_DIR)/$(PROJECT).elf; \
  93. openocd:
  94. openocd $(OPENOCD_OPTS)
  95. clean:
  96. @echo "\tCLEAN\t"
  97. @$(RM) $(OBJ_DIR)/*
  98. z: clean
  99. $(MAKE) all
  100. zz: clean
  101. $(MAKE) flash
  102. zzz: clean
  103. $(MAKE) debug
  104. generate_cscope_db:
  105. @echo "$(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES)" | tr ' ' '\n' > $(OBJ_DIR)/source.list.p
  106. @cat ~/headers.list >> $(OBJ_DIR)/source.list.p
  107. @cat $(OBJ_DIR)/source.list.p | sed -e "s|^[^//]|$$PWD/&|g" > $(OBJ_DIR)/source.list
  108. @cscope -b -k -i $(OBJ_DIR)/source.list -f $(OBJ_DIR)/cscope.out
  109. @rm -rf $(OBJ_DIR)/source.list $(OBJ_DIR)/source.list.p
  110. # Prevent make from trying to find .d targets
  111. %.d: ;
  112. -include $(DEPS)