Makefile 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  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. # Readlink -f requires GNU readlink
  14. ifeq ($(shell uname -s),Darwin)
  15. READLINK ?= greadlink
  16. else
  17. READLINK ?= readlink
  18. endif
  19. # Find out source, build, and install directories
  20. src_dir=$(CURDIR)
  21. ifdef O
  22. build_dir=$(shell $(READLINK) -f $(O))
  23. else
  24. build_dir=$(CURDIR)/build
  25. endif
  26. ifeq ($(build_dir),$(CURDIR))
  27. $(error Build directory is same as source directory.)
  28. endif
  29. install_root_dir_default=$(CURDIR)/install
  30. ifdef I
  31. install_root_dir=$(shell $(READLINK) -f $(I))
  32. else
  33. install_root_dir=$(install_root_dir_default)/usr
  34. endif
  35. ifeq ($(install_root_dir),$(CURDIR))
  36. $(error Install root directory is same as source directory.)
  37. endif
  38. ifeq ($(install_root_dir),$(build_dir))
  39. $(error Install root directory is same as build directory.)
  40. endif
  41. ifdef PLATFORM_DIR
  42. platform_dir_path=$(shell $(READLINK) -f $(PLATFORM_DIR))
  43. ifdef PLATFORM
  44. platform_parent_dir=$(platform_dir_path)
  45. else
  46. PLATFORM=$(shell basename $(platform_dir_path))
  47. platform_parent_dir=$(subst $(PLATFORM),,$(platform_dir_path))
  48. endif
  49. else
  50. platform_parent_dir=$(src_dir)/platform
  51. endif
  52. # Check if verbosity is ON for build process
  53. CMD_PREFIX_DEFAULT := @
  54. ifeq ($(V), 1)
  55. CMD_PREFIX :=
  56. else
  57. CMD_PREFIX := $(CMD_PREFIX_DEFAULT)
  58. endif
  59. # Setup path of directories
  60. export platform_subdir=$(PLATFORM)
  61. export platform_src_dir=$(platform_parent_dir)/$(platform_subdir)
  62. export platform_build_dir=$(build_dir)/platform/$(platform_subdir)
  63. export include_dir=$(CURDIR)/include
  64. export libsbi_dir=$(CURDIR)/lib/sbi
  65. export libsbiutils_dir=$(CURDIR)/lib/utils
  66. export firmware_dir=$(CURDIR)/firmware
  67. # Find library version
  68. OPENSBI_VERSION_MAJOR=`grep "define OPENSBI_VERSION_MAJOR" $(include_dir)/sbi/sbi_version.h | sed 's/.*MAJOR.*\([0-9][0-9]*\)/\1/'`
  69. OPENSBI_VERSION_MINOR=`grep "define OPENSBI_VERSION_MINOR" $(include_dir)/sbi/sbi_version.h | sed 's/.*MINOR.*\([0-9][0-9]*\)/\1/'`
  70. OPENSBI_VERSION_GIT=$(shell if [ -d $(src_dir)/.git ]; then git describe 2> /dev/null; fi)
  71. # Setup compilation commands
  72. ifdef CROSS_COMPILE
  73. CC = $(CROSS_COMPILE)gcc
  74. CPP = $(CROSS_COMPILE)cpp
  75. AR = $(CROSS_COMPILE)ar
  76. LD = $(CROSS_COMPILE)ld
  77. OBJCOPY = $(CROSS_COMPILE)objcopy
  78. else
  79. CC ?= gcc
  80. CPP ?= cpp
  81. AR ?= ar
  82. LD ?= ld
  83. OBJCOPY ?= objcopy
  84. endif
  85. AS = $(CC)
  86. DTC = dtc
  87. # Guess the compillers xlen
  88. OPENSBI_CC_XLEN := $(shell TMP=`$(CC) -dumpmachine | sed 's/riscv\([0-9][0-9]\).*/\1/'`; echo $${TMP})
  89. OPENSBI_CC_ABI := $(shell TMP=`$(CC) -v 2>&1 | sed -n 's/.*\(with\-abi=\([a-zA-Z0-9]*\)\).*/\2/p'`; echo $${TMP})
  90. OPENSBI_CC_ISA := $(shell TMP=`$(CC) -v 2>&1 | sed -n 's/.*\(with\-arch=\([a-zA-Z0-9]*\)\).*/\2/p'`; echo $${TMP})
  91. # Setup platform XLEN
  92. ifndef PLATFORM_RISCV_XLEN
  93. ifeq ($(OPENSBI_CC_XLEN), 32)
  94. PLATFORM_RISCV_XLEN = 32
  95. else
  96. PLATFORM_RISCV_XLEN = 64
  97. endif
  98. endif
  99. # Setup list of objects.mk files
  100. ifdef PLATFORM
  101. platform-object-mks=$(shell if [ -d $(platform_src_dir)/ ]; then find $(platform_src_dir) -iname "objects.mk" | sort -r; fi)
  102. endif
  103. libsbi-object-mks=$(shell if [ -d $(libsbi_dir) ]; then find $(libsbi_dir) -iname "objects.mk" | sort -r; fi)
  104. libsbiutils-object-mks=$(shell if [ -d $(libsbiutils_dir) ]; then find $(libsbiutils_dir) -iname "objects.mk" | sort -r; fi)
  105. firmware-object-mks=$(shell if [ -d $(firmware_dir) ]; then find $(firmware_dir) -iname "objects.mk" | sort -r; fi)
  106. # Include platform specifig config.mk
  107. ifdef PLATFORM
  108. include $(platform_src_dir)/config.mk
  109. endif
  110. # Include all object.mk files
  111. ifdef PLATFORM
  112. include $(platform-object-mks)
  113. endif
  114. include $(libsbi-object-mks)
  115. include $(libsbiutils-object-mks)
  116. include $(firmware-object-mks)
  117. # Setup list of objects
  118. libsbi-objs-path-y=$(foreach obj,$(libsbi-objs-y),$(build_dir)/lib/sbi/$(obj))
  119. libsbiutils-objs-path-y=$(foreach obj,$(libsbiutils-objs-y),$(build_dir)/lib/utils/$(obj))
  120. ifdef PLATFORM
  121. platform-objs-path-y=$(foreach obj,$(platform-objs-y),$(platform_build_dir)/$(obj))
  122. firmware-bins-path-y=$(foreach bin,$(firmware-bins-y),$(platform_build_dir)/firmware/$(bin))
  123. endif
  124. firmware-elfs-path-y=$(firmware-bins-path-y:.bin=.elf)
  125. firmware-objs-path-y=$(firmware-bins-path-y:.bin=.o)
  126. # Setup list of deps files for objects
  127. deps-y=$(platform-objs-path-y:.o=.dep)
  128. deps-y+=$(libsbi-objs-path-y:.o=.dep)
  129. deps-y+=$(libsbiutils-objs-path-y:.o=.dep)
  130. deps-y+=$(firmware-objs-path-y:.o=.dep)
  131. # Setup platform ABI, ISA and Code Model
  132. ifndef PLATFORM_RISCV_ABI
  133. ifneq ($(PLATFORM_RISCV_TOOLCHAIN_DEFAULT), 1)
  134. ifeq ($(PLATFORM_RISCV_XLEN), 32)
  135. PLATFORM_RISCV_ABI = ilp$(PLATFORM_RISCV_XLEN)
  136. else
  137. PLATFORM_RISCV_ABI = lp$(PLATFORM_RISCV_XLEN)
  138. endif
  139. else
  140. PLATFORM_RISCV_ABI = $(OPENSBI_CC_ABI)
  141. endif
  142. endif
  143. ifndef PLATFORM_RISCV_ISA
  144. ifneq ($(PLATFORM_RISCV_TOOLCHAIN_DEFAULT), 1)
  145. PLATFORM_RISCV_ISA = rv$(PLATFORM_RISCV_XLEN)imafdc
  146. else
  147. PLATFORM_RISCV_ISA = $(OPENSBI_CC_ISA)
  148. endif
  149. endif
  150. ifndef PLATFORM_RISCV_CODE_MODEL
  151. PLATFORM_RISCV_CODE_MODEL = medany
  152. endif
  153. # Setup install directories
  154. ifdef INSTALL_INCLUDE_PATH
  155. install_include_path=$(INSTALL_INCLUDE_PATH)
  156. else
  157. install_include_path=include
  158. endif
  159. ifdef INSTALL_LIB_PATH
  160. install_lib_path=$(INSTALL_LIB_PATH)
  161. else
  162. ifneq ($(origin INSTALL_LIB_SUBDIR), undefined)
  163. install_lib_subdir=$(INSTALL_LIB_SUBDIR)
  164. else
  165. install_lib_subdir=$(PLATFORM_RISCV_ABI)
  166. endif
  167. install_lib_path=lib$(subst 32,,$(PLATFORM_RISCV_XLEN))/$(install_lib_subdir)
  168. endif
  169. ifdef INSTALL_FIRMWARE_PATH
  170. install_firmware_path=$(INSTALL_FIRMWARE_PATH)
  171. else
  172. install_firmware_path=share/opensbi/$(PLATFORM_RISCV_ABI)
  173. endif
  174. ifdef INSTALL_DOCS_PATH
  175. install_docs_path=$(INSTALL_DOCS_PATH)
  176. else
  177. install_docs_path=share/opensbi/docs
  178. endif
  179. # Setup compilation commands flags
  180. GENFLAGS = -I$(platform_src_dir)/include
  181. GENFLAGS += -I$(include_dir)
  182. ifneq ($(OPENSBI_VERSION_GIT),)
  183. GENFLAGS += -DOPENSBI_VERSION_GIT="\"$(OPENSBI_VERSION_GIT)\""
  184. endif
  185. GENFLAGS += $(libsbiutils-genflags-y)
  186. GENFLAGS += $(platform-genflags-y)
  187. GENFLAGS += $(firmware-genflags-y)
  188. CFLAGS = -g -Wall -Werror -ffreestanding -nostdlib -fno-strict-aliasing -O2
  189. CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
  190. CFLAGS += -mno-save-restore -mstrict-align
  191. CFLAGS += -mabi=$(PLATFORM_RISCV_ABI) -march=$(PLATFORM_RISCV_ISA)
  192. CFLAGS += -mcmodel=$(PLATFORM_RISCV_CODE_MODEL)
  193. CFLAGS += $(GENFLAGS)
  194. CFLAGS += $(platform-cflags-y)
  195. CFLAGS += -fno-pie -no-pie
  196. CFLAGS += $(firmware-cflags-y)
  197. CPPFLAGS += $(GENFLAGS)
  198. CPPFLAGS += $(platform-cppflags-y)
  199. CPPFLAGS += $(firmware-cppflags-y)
  200. ASFLAGS = -g -Wall -nostdlib
  201. ASFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
  202. ASFLAGS += -mno-save-restore -mstrict-align
  203. ASFLAGS += -mabi=$(PLATFORM_RISCV_ABI) -march=$(PLATFORM_RISCV_ISA)
  204. ASFLAGS += -mcmodel=$(PLATFORM_RISCV_CODE_MODEL)
  205. ASFLAGS += $(GENFLAGS)
  206. ASFLAGS += $(platform-asflags-y)
  207. ASFLAGS += $(firmware-asflags-y)
  208. ARFLAGS = rcs
  209. ELFFLAGS += -Wl,--build-id=none -N -static-libgcc -lgcc
  210. ELFFLAGS += $(platform-ldflags-y)
  211. ELFFLAGS += $(firmware-ldflags-y)
  212. MERGEFLAGS += -r
  213. MERGEFLAGS += -b elf$(PLATFORM_RISCV_XLEN)-littleriscv
  214. MERGEFLAGS += -m elf$(PLATFORM_RISCV_XLEN)lriscv
  215. DTSCPPFLAGS = $(CPPFLAGS) -nostdinc -nostdlib -fno-builtin -D__DTS__ -x assembler-with-cpp
  216. # Setup functions for compilation
  217. define dynamic_flags
  218. -I$(shell dirname $(2)) -D__OBJNAME__=$(subst -,_,$(shell basename $(1) .o))
  219. endef
  220. merge_objs = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  221. echo " MERGE $(subst $(build_dir)/,,$(1))"; \
  222. $(LD) $(MERGEFLAGS) $(2) -o $(1)
  223. merge_deps = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  224. echo " MERGE-DEP $(subst $(build_dir)/,,$(1))"; \
  225. cat $(2) > $(1)
  226. copy_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  227. echo " COPY $(subst $(build_dir)/,,$(1))"; \
  228. cp -f $(2) $(1)
  229. inst_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  230. echo " INSTALL $(subst $(install_root_dir)/,,$(1))"; \
  231. cp -f $(2) $(1)
  232. inst_file_list = $(CMD_PREFIX)if [ ! -z "$(4)" ]; then \
  233. mkdir -p $(1)/$(3); \
  234. for file in $(4) ; do \
  235. rel_file=`echo $$file | sed -e 's@$(2)/$(subst $(install_firmware_path),platform,$(3))@@'`; \
  236. dest_file=$(1)"/"$(3)"/"`echo $$rel_file`; \
  237. dest_dir=`dirname $$dest_file`; \
  238. echo " INSTALL "$(3)"/"`echo $$rel_file`; \
  239. mkdir -p $$dest_dir; \
  240. cp -f $$file $$dest_file; \
  241. done \
  242. fi
  243. inst_header_dir = $(CMD_PREFIX)mkdir -p $(1); \
  244. echo " INSTALL $(subst $(install_root_dir)/,,$(1))"; \
  245. cp -rf $(2) $(1)
  246. compile_cpp = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  247. echo " CPP $(subst $(build_dir)/,,$(1))"; \
  248. $(CPP) $(CPPFLAGS) -x c $(2) | grep -v "\#" > $(1)
  249. compile_cc_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  250. echo " CC-DEP $(subst $(build_dir)/,,$(1))"; \
  251. printf %s `dirname $(1)`/ > $(1) && \
  252. $(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) \
  253. -MM $(2) >> $(1) || rm -f $(1)
  254. compile_cc = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  255. echo " CC $(subst $(build_dir)/,,$(1))"; \
  256. $(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) -c $(2) -o $(1)
  257. compile_as_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  258. echo " AS-DEP $(subst $(build_dir)/,,$(1))"; \
  259. printf %s `dirname $(1)`/ > $(1) && \
  260. $(AS) $(ASFLAGS) $(call dynamic_flags,$(1),$(2)) \
  261. -MM $(2) >> $(1) || rm -f $(1)
  262. compile_as = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  263. echo " AS $(subst $(build_dir)/,,$(1))"; \
  264. $(AS) $(ASFLAGS) $(call dynamic_flags,$(1),$(2)) -c $(2) -o $(1)
  265. compile_elf = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  266. echo " ELF $(subst $(build_dir)/,,$(1))"; \
  267. $(CC) $(CFLAGS) $(3) $(ELFFLAGS) -Wl,-T$(2) -o $(1)
  268. compile_ar = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  269. echo " AR $(subst $(build_dir)/,,$(1))"; \
  270. $(AR) $(ARFLAGS) $(1) $(2)
  271. compile_objcopy = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  272. echo " OBJCOPY $(subst $(build_dir)/,,$(1))"; \
  273. $(OBJCOPY) -S -O binary $(2) $(1)
  274. compile_dts = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  275. echo " DTC $(subst $(build_dir)/,,$(1))"; \
  276. $(CPP) $(DTSCPPFLAGS) $(2) | $(DTC) -O dtb -i `dirname $(2)` -o $(1)
  277. compile_d2c = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  278. echo " D2C $(subst $(build_dir)/,,$(1))"; \
  279. $(if $($(2)-varalign-$(3)),$(eval D2C_ALIGN_BYTES := $($(2)-varalign-$(3))),$(eval D2C_ALIGN_BYTES := $(4))) \
  280. $(if $($(2)-varprefix-$(3)),$(eval D2C_NAME_PREFIX := $($(2)-varprefix-$(3))),$(eval D2C_NAME_PREFIX := $(5))) \
  281. $(if $($(2)-padding-$(3)),$(eval D2C_PADDING_BYTES := $($(2)-padding-$(3))),$(eval D2C_PADDING_BYTES := 0)) \
  282. $(src_dir)/scripts/d2c.sh -i $(6) -a $(D2C_ALIGN_BYTES) -p $(D2C_NAME_PREFIX) -t $(D2C_PADDING_BYTES) > $(1)
  283. compile_gen_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
  284. echo " GEN-DEP $(subst $(build_dir)/,,$(1))"; \
  285. echo "$(1:.dep=$(2)): $(3)" >> $(1)
  286. targets-y = $(build_dir)/lib/libsbi.a
  287. targets-y += $(build_dir)/lib/libsbiutils.a
  288. ifdef PLATFORM
  289. targets-y += $(platform_build_dir)/lib/libplatsbi.a
  290. endif
  291. targets-y += $(firmware-bins-path-y)
  292. # Default rule "make" should always be first rule
  293. .PHONY: all
  294. all: $(targets-y)
  295. # Preserve all intermediate files
  296. .SECONDARY:
  297. $(build_dir)/lib/libsbi.a: $(libsbi-objs-path-y)
  298. $(call compile_ar,$@,$^)
  299. $(build_dir)/lib/libsbiutils.a: $(libsbi-objs-path-y) $(libsbiutils-objs-path-y)
  300. $(call compile_ar,$@,$^)
  301. $(platform_build_dir)/lib/libplatsbi.a: $(libsbi-objs-path-y) $(libsbiutils-objs-path-y) $(platform-objs-path-y)
  302. $(call compile_ar,$@,$^)
  303. $(build_dir)/%.dep: $(src_dir)/%.c
  304. $(call compile_cc_dep,$@,$<)
  305. $(build_dir)/%.o: $(src_dir)/%.c
  306. $(call compile_cc,$@,$<)
  307. $(build_dir)/%.dep: $(src_dir)/%.S
  308. $(call compile_as_dep,$@,$<)
  309. $(build_dir)/%.o: $(src_dir)/%.S
  310. $(call compile_as,$@,$<)
  311. $(platform_build_dir)/%.bin: $(platform_build_dir)/%.elf
  312. $(call compile_objcopy,$@,$<)
  313. $(platform_build_dir)/%.elf: $(platform_build_dir)/%.o $(platform_build_dir)/%.elf.ld $(platform_build_dir)/lib/libplatsbi.a
  314. $(call compile_elf,$@,$@.ld,$< $(platform_build_dir)/lib/libplatsbi.a)
  315. $(platform_build_dir)/%.ld: $(src_dir)/%.ldS
  316. $(call compile_cpp,$@,$<)
  317. $(platform_build_dir)/%.dep: $(platform_src_dir)/%.c
  318. $(call compile_cc_dep,$@,$<)
  319. $(platform_build_dir)/%.o: $(platform_src_dir)/%.c
  320. $(call compile_cc,$@,$<)
  321. $(platform_build_dir)/%.o: $(platform_build_dir)/%.c
  322. $(call compile_cc,$@,$<)
  323. $(platform_build_dir)/%.dep: $(platform_src_dir)/%.S
  324. $(call compile_as_dep,$@,$<)
  325. $(platform_build_dir)/%.o: $(platform_src_dir)/%.S
  326. $(call compile_as,$@,$<)
  327. $(platform_build_dir)/%.dep: $(platform_src_dir)/%.dts
  328. $(call compile_gen_dep,$@,.dtb,$<)
  329. $(call compile_gen_dep,$@,.c,$(@:.dep=.dtb))
  330. $(call compile_gen_dep,$@,.o,$(@:.dep=.c))
  331. $(platform_build_dir)/%.c: $(platform_build_dir)/%.dtb
  332. $(call compile_d2c,$@,platform,$(subst .dtb,.o,$(subst /,-,$(subst $(platform_build_dir)/,,$<))),16,dt,$<)
  333. $(platform_build_dir)/%.dtb: $(platform_src_dir)/%.dts
  334. $(call compile_dts,$@,$<)
  335. $(platform_build_dir)/%.dep: $(src_dir)/%.c
  336. $(call compile_cc_dep,$@,$<)
  337. $(platform_build_dir)/%.o: $(src_dir)/%.c
  338. $(call compile_cc,$@,$<)
  339. $(platform_build_dir)/%.dep: $(src_dir)/%.S
  340. $(call compile_as_dep,$@,$<)
  341. $(platform_build_dir)/%.o: $(src_dir)/%.S
  342. $(call compile_as,$@,$<)
  343. # Rule for "make docs"
  344. $(build_dir)/docs/latex/refman.pdf: $(build_dir)/docs/latex/refman.tex
  345. $(CMD_PREFIX)mkdir -p $(build_dir)/docs
  346. $(CMD_PREFIX)$(MAKE) -C $(build_dir)/docs/latex
  347. $(build_dir)/docs/latex/refman.tex: $(build_dir)/docs/doxygen.cfg
  348. $(CMD_PREFIX)mkdir -p $(build_dir)/docs
  349. $(CMD_PREFIX)doxygen $(build_dir)/docs/doxygen.cfg
  350. $(build_dir)/docs/doxygen.cfg: $(src_dir)/docs/doxygen.cfg
  351. $(CMD_PREFIX)mkdir -p $(build_dir)/docs
  352. $(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
  353. .PHONY: docs
  354. docs: $(build_dir)/docs/latex/refman.pdf
  355. # Dependency files should only be included after default Makefile rules
  356. # They should not be included for any "xxxconfig" or "xxxclean" rule
  357. all-deps-1 = $(if $(findstring config,$(MAKECMDGOALS)),,$(deps-y))
  358. all-deps-2 = $(if $(findstring clean,$(MAKECMDGOALS)),,$(all-deps-1))
  359. -include $(all-deps-2)
  360. # Include external dependency of firmwares after default Makefile rules
  361. include $(src_dir)/firmware/external_deps.mk
  362. # Convenient "make run" command for emulated platforms
  363. .PHONY: run
  364. run: all
  365. ifneq ($(platform-runcmd),)
  366. $(platform-runcmd) $(RUN_ARGS)
  367. else
  368. ifdef PLATFORM
  369. @echo "Platform $(PLATFORM) doesn't specify a run command"
  370. @false
  371. else
  372. @echo Run command only available when targeting a platform
  373. @false
  374. endif
  375. endif
  376. install_targets-y = install_libsbi
  377. install_targets-y += install_libsbiutils
  378. ifdef PLATFORM
  379. install_targets-y += install_libplatsbi
  380. install_targets-y += install_firmwares
  381. endif
  382. # Rule for "make install"
  383. .PHONY: install
  384. install: $(install_targets-y)
  385. .PHONY: install_libsbi
  386. install_libsbi: $(build_dir)/lib/libsbi.a
  387. $(call inst_header_dir,$(install_root_dir)/$(install_include_path),$(include_dir)/sbi)
  388. $(call inst_file,$(install_root_dir)/$(install_lib_path)/libsbi.a,$(build_dir)/lib/libsbi.a)
  389. .PHONY: install_libsbiutils
  390. install_libsbiutils: $(build_dir)/lib/libsbiutils.a
  391. $(call inst_header_dir,$(install_root_dir)/$(install_include_path),$(include_dir)/sbi_utils)
  392. $(call inst_file,$(install_root_dir)/$(install_lib_path)/libsbiutils.a,$(build_dir)/lib/libsbiutils.a)
  393. .PHONY: install_libplatsbi
  394. install_libplatsbi: $(platform_build_dir)/lib/libplatsbi.a $(build_dir)/lib/libsbi.a $(build_dir)/lib/libsbiutils.a
  395. $(call inst_file,$(install_root_dir)/$(install_lib_path)/opensbi/$(platform_subdir)/lib/libplatsbi.a,$(platform_build_dir)/lib/libplatsbi.a)
  396. .PHONY: install_firmwares
  397. install_firmwares: $(platform_build_dir)/lib/libplatsbi.a $(build_dir)/lib/libsbi.a $(build_dir)/lib/libsbiutils.a $(firmware-bins-path-y)
  398. $(call inst_file_list,$(install_root_dir),$(build_dir),$(install_firmware_path)/$(platform_subdir)/firmware,$(firmware-elfs-path-y))
  399. $(call inst_file_list,$(install_root_dir),$(build_dir),$(install_firmware_path)/$(platform_subdir)/firmware,$(firmware-bins-path-y))
  400. .PHONY: install_docs
  401. install_docs: $(build_dir)/docs/latex/refman.pdf
  402. $(call inst_file,$(install_root_dir)/$(install_docs_path)/refman.pdf,$(build_dir)/docs/latex/refman.pdf)
  403. # Rule for "make clean"
  404. .PHONY: clean
  405. clean:
  406. $(CMD_PREFIX)mkdir -p $(build_dir)
  407. $(if $(V), @echo " RM $(build_dir)/*.o")
  408. $(CMD_PREFIX)find $(build_dir) -type f -name "*.o" -exec rm -rf {} +
  409. $(if $(V), @echo " RM $(build_dir)/*.a")
  410. $(CMD_PREFIX)find $(build_dir) -type f -name "*.a" -exec rm -rf {} +
  411. $(if $(V), @echo " RM $(build_dir)/*.elf")
  412. $(CMD_PREFIX)find $(build_dir) -type f -name "*.elf" -exec rm -rf {} +
  413. $(if $(V), @echo " RM $(build_dir)/*.bin")
  414. $(CMD_PREFIX)find $(build_dir) -type f -name "*.bin" -exec rm -rf {} +
  415. $(if $(V), @echo " RM $(build_dir)/*.dtb")
  416. $(CMD_PREFIX)find $(build_dir) -type f -name "*.dtb" -exec rm -rf {} +
  417. # Rule for "make distclean"
  418. .PHONY: distclean
  419. distclean: clean
  420. $(CMD_PREFIX)mkdir -p $(build_dir)
  421. $(if $(V), @echo " RM $(build_dir)/*.dep")
  422. $(CMD_PREFIX)find $(build_dir) -type f -name "*.dep" -exec rm -rf {} +
  423. ifeq ($(build_dir),$(CURDIR)/build)
  424. $(if $(V), @echo " RM $(build_dir)")
  425. $(CMD_PREFIX)rm -rf $(build_dir)
  426. endif
  427. ifeq ($(install_root_dir),$(install_root_dir_default)/usr)
  428. $(if $(V), @echo " RM $(install_root_dir_default)")
  429. $(CMD_PREFIX)rm -rf $(install_root_dir_default)
  430. endif