Makefile 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. # DDR speed config for c code
  89. CFLAGS += -DDDR_SPEED=$(DDR_SPEED)
  90. # Set the arch, ABI, and code model
  91. LDFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=$(RISCV_CMODEL)
  92. # Turn on garbage collection for unused sections
  93. LDFLAGS += -Wl,--gc-sections
  94. # Turn off the C standard library
  95. LDFLAGS += -nostartfiles -nostdlib
  96. # Find the linker scripts
  97. LDFLAGS += -T$(filter %.lds,$^)
  98. # Link to the relevant libraries
  99. LDLIBS += -Wl,--start-group -lc -lgcc -lm -Wl,--end-group
  100. # Load the configuration Makefile
  101. CONFIGURATION_FILE = $(wildcard $(CONFIGURATION).mk)
  102. ifeq ($(words $(CONFIGURATION_FILE)),0)
  103. $(error Unable to find the Makefile $(CONFIGURATION).mk for CONFIGURATION=$(CONFIGURATION))
  104. endif
  105. include $(CONFIGURATION).mk
  106. #############################################################
  107. # Software
  108. #############################################################
  109. OUT_DIR = $(CONFIGURATION)
  110. OBJ_DIR = $(OUT_DIR)/objs
  111. PROGRAM_ELF = $(OUT_DIR)/$(PROGRAM).elf
  112. PROGRAM_BIN = $(OUT_DIR)/$(PROGRAM).bin
  113. PROGRAM_LST = $(OUT_DIR)/$(PROGRAM).lst
  114. #############################################################
  115. # Makefile Functions
  116. #############################################################
  117. # fn_srcfiles(dirs,ext)
  118. fn_srcfiles = $(foreach d,$(1),$(wildcard $(d)/*.$(2)))
  119. # fn_depfiles(dirs,ext)
  120. fn_depfiles = $(foreach f,$(call fn_srcfiles,$(1),$(2)),$(OBJ_DIR)/$(patsubst %.$(2),%.d,$(f)))
  121. # fn_objfiles(dirs,ext)
  122. fn_objfiles = $(foreach f,$(call fn_srcfiles,$(1),$(2)),$(OBJ_DIR)/$(patsubst %.$(2),%.o,$(f)))
  123. # fn_includes(dirs)
  124. fn_includes = $(addprefix -I,$(1))
  125. #############################################################
  126. # Include and Source Dirs
  127. #############################################################
  128. INCLUDE_DIRS += \
  129. src/boot \
  130. src/common \
  131. src/driver/uart \
  132. src/driver/spi \
  133. src/driver/gpio \
  134. src/driver/timer \
  135. SOURCE_DIRS += \
  136. src/boot \
  137. src/common \
  138. src/driver/uart \
  139. src/driver/spi \
  140. src/driver/gpio \
  141. src/driver/timer \
  142. src/driver/xmodem \
  143. INCLUDES = $(call fn_includes,$(INCLUDE_DIRS))
  144. PROGRAM_SRCS = \
  145. $(call fn_srcfiles,$(SOURCE_DIRS),S) \
  146. $(call fn_srcfiles,$(SOURCE_DIRS),c) \
  147. PROGRAM_OBJS = \
  148. $(call fn_objfiles,$(SOURCE_DIRS),S) \
  149. $(call fn_objfiles,$(SOURCE_DIRS),c) \
  150. #VPATH := $(subst $(SPACE),:,$(SOURCE_DIRS) $(INCLUDE_DIRS))
  151. #############################################################
  152. # Makefile Targets
  153. #############################################################
  154. all: $(PROGRAM_ELF)
  155. #############################################################
  156. # Depenences
  157. #############################################################
  158. PROGRAM_DEPS = \
  159. $(call fn_depfiles,$(SOURCE_DIRS),S) \
  160. $(call fn_depfiles,$(SOURCE_DIRS),c) \
  161. ifneq ($(strip $(PROGRAM_DEPS)),)
  162. sinclude $(PROGRAM_DEPS)
  163. endif
  164. #############################################################
  165. # Makefile Rules
  166. #############################################################
  167. $(PROGRAM_ELF): $(PROGRAM_OBJS) $(LINKER_SCRIPT)
  168. @echo Building target: $@, VERSION=$(VERSION)
  169. @echo Invoking: GNU RISC-V Cross C Linker
  170. @if [ ! -d "$(@D)" ]; then mkdir -p "$(@D)"; fi
  171. $(CC) $(LDFLAGS) -Wl,-Map,"$(@:%.elf=%.map)" $(filter %.o,$^) $(LDLIBS) -o $@
  172. @echo Finished building target: $@
  173. @$(OBJDUMP) --source --all-headers --demangle --line-numbers --wide $@ > $(PROGRAM_LST)
  174. @$(OBJCOPY) -O binary $@ $(PROGRAM_BIN)
  175. $(OBJ_DIR)/%.o: %.c
  176. @if [ ! -d "$(@D)" ]; then mkdir -p "$(@D)"; fi
  177. @echo cc $<
  178. $(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o $@ $<
  179. $(OBJ_DIR)/%.o: %.S
  180. @if [ ! -d "$(@D)" ]; then mkdir -p "$(@D)"; fi
  181. @echo cc $<
  182. $(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o $@ $<
  183. .PHONY: debug
  184. debug:
  185. @echo ----- INCLUDES:
  186. @echo $(INCLUDES)
  187. @echo ----- PROGRAM_SRCS:
  188. @echo $(PROGRAM_SRCS)
  189. @echo ----- PROGRAM_ELF:
  190. @echo $(PROGRAM_ELF)
  191. @echo ----- PROGRAM_DEPS:
  192. @echo $(PROGRAM_DEPS)
  193. @echo ----- PROGRAM_OBJS:
  194. @echo $(PROGRAM_OBJS)
  195. .PHONY: clean
  196. clean:
  197. rm -rf $(OUT_DIR)