Makefile 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. #
  2. # SPDX-License-Identifier: BSD-2-Clause
  3. #
  4. # Copyright (c) 2019 Western Digital Corporation or its affiliates.
  5. #
  6. # Authors:
  7. # Anup Patel <anup.patel@wdc.com>
  8. #
  9. # Select Make Options:
  10. # o Do not use make's built-in rules
  11. # o Do not print "Entering directory ...";
  12. MAKEFLAGS += -r --no-print-directory
  13. # Find out source, build, and install directories
  14. src_dir=$(CURDIR)
  15. ifdef O
  16. build_dir=$(shell readlink -f $(O))
  17. else
  18. build_dir=$(CURDIR)/build
  19. endif
  20. ifeq ($(build_dir),$(CURDIR))
  21. $(error Build directory is same as source directory.)
  22. endif
  23. ifdef I
  24. install_dir=$(shell readlink -f $(I))
  25. else
  26. install_dir=$(CURDIR)/install
  27. endif
  28. ifeq ($(install_dir),$(CURDIR))
  29. $(error Install directory is same as source directory.)
  30. endif
  31. ifeq ($(install_dir),$(build_dir))
  32. $(error Install directory is same as build directory.)
  33. endif
  34. # Check if verbosity is ON for build process
  35. CMD_PREFIX_DEFAULT := @
  36. ifeq ($(V), 1)
  37. CMD_PREFIX :=
  38. else
  39. CMD_PREFIX := $(CMD_PREFIX_DEFAULT)
  40. endif
  41. # Setup path of directories
  42. export platform_subdir=platform/$(PLATFORM)
  43. export platform_dir=$(CURDIR)/$(platform_subdir)
  44. export platform_common_dir=$(CURDIR)/platform/common
  45. export include_dir=$(CURDIR)/include
  46. export lib_dir=$(CURDIR)/lib
  47. export firmware_dir=$(CURDIR)/firmware
  48. # Find library version
  49. OPENSBI_VERSION_MAJOR=`grep MAJOR $(include_dir)/sbi/sbi_version.h | awk '{ print $$3 }'`
  50. OPENSBI_VERSION_MINOR=`grep MINOR $(include_dir)/sbi/sbi_version.h | awk '{ print $$3 }'`
  51. # Setup list of objects.mk files
  52. ifdef PLATFORM
  53. platform-object-mks=$(shell if [ -d $(platform_dir) ]; then find $(platform_dir) -iname "objects.mk" | sort -r; fi)
  54. platform-common-object-mks=$(shell if [ -d $(platform_common_dir) ]; then find $(platform_common_dir) -iname "objects.mk" | sort -r; fi)
  55. endif
  56. lib-object-mks=$(shell if [ -d $(lib_dir) ]; then find $(lib_dir) -iname "objects.mk" | sort -r; fi)
  57. firmware-object-mks=$(shell if [ -d $(firmware_dir) ]; then find $(firmware_dir) -iname "objects.mk" | sort -r; fi)
  58. # Include platform specifig config.mk
  59. ifdef PLATFORM
  60. include $(platform_dir)/config.mk
  61. endif
  62. # Include all object.mk files
  63. ifdef PLATFORM
  64. include $(platform-object-mks)
  65. include $(platform-common-object-mks)
  66. endif
  67. include $(lib-object-mks)
  68. include $(firmware-object-mks)
  69. # Setup list of objects
  70. lib-objs-path-y=$(foreach obj,$(lib-objs-y),$(build_dir)/lib/$(obj))
  71. ifdef PLATFORM
  72. platform-objs-path-y=$(foreach obj,$(platform-objs-y),$(build_dir)/$(platform_subdir)/$(obj))
  73. platform-dtb-path-y=$(foreach obj,$(platform-dtb-y),$(build_dir)/$(platform_subdir)/$(obj))
  74. platform-common-objs-path-y=$(foreach obj,$(platform-common-objs-y),$(build_dir)/platform/common/$(obj))
  75. firmware-bins-path-y=$(foreach bin,$(firmware-bins-y),$(build_dir)/$(platform_subdir)/firmware/$(bin))
  76. endif
  77. firmware-elfs-path-y=$(firmware-bins-path-y:.bin=.elf)
  78. firmware-objs-path-y=$(firmware-bins-path-y:.bin=.o)
  79. # Setup list of deps files for objects
  80. deps-y=$(platform-objs-path-y:.o=.dep)
  81. deps-y+=$(platform-common-objs-path-y:.o=.dep)
  82. deps-y+=$(lib-objs-path-y:.o=.dep)
  83. deps-y+=$(firmware-objs-path-y:.o=.dep)
  84. GENFLAGS = -I$(platform_dir)/include
  85. GENFLAGS += -I$(platform_common_dir)/include
  86. GENFLAGS += -I$(include_dir)
  87. GENFLAGS += $(platform-common-genflags-y)
  88. GENFLAGS += $(platform-genflags-y)
  89. GENFLAGS += $(firmware-genflags-y)
  90. # Setup compilation commands
  91. ifdef CROSS_COMPILE
  92. CC = $(CROSS_COMPILE)gcc
  93. CPP = $(CROSS_COMPILE)cpp
  94. AR = $(CROSS_COMPILE)ar
  95. LD = $(CROSS_COMPILE)ld
  96. OBJCOPY = $(CROSS_COMPILE)objcopy
  97. else
  98. CC ?= gcc
  99. CPP ?= cpp
  100. AR ?= ar
  101. LD ?= ld
  102. OBJCOPY ?= objcopy
  103. endif
  104. AS = $(CC)
  105. DTC = dtc
  106. # Guess the compillers xlen
  107. OPENSBI_CC_XLEN = `expr substr \`$(CC) -dumpmachine\` 6 2`
  108. # Setup compilation commands flags
  109. CFLAGS = -g -Wall -Werror -nostdlib -fno-strict-aliasing -O2
  110. CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
  111. CFLAGS += -mno-save-restore -mstrict-align
  112. CFLAGS += $(GENFLAGS)
  113. CFLAGS += $(platform-cflags-y)
  114. CFLAGS += $(firmware-cflags-y)
  115. CPPFLAGS += $(GENFLAGS)
  116. CPPFLAGS += $(platform-cppflags-y)
  117. CPPFLAGS += $(firmware-cppflags-y)
  118. ASFLAGS = -g -Wall -nostdlib -D__ASSEMBLY__
  119. ASFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
  120. ASFLAGS += -mno-save-restore -mstrict-align
  121. ASFLAGS += $(GENFLAGS)
  122. ASFLAGS += $(platform-asflags-y)
  123. ASFLAGS += $(firmware-asflags-y)
  124. ARFLAGS = rcs
  125. LDFLAGS += -g -Wall -nostdlib -Wl,--build-id=none -N -static-libgcc -lgcc
  126. LDFLAGS += $(platform-ldflags-y)
  127. LDFLAGS += $(firmware-ldflags-y)
  128. MERGEFLAGS += -r
  129. DTCFLAGS = -O dtb
  130. # Setup functions for compilation
  131. define dynamic_flags
  132. -I$(shell dirname $(2)) -D__OBJNAME__=$(subst -,_,$(shell basename $(1) .o))
  133. endef
  134. merge_objs = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  135. echo " MERGE $(subst $(build_dir)/,,$(1))"; \
  136. $(LD) $(MERGEFLAGS) $(2) -o $(1)
  137. merge_deps = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  138. echo " MERGE-DEP $(subst $(build_dir)/,,$(1))"; \
  139. cat $(2) > $(1)
  140. copy_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  141. echo " COPY $(subst $(build_dir)/,,$(1))"; \
  142. cp -f $(2) $(1)
  143. inst_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  144. echo " INSTALL $(subst $(install_dir)/,,$(1))"; \
  145. cp -f $(2) $(1)
  146. inst_file_list = $(CMD_PREFIX)if [ ! -z "$(4)" ]; then \
  147. mkdir -p $(1)/$(3); \
  148. for file in $(4) ; do \
  149. rel_file=`echo $$file | sed -e 's@$(2)/$(3)/@@'`; \
  150. dest_file=$(1)"/"$(3)"/"`echo $$rel_file`; \
  151. dest_dir=`dirname $$dest_file`; \
  152. echo " INSTALL "$(3)"/"`echo $$rel_file`; \
  153. mkdir -p $$dest_dir; \
  154. cp -f $$file $$dest_file; \
  155. done \
  156. fi
  157. inst_header_dir = $(CMD_PREFIX)mkdir -p $(1); \
  158. echo " INSTALL $(subst $(install_dir)/,,$(1))"; \
  159. cp -rf $(2) $(1)
  160. compile_cpp = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  161. echo " CPP $(subst $(build_dir)/,,$(1))"; \
  162. $(CPP) $(CPPFLAGS) -x c $(2) | grep -v "\#" > $(1)
  163. compile_cc_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  164. echo " CC-DEP $(subst $(build_dir)/,,$(1))"; \
  165. echo `dirname $(1)`/ \\ > $(1) && \
  166. $(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) \
  167. -MM $(2) >> $(1) || rm -f $(1)
  168. compile_cc = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  169. echo " CC $(subst $(build_dir)/,,$(1))"; \
  170. $(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) -c $(2) -o $(1)
  171. compile_as_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  172. echo " AS-DEP $(subst $(build_dir)/,,$(1))"; \
  173. echo `dirname $(1)`/ \\ > $(1) && \
  174. $(AS) $(ASFLAGS) $(call dynamic_flags,$(1),$(2)) \
  175. -MM $(2) >> $(1) || rm -f $(1)
  176. compile_as = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  177. echo " AS $(subst $(build_dir)/,,$(1))"; \
  178. $(AS) $(ASFLAGS) $(call dynamic_flags,$(1),$(2)) -c $(2) -o $(1)
  179. compile_ld = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  180. echo " LD $(subst $(build_dir)/,,$(1))"; \
  181. $(CC) $(3) $(LDFLAGS) -Wl,-T$(2) -o $(1)
  182. compile_ar = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  183. echo " AR $(subst $(build_dir)/,,$(1))"; \
  184. $(AR) $(ARFLAGS) $(1) $(2)
  185. compile_objcopy = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  186. echo " OBJCOPY $(subst $(build_dir)/,,$(1))"; \
  187. $(OBJCOPY) -S -O binary $(2) $(1)
  188. compile_dts = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  189. echo " DTC $(subst $(build_dir)/,,$(1))"; \
  190. $(DTC) $(DTCFLAGS) -o $(1) $(2)
  191. targets-y = $(build_dir)/lib/libsbi.a
  192. ifdef PLATFORM
  193. targets-y += $(build_dir)/$(platform_subdir)/lib/libplatsbi.a
  194. targets-y += $(platform-dtb-path-y)
  195. endif
  196. targets-y += $(firmware-bins-path-y)
  197. # Default rule "make" should always be first rule
  198. .PHONY: all
  199. all: $(targets-y)
  200. # Preserve all intermediate files
  201. .SECONDARY:
  202. $(build_dir)/%.bin: $(build_dir)/%.elf
  203. $(call compile_objcopy,$@,$<)
  204. $(build_dir)/%.elf: $(build_dir)/%.o $(build_dir)/%.elf.ld $(build_dir)/$(platform_subdir)/lib/libplatsbi.a
  205. $(call compile_ld,$@,$@.ld,$< $(build_dir)/$(platform_subdir)/lib/libplatsbi.a)
  206. $(build_dir)/$(platform_subdir)/%.ld: $(src_dir)/%.ldS
  207. $(call compile_cpp,$@,$<)
  208. $(build_dir)/lib/libsbi.a: $(lib-objs-path-y)
  209. $(call compile_ar,$@,$^)
  210. $(build_dir)/$(platform_subdir)/lib/libplatsbi.a: $(lib-objs-path-y) $(platform-common-objs-path-y) $(platform-objs-path-y)
  211. $(call compile_ar,$@,$^)
  212. $(build_dir)/%.dep: $(src_dir)/%.c
  213. $(call compile_cc_dep,$@,$<)
  214. $(build_dir)/%.o: $(src_dir)/%.c
  215. $(call compile_cc,$@,$<)
  216. $(build_dir)/%.dep: $(src_dir)/%.S
  217. $(call compile_as_dep,$@,$<)
  218. $(build_dir)/%.o: $(src_dir)/%.S
  219. $(call compile_as,$@,$<)
  220. $(build_dir)/$(platform_subdir)/%.dep: $(src_dir)/%.c
  221. $(call compile_cc_dep,$@,$<)
  222. $(build_dir)/$(platform_subdir)/%.o: $(src_dir)/%.c
  223. $(call compile_cc,$@,$<)
  224. $(build_dir)/$(platform_subdir)/%.dep: $(src_dir)/%.S
  225. $(call compile_as_dep,$@,$<)
  226. $(build_dir)/$(platform_subdir)/%.o: $(src_dir)/%.S
  227. $(call compile_as,$@,$<)
  228. $(build_dir)/%.dtb: $(src_dir)/%.dts
  229. $(call compile_dts,$@,$<)
  230. # Rule for "make docs"
  231. $(build_dir)/docs/latex/refman.pdf: $(build_dir)/docs/latex/refman.tex
  232. $(CMD_PREFIX)mkdir -p $(build_dir)/docs
  233. $(CMD_PREFIX)$(MAKE) -C $(build_dir)/docs/latex
  234. $(build_dir)/docs/latex/refman.tex: $(build_dir)/docs/doxygen.cfg
  235. $(CMD_PREFIX)mkdir -p $(build_dir)/docs
  236. $(CMD_PREFIX)doxygen $(build_dir)/docs/doxygen.cfg
  237. $(build_dir)/docs/doxygen.cfg: $(src_dir)/docs/doxygen.cfg
  238. $(CMD_PREFIX)mkdir -p $(build_dir)/docs
  239. $(CMD_PREFIX)cat docs/doxygen.cfg | sed -e "s#@@SRC_DIR@@#$(src_dir)#" -e "s#@@BUILD_DIR@@#$(build_dir)#" -e "s#@@OPENSBI_MAJOR@@#$(OPENSBI_VERSION_MAJOR)#" -e "s#@@OPENSBI_MINOR@@#$(OPENSBI_VERSION_MINOR)#" > $(build_dir)/docs/doxygen.cfg
  240. .PHONY: docs
  241. docs: $(build_dir)/docs/latex/refman.pdf
  242. # Dependency files should only be included after default Makefile rules
  243. # They should not be included for any "xxxconfig" or "xxxclean" rule
  244. all-deps-1 = $(if $(findstring config,$(MAKECMDGOALS)),,$(deps-y))
  245. all-deps-2 = $(if $(findstring clean,$(MAKECMDGOALS)),,$(all-deps-1))
  246. -include $(all-deps-2)
  247. # Include external dependency of firmwares after default Makefile rules
  248. include $(src_dir)/firmware/external_deps.mk
  249. install_targets-y = install_libsbi
  250. ifdef PLATFORM
  251. install_targets-y += install_libplatsbi
  252. install_targets-y += install_firmwares
  253. endif
  254. # Rule for "make install"
  255. .PHONY: install
  256. install: $(install_targets-y)
  257. .PHONY: install_libsbi
  258. install_libsbi: $(build_dir)/lib/libsbi.a
  259. $(call inst_header_dir,$(install_dir)/include,$(include_dir)/sbi)
  260. $(call inst_file,$(install_dir)/lib/libsbi.a,$(build_dir)/lib/libsbi.a)
  261. .PHONY: install_libplatsbi
  262. install_libplatsbi: $(build_dir)/$(platform_subdir)/lib/libplatsbi.a $(build_dir)/lib/libsbi.a
  263. $(call inst_file,$(install_dir)/$(platform_subdir)/lib/libplatsbi.a,$(build_dir)/$(platform_subdir)/lib/libplatsbi.a)
  264. .PHONY: install_firmwares
  265. install_firmwares: $(build_dir)/$(platform_subdir)/lib/libplatsbi.a $(build_dir)/lib/libsbi.a $(firmware-bins-path-y)
  266. $(call inst_file_list,$(install_dir),$(build_dir),$(platform_subdir)/firmware,$(firmware-elfs-path-y))
  267. $(call inst_file_list,$(install_dir),$(build_dir),$(platform_subdir)/firmware,$(firmware-bins-path-y))
  268. .PHONY: install_docs
  269. install_docs: $(build_dir)/docs/latex/refman.pdf
  270. $(call inst_file,$(install_dir)/docs/refman.pdf,$(build_dir)/docs/latex/refman.pdf)
  271. # Rule for "make clean"
  272. .PHONY: clean
  273. clean:
  274. $(CMD_PREFIX)mkdir -p $(build_dir)
  275. $(if $(V), @echo " RM $(build_dir)/*.o")
  276. $(CMD_PREFIX)find $(build_dir) -type f -name "*.o" -exec rm -rf {} +
  277. $(if $(V), @echo " RM $(build_dir)/*.a")
  278. $(CMD_PREFIX)find $(build_dir) -type f -name "*.a" -exec rm -rf {} +
  279. $(if $(V), @echo " RM $(build_dir)/*.elf")
  280. $(CMD_PREFIX)find $(build_dir) -type f -name "*.elf" -exec rm -rf {} +
  281. $(if $(V), @echo " RM $(build_dir)/*.bin")
  282. $(CMD_PREFIX)find $(build_dir) -type f -name "*.bin" -exec rm -rf {} +
  283. # Rule for "make distclean"
  284. .PHONY: distclean
  285. distclean: clean
  286. $(CMD_PREFIX)mkdir -p $(build_dir)
  287. $(if $(V), @echo " RM $(build_dir)/*.dep")
  288. $(CMD_PREFIX)find $(build_dir) -type f -name "*.dep" -exec rm -rf {} +
  289. ifeq ($(build_dir),$(CURDIR)/build)
  290. $(if $(V), @echo " RM $(build_dir)")
  291. $(CMD_PREFIX)rm -rf $(build_dir)
  292. endif
  293. ifeq ($(install_dir),$(CURDIR)/install)
  294. $(if $(V), @echo " RM $(install_dir)")
  295. $(CMD_PREFIX)rm -rf $(install_dir)
  296. endif