Makefile 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. # SPDX-License-Identifier: Apache-2.0
  2. # Copyright (c) 2020 StarFiveTech, Inc.
  3. EMPTY :=
  4. SPACE := $(EMPTY) $(EMPTY)
  5. PROGRAM = jh7100_recovery_boot
  6. SUFFIX=$(shell date +%y%m%d)
  7. GIT_VERSION=$(shell git show -s --pretty=format:%h)
  8. VERSION=$(SUFFIX)-$(GIT_VERSION)
  9. #############################################################
  10. # Makefile Arguments
  11. #############################################################
  12. # The configuration defaults to Debug. Valid choices are:
  13. # - debug
  14. # - release
  15. CONFIGURATION ?= debug
  16. BSP_DIR ?= bsp
  17. #############################################################
  18. # BSP loading
  19. #############################################################
  20. # There must be a settings makefile fragment in the BSP's board directory.
  21. ifeq ($(wildcard $(BSP_DIR)/settings.mk),)
  22. $(error Unable to find BSP for $(TARGET), expected to find $(BSP_DIR)/settings.mk)
  23. endif
  24. # Include the BSP settings
  25. include $(BSP_DIR)/settings.mk
  26. # Check that settings.mk sets RISCV_ARCH and RISCV_ABI
  27. ifeq ($(RISCV_ARCH),)
  28. $(error $(BSP_DIR)/settings.mk must set RISCV_ARCH, the RISC-V ISA string to target)
  29. endif
  30. ifeq ($(RISCV_ABI),)
  31. $(error $(BSP_DIR)/settings.mk must set RISCV_ABI, the ABI to target)
  32. endif
  33. ifeq ($(RISCV_CMODEL),)
  34. RISCV_CMODEL = medany
  35. endif
  36. ifeq ($(LINK_TARGET),)
  37. LINK_TARGET = bootloader
  38. endif
  39. LINKER_SCRIPT = $(BSP_DIR)/$(LINK_TARGET).lds
  40. # Determines the XLEN from the toolchain tuple
  41. ifeq ($(patsubst rv32%,rv32,$(RISCV_ARCH)),rv32)
  42. RISCV_XLEN := 32
  43. else ifeq ($(patsubst rv64%,rv64,$(RISCV_ARCH)),rv64)
  44. RISCV_XLEN := 64
  45. else
  46. $(error Unable to determine XLEN from $(RISCV_ARCH))
  47. endif
  48. #############################################################
  49. # Toolchain
  50. #############################################################
  51. # Allow users to select a different cross compiler.
  52. CROSS_COMPILE = riscv64-unknown-elf-
  53. # If users don't specify RISCV_PATH then assume that the tools will just be in
  54. # their path.
  55. ifeq ($(RISCV_PATH),)
  56. CC := $(CROSS_COMPILE)gcc
  57. CXX := $(CROSS_COMPILE)g++
  58. OBJDUMP := $(CROSS_COMPILE)objdump
  59. OBJCOPY := $(CROSS_COMPILE)objcopy
  60. GDB := $(CROSS_COMPILE)gdb
  61. AR := $(CROSS_COMPILE)ar
  62. SIZE := $(CROSS_COMPILE)size
  63. else
  64. CC := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)gcc)
  65. CXX := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)g++)
  66. OBJDUMP := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)objdump)
  67. OBJCOPY := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)objcopy)
  68. GDB := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)gdb)
  69. AR := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)ar)
  70. SIZE := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)size)
  71. PATH := $(abspath $(RISCV_PATH)/bin):$(PATH)
  72. endif
  73. #############################################################
  74. # Software Flags
  75. #############################################################
  76. # Set the arch, ABI, and code model
  77. CCASFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=$(RISCV_CMODEL) -DVERSION=\"$(VERSION)\" -DCONFIGURATION=\"$(CONFIGURATION)\"
  78. CFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=$(RISCV_CMODEL) -DVERSION=\"$(VERSION)\" -DCONFIGURATION=\"$(CONFIGURATION)\"
  79. CXXFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=$(RISCV_CMODEL) -DVERSION=\"$(VERSION)\" -DCONFIGURATION=\"$(CONFIGURATION)\"
  80. ASFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=$(RISCV_CMODEL) -DVERSION=\"$(VERSION)\" -DCONFIGURATION=\"$(CONFIGURATION)\"
  81. # Prune unused functions and data
  82. CFLAGS += -ffunction-sections -fdata-sections
  83. CXXFLAGS += -ffunction-sections -fdata-sections
  84. # Use newlib-nano
  85. CCASFLAGS += --specs=nano.specs
  86. CFLAGS += --specs=nano.specs
  87. CXXFLAGS += --specs=nano.specs
  88. LDFLAGS += --specs=nano.specs
  89. # DDR speed config for c code
  90. CFLAGS += -DDDR_SPEED=$(DDR_SPEED)
  91. # Set the arch, ABI, and code model
  92. LDFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=$(RISCV_CMODEL)
  93. # Turn on garbage collection for unused sections
  94. LDFLAGS += -Wl,--gc-sections
  95. # Turn off the C standard library
  96. LDFLAGS += -nostartfiles -nostdlib
  97. # Find the linker scripts
  98. LDFLAGS += -T$(filter %.lds,$^)
  99. # Link to the relevant libraries
  100. LDLIBS += -Wl,--start-group -lc -lgcc -lm -Wl,--end-group
  101. # Load the configuration Makefile
  102. CONFIGURATION_FILE = $(wildcard $(CONFIGURATION).mk)
  103. ifeq ($(words $(CONFIGURATION_FILE)),0)
  104. $(error Unable to find the Makefile $(CONFIGURATION).mk for CONFIGURATION=$(CONFIGURATION))
  105. endif
  106. include $(CONFIGURATION).mk
  107. #############################################################
  108. # Software
  109. #############################################################
  110. OUT_DIR = $(CONFIGURATION)
  111. OBJ_DIR = $(OUT_DIR)/objs
  112. PROGRAM_ELF = $(OUT_DIR)/$(PROGRAM).elf
  113. PROGRAM_BIN = $(OUT_DIR)/$(PROGRAM).bin
  114. PROGRAM_LST = $(OUT_DIR)/$(PROGRAM).lst
  115. #############################################################
  116. # Makefile Functions
  117. #############################################################
  118. # fn_srcfiles(dirs,ext)
  119. fn_srcfiles = $(foreach d,$(1),$(wildcard $(d)/*.$(2)))
  120. # fn_depfiles(dirs,ext)
  121. fn_depfiles = $(foreach f,$(call fn_srcfiles,$(1),$(2)),$(OBJ_DIR)/$(patsubst %.$(2),%.d,$(f)))
  122. # fn_objfiles(dirs,ext)
  123. fn_objfiles = $(foreach f,$(call fn_srcfiles,$(1),$(2)),$(OBJ_DIR)/$(patsubst %.$(2),%.o,$(f)))
  124. # fn_includes(dirs)
  125. fn_includes = $(addprefix -I,$(1))
  126. #############################################################
  127. # Include and Source Dirs
  128. #############################################################
  129. INCLUDE_DIRS += \
  130. src/boot \
  131. src/common \
  132. src/driver/uart \
  133. src/driver/spi \
  134. src/driver/gpio \
  135. src/driver/timer \
  136. SOURCE_DIRS += \
  137. src/boot \
  138. src/common \
  139. src/driver/uart \
  140. src/driver/spi \
  141. src/driver/gpio \
  142. src/driver/timer \
  143. src/driver/xmodem \
  144. INCLUDES = $(call fn_includes,$(INCLUDE_DIRS))
  145. PROGRAM_SRCS = \
  146. $(call fn_srcfiles,$(SOURCE_DIRS),S) \
  147. $(call fn_srcfiles,$(SOURCE_DIRS),c) \
  148. PROGRAM_OBJS = \
  149. $(call fn_objfiles,$(SOURCE_DIRS),S) \
  150. $(call fn_objfiles,$(SOURCE_DIRS),c) \
  151. #VPATH := $(subst $(SPACE),:,$(SOURCE_DIRS) $(INCLUDE_DIRS))
  152. #############################################################
  153. # Makefile Targets
  154. #############################################################
  155. all: $(PROGRAM_ELF)
  156. #############################################################
  157. # Depenences
  158. #############################################################
  159. PROGRAM_DEPS = \
  160. $(call fn_depfiles,$(SOURCE_DIRS),S) \
  161. $(call fn_depfiles,$(SOURCE_DIRS),c) \
  162. ifneq ($(strip $(PROGRAM_DEPS)),)
  163. sinclude $(PROGRAM_DEPS)
  164. endif
  165. #############################################################
  166. # Makefile Rules
  167. #############################################################
  168. $(PROGRAM_ELF): $(PROGRAM_OBJS) $(LINKER_SCRIPT)
  169. @echo Building target: $@, VERSION=$(VERSION)
  170. @echo Invoking: GNU RISC-V Cross C Linker
  171. @if [ ! -d "$(@D)" ]; then mkdir -p "$(@D)"; fi
  172. $(CC) $(LDFLAGS) -Wl,-Map,"$(@:%.elf=%.map)" $(filter %.o,$^) $(LDLIBS) -o $@
  173. @echo Finished building target: $@
  174. @$(OBJDUMP) --source --all-headers --demangle --line-numbers --wide $@ > $(PROGRAM_LST)
  175. @$(OBJCOPY) -O binary $@ $(PROGRAM_BIN)
  176. $(OBJ_DIR)/%.o: %.c
  177. @if [ ! -d "$(@D)" ]; then mkdir -p "$(@D)"; fi
  178. @echo cc $<
  179. $(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o $@ $<
  180. $(OBJ_DIR)/%.o: %.S
  181. @if [ ! -d "$(@D)" ]; then mkdir -p "$(@D)"; fi
  182. @echo cc $<
  183. $(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o $@ $<
  184. .PHONY: debug
  185. debug:
  186. @echo ----- INCLUDES:
  187. @echo $(INCLUDES)
  188. @echo ----- PROGRAM_SRCS:
  189. @echo $(PROGRAM_SRCS)
  190. @echo ----- PROGRAM_ELF:
  191. @echo $(PROGRAM_ELF)
  192. @echo ----- PROGRAM_DEPS:
  193. @echo $(PROGRAM_DEPS)
  194. @echo ----- PROGRAM_OBJS:
  195. @echo $(PROGRAM_OBJS)
  196. .PHONY: clean
  197. clean:
  198. rm -rf $(OUT_DIR)