Makefile.common 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. DEVICE := NRF51
  2. DEVICESERIES := nrf51
  3. SDK_INCLUDE_PATH = $(SDK_PATH)/Include/
  4. SDK_SOURCE_PATH = $(SDK_PATH)/Source/
  5. TEMPLATE_PATH += $(SDK_SOURCE_PATH)/templates/gcc/
  6. OUTPUT_BINARY_DIRECTORY := _build
  7. ifeq ($(OS),Windows_NT)
  8. include $(TEMPLATE_PATH)Makefile.windows
  9. else
  10. include $(TEMPLATE_PATH)Makefile.posix
  11. endif
  12. ifeq ($(LINKER_SCRIPT),)
  13. ifeq ($(USE_SOFTDEVICE), S110)
  14. LINKER_SCRIPT = gcc_$(DEVICESERIES)_s110_$(DEVICE_VARIANT).ld
  15. OUTPUT_FILENAME := $(OUTPUT_FILENAME)_s110_$(DEVICE_VARIANT)
  16. else
  17. ifeq ($(USE_SOFTDEVICE), S210)
  18. LINKER_SCRIPT = gcc_$(DEVICESERIES)_s210_$(DEVICE_VARIANT).ld
  19. OUTPUT_FILENAME := $(OUTPUT_FILENAME)_s210_$(DEVICE_VARIANT)
  20. else
  21. LINKER_SCRIPT = gcc_$(DEVICESERIES)_blank_$(DEVICE_VARIANT).ld
  22. OUTPUT_FILENAME := $(OUTPUT_FILENAME)_$(DEVICE_VARIANT)
  23. endif
  24. endif
  25. else
  26. # Use externally defined settings
  27. endif
  28. CPU := cortex-m0
  29. # Toolchain commands
  30. CC := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc"
  31. AS := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as"
  32. AR := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar" -r
  33. LD := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld"
  34. NM := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm"
  35. OBJDUMP := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump"
  36. OBJCOPY := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy"
  37. MK := mkdir
  38. RM := rm -rf
  39. OBJECT_DIRECTORY := _build
  40. LISTING_DIRECTORY := _build
  41. C_SOURCE_FILES += system_$(DEVICESERIES).c
  42. ASSEMBLER_SOURCE_FILES += gcc_startup_$(DEVICESERIES).s
  43. # Linker flags
  44. #LDFLAGS += -L"$(GNU_INSTALL_ROOT)/arm-none-eabi/lib/armv6-m"
  45. #LDFLAGS += -L"$(GNU_INSTALL_ROOT)/lib/gcc/arm-none-eabi/$(GNU_VERSION)/armv6-m"
  46. LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map
  47. LDFLAGS += -mcpu=$(CPU) -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT)
  48. # Compiler flags
  49. CFLAGS += -mcpu=$(CPU) -mthumb -mabi=aapcs -D$(DEVICE) -D$(BOARD) -D$(TARGET_CHIP) --std=gnu99
  50. CFLAGS += -Wall -Werror
  51. CFLAGS += -mfloat-abi=soft
  52. # Assembler flags
  53. ASMFLAGS += -x assembler-with-cpp
  54. INCLUDEPATHS += -I"../"
  55. INCLUDEPATHS += -I"$(SDK_PATH)Include"
  56. INCLUDEPATHS += -I"$(SDK_PATH)Include/gcc"
  57. INCLUDEPATHS += -I"$(SDK_PATH)Include/ext_sensors"
  58. # Sorting removes duplicates
  59. BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY) )
  60. ####################################################################
  61. # Rules #
  62. ####################################################################
  63. C_SOURCE_FILENAMES = $(notdir $(C_SOURCE_FILES) )
  64. ASSEMBLER_SOURCE_FILENAMES = $(notdir $(ASSEMBLER_SOURCE_FILES) )
  65. # Make a list of source paths
  66. C_SOURCE_PATHS += ../ $(SDK_SOURCE_PATH) $(TEMPLATE_PATH) $(wildcard $(SDK_SOURCE_PATH)*/) $(wildcard $(SDK_SOURCE_PATH)ext_sensors/*/) $(wildcard $(SDK_SOURCE_PATH)ble/*/)
  67. ASSEMBLER_SOURCE_PATHS = ../ $(SDK_SOURCE_PATH) $(TEMPLATE_PATH) $(wildcard $(SDK_SOURCE_PATH)*/)
  68. C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=.o) )
  69. ASSEMBLER_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASSEMBLER_SOURCE_FILENAMES:.s=.o) )
  70. # Set source lookup paths
  71. vpath %.c $(C_SOURCE_PATHS)
  72. vpath %.s $(ASSEMBLER_SOURCE_PATHS)
  73. # Include automatically previously generated dependencies
  74. -include $(addprefix $(OBJECT_DIRECTORY)/, $(COBJS:.o=.d))
  75. ### Targets
  76. debug: CFLAGS += -DDEBUG -g3 -O0
  77. debug: ASMFLAGS += -DDEBUG -g3 -O0
  78. debug: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex
  79. .PHONY: release
  80. release: clean
  81. release: CFLAGS += -DNDEBUG -O3
  82. release: ASMFLAGS += -DNDEBUG -O3
  83. release: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex
  84. echostuff:
  85. @echo C_OBJECTS: [$(C_OBJECTS)]
  86. @echo C_SOURCE_FILES: [$(C_SOURCE_FILES)]
  87. @echo C_SOURCE_PATHS: [$(C_SOURCE_PATHS)]
  88. ## Create build directories
  89. $(BUILD_DIRECTORIES):
  90. $(MK) $@
  91. ## Create objects from C source files
  92. $(OBJECT_DIRECTORY)/%.o: %.c
  93. # Build header dependencies
  94. $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=.d)" -MT $@
  95. # Do the actual compilation
  96. $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o $@ $<
  97. ## Assemble .s files
  98. $(OBJECT_DIRECTORY)/%.o: %.s
  99. $(CC) $(ASMFLAGS) $(INCLUDEPATHS) -c -o $@ $<
  100. ## Link C and assembler objects to an .out file
  101. $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES)
  102. $(CC) $(LDFLAGS) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
  103. ## Create binary .bin file from the .out file
  104. $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
  105. $(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin
  106. ## Create binary .hex file from the .out file
  107. $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
  108. $(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex
  109. ## Default build target
  110. .PHONY: all
  111. all: clean release
  112. clean:
  113. $(RM) $(OUTPUT_BINARY_DIRECTORY)
  114. ## Program device
  115. .PHONY: flash
  116. flash: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex
  117. nrfjprog --reset --program $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex
  118. .PHONY: reset
  119. reset:
  120. nrfjprog --reset
  121. .PHONY: erase
  122. erase:
  123. nrfjprog --erase