From c68443e2ebc24b944bdce4d02a48c7c39772ac14 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Fri, 26 Feb 2021 17:32:53 +0100 Subject: [PATCH] base-hw: support packaging of multi-arch boards With this patch, the board//arch property file can have multiple lines where each line denotes an instruction-set architecture supported for the board. Issue #4019 Fixes #4034 --- repos/base-hw/board/virt_qemu/arch | 1 + .../recipes/src/base-hw-virt_qemu/content.mk | 3 ++ repos/base-hw/recipes/src/base-hw_content.inc | 36 ++++++++++++------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/repos/base-hw/board/virt_qemu/arch b/repos/base-hw/board/virt_qemu/arch index 16c61114d8..cd8d498319 100644 --- a/repos/base-hw/board/virt_qemu/arch +++ b/repos/base-hw/board/virt_qemu/arch @@ -1 +1,2 @@ arm_v7a +arm_v8a diff --git a/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk b/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk index 31319dcaf1..2d331b60be 100644 --- a/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk +++ b/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk @@ -1 +1,4 @@ +CONTENT += src/core/board/virt_qemu_64 \ + src/bootstrap/board/virt_qemu_64 + include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw_content.inc b/repos/base-hw/recipes/src/base-hw_content.inc index 37edea1a83..f26b8981e6 100644 --- a/repos/base-hw/recipes/src/base-hw_content.inc +++ b/repos/base-hw/recipes/src/base-hw_content.inc @@ -60,11 +60,11 @@ SRC_LIB_STARTUP_SPECS(x86_64) := x86_64 SRC_LIB_STARTUP_SPECS(riscv) := riscv # location of hw-ld.mk file -LD_MK_DIR(arm_v6) := lib/mk/spec/arm -LD_MK_DIR(arm_v7a) := lib/mk/spec/arm -LD_MK_DIR(arm_v8a) := lib/mk/spec/arm_v8 -LD_MK_DIR(x86_64) := lib/mk/spec/x86_64 -LD_MK_DIR(riscv) := lib/mk/spec/riscv +LD_MK_DIRS(arm_v6) := lib/mk/spec/arm +LD_MK_DIRS(arm_v7a) := lib/mk/spec/arm +LD_MK_DIRS(arm_v8a) := lib/mk/spec/arm_v8 +LD_MK_DIRS(x86_64) := lib/mk/spec/x86_64 +LD_MK_DIRS(riscv) := lib/mk/spec/riscv # @@ -80,7 +80,8 @@ arch_undefined: " missing file $(BOARD_ARCH_PATH)\n\n" false else -ARCH := $(firstword $(shell cat $(BOARD_ARCH_PATH))) +SHELL := bash +ARCHS := $(sort $(shell cat $(BOARD_ARCH_PATH))) endif @@ -88,37 +89,45 @@ endif # Enumeration of package content # +# +# Function to obtain the content for the board's supported architectures +# +# The parameter is the variable name for one of the subdirectories defined +# above. The 'sort' is merely used to remove duplicates. +# +selected_content = $(sort $(foreach A,$(ARCHS),${$1($A)})) + BASE_DIR := $(GENODE_DIR)/repos/base BASE_HW_DIR := $(GENODE_DIR)/repos/base-hw SRC_TIMER := target.inc include hw main.cc SRC_INCLUDE_HW += $(notdir $(wildcard $(BASE_HW_DIR)/src/include/hw/*.h)) \ - $(addprefix spec/,${SRC_INCLUDE_HW_SPECS(${ARCH})}) \ + $(addprefix spec/,${call selected_content,SRC_INCLUDE_HW_SPECS}) \ uart SRC_BOOTSTRAP += hw env.cc init.cc lock.cc log.cc thread.cc \ platform.cc platform.h \ - $(addprefix spec/,${SRC_BOOTSTRAP_SPECS(${ARCH})}) \ + $(addprefix spec/,${call selected_content,SRC_BOOTSTRAP_SPECS}) \ $(addprefix board/,$(BOARD)) SRC_LIB_BASE += $(notdir $(wildcard $(BASE_HW_DIR)/src/lib/base/*.cc)) \ $(notdir $(wildcard $(BASE_DIR)/src/lib/base/*.cc)) \ - ${SRC_LIB_BASE_SPECS(${ARCH})} + ${call selected_content,SRC_LIB_BASE_SPECS} SRC_LIB_STARTUP += init_main_thread.cc _main.cc \ - $(addprefix spec/,${SRC_LIB_STARTUP_SPECS(${ARCH})}) + $(addprefix spec/,${call selected_content,SRC_LIB_STARTUP_SPECS}) SRC_CORE += $(notdir $(wildcard $(BASE_HW_DIR)/src/core/*.cc)) \ $(notdir $(wildcard $(BASE_HW_DIR)/src/core/*.h)) \ $(notdir $(wildcard $(BASE_DIR)/src/core/*.cc)) \ - $(addprefix spec/,${SRC_CORE_SPECS(${ARCH})}) \ + $(addprefix spec/,${call selected_content,SRC_CORE_SPECS}) \ $(addprefix board/,$(BOARD)) \ version.inc target.inc include hw kernel LIB_MK := base-hw-common.mk base-hw.mk bootstrap-hw.inc core-hw.inc \ timeout-hw.mk cxx.mk base.inc base-common.inc startup.inc \ - $(addprefix spec/,${LIB_MK_SPECS(${ARCH})}) + $(addprefix spec/,${call selected_content,LIB_MK_SPECS}) CONTENT += $(addprefix src/timer/,$(SRC_TIMER)) \ $(addprefix src/include/hw/,$(SRC_INCLUDE_HW)) \ @@ -169,7 +178,8 @@ etc/specs.conf: content: generalize_target_names generalize_target_names: $(CONTENT) # apply kernel-agnostic convention of naming the timer and ld.lib.so - mv ${LD_MK_DIR(${ARCH})}/ld-hw.mk ${LD_MK_DIR(${ARCH})}/ld.mk + for subdir in ${call selected_content,LD_MK_DIRS}; do \ + mv $$subdir/ld-hw.mk $$subdir/ld.mk; done sed -i "s/ld-hw/ld/" src/lib/ld/hw/target.mk sed -i "s/hw_timer_drv/timer/" src/timer/hw/target.mk # supplement BOARD definition that normally comes form the build dir