-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMakefile
More file actions
196 lines (163 loc) · 9.55 KB
/
Copy pathMakefile
File metadata and controls
196 lines (163 loc) · 9.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
all: workloads
MULTIHART ?= 0
HARTS ?= 2
LINUX_DEFAULT_DTB := $(if $(DEFAULT_DTB),$(DEFAULT_DTB),)
LINUX_ROOTFS_BUILD_VARS_HASH := $(shell printf '%s\n' \
'multihart=$(if $(filter 1,$(MULTIHART)),1,0)' \
'harts=$(if $(filter 1,$(MULTIHART)),$(HARTS),1)' | sha256sum | cut -d ' ' -f 1)
LINUX_FIRMWARE_BUILD_VARS_HASH := $(shell printf '%s\n' \
'multihart=$(if $(filter 1,$(MULTIHART)),1,0)' \
'harts=$(if $(filter 1,$(MULTIHART)),$(HARTS),1)' \
'default_dtb=$(if $(DEFAULT_DTB),$(DEFAULT_DTB),xiangshan)' | sha256sum | cut -d ' ' -f 1)
MULTIHART_SUPPORTED_HARTS = $(shell seq 2 128)
ifeq ($(filter 1,$(MULTIHART)),1)
ifeq ($(filter $(HARTS),$(MULTIHART_SUPPORTED_HARTS)),)
$(error HARTS must be an integer in the range 2..128 when MULTIHART=1)
endif
ifeq ($(strip $(DEFAULT_DTB)),)
$(error DEFAULT_DTB must be specified when MULTIHART=1; use the complete DTS basename without .dts.in)
endif
endif
# Download buildroot
BUILDROOT_DIR := build/buildroot
$(BUILDROOT_DIR)/Makefile:
mkdir -p build
wget https://buildroot.org/downloads/buildroot-2025.08.1.tar.gz -O build/buildroot.tar.gz
tar -xf build/buildroot.tar.gz -C build
mv build/buildroot-2025.08.1 $(BUILDROOT_DIR)
# Prepare buildroot SDK
TOOLCHAIN_WRAPPER := $(BUILDROOT_DIR)/output/host/bin/toolchain-wrapper
$(TOOLCHAIN_WRAPPER): br2-external/configs/nemu_defconfig $(BUILDROOT_DIR)/Makefile
$(MAKE) -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) nemu_defconfig
$(MAKE) -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) prepare-sdk
touch $(TOOLCHAIN_WRAPPER)
# Build Linux kernel
LINUX_IMAGE := $(BUILDROOT_DIR)/output/images/Image
$(LINUX_IMAGE): $(TOOLCHAIN_WRAPPER) br2-external/configs/nemu_defconfig br2-external/board/openxiangshan/nemu/linux.config
$(MAKE) -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) nemu_defconfig
$(MAKE) -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external)
# Build GCPT. Single-core firmware keeps LibCheckpointAlpha; LibCheckpoint is
# used for the QEMU multi-hart checkpoint format.
SBI_BUILD_DIR := $(if $(filter 1,$(MULTIHART)),build/opensbi-multihart,build/opensbi)
SBI_BIN := $(SBI_BUILD_DIR)/build/platform/generic/firmware/fw_jump.bin
GCPT_IMPLEMENTATION := $(if $(filter 1,$(MULTIHART)),libcheckpoint,alpha)
GCPT_SOURCE_DIR := $(if $(filter 1,$(MULTIHART)),bootloader/LibCheckpoint,bootloader/LibCheckpointAlpha)
GCPT_BUILD_DIR := $(if $(filter 1,$(MULTIHART)),build/LibCheckpoint,build/LibCheckpointAlpha)
GCPT_BIN := $(GCPT_BUILD_DIR)/build/gcpt.bin
GCPT_DEFAULT_DTB ?= $(if $(DEFAULT_DTB),$(DEFAULT_DTB),xiangshan)
GCPT_CONFIGURE_MODE := $(if $(filter 1,$(MULTIHART)),dual_core,normal)
GCPT_CONFIG_STAMP := $(if $(filter 1,$(MULTIHART)),build/LibCheckpoint-config/mode.$(GCPT_CONFIGURE_MODE),build/LibCheckpointAlpha-config/dtb.$(shell printf '%s\n' "$(GCPT_DEFAULT_DTB)" | sha256sum | cut -d ' ' -f 1))
GCPT_SOURCES := $(if $(filter 1,$(MULTIHART)),$(shell find $(GCPT_SOURCE_DIR) -path '*/.git' -prune -o -path '*/tests' -prune -o -type f -print 2>/dev/null),$(shell find $(GCPT_SOURCE_DIR) -path '*/.git' -prune -o -type f -print 2>/dev/null))
GCPT_DTS_SOURCES := $(if $(filter 1,$(MULTIHART)),,$(shell find dts -type f 2>/dev/null))
$(GCPT_CONFIG_STAMP):
mkdir -p "$(@D)"
rm -f $(if $(filter 1,$(MULTIHART)),build/LibCheckpoint-config/mode.*,build/LibCheckpointAlpha-config/dtb.*)
touch "$@"
$(GCPT_BIN): scripts/build-gcpt.sh $(TOOLCHAIN_WRAPPER) $(GCPT_SOURCES) $(GCPT_DTS_SOURCES) $(GCPT_CONFIG_STAMP) $(if $(filter 1,$(MULTIHART)),$(SBI_BIN),)
CROSS_COMPILE="$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" \
GCPT_IMPLEMENTATION="$(GCPT_IMPLEMENTATION)" \
GCPT_CONFIGURE_MODE="$(GCPT_CONFIGURE_MODE)" \
GCPT_PAYLOAD_PATH="$(if $(filter 1,$(MULTIHART)),$(abspath $(SBI_BIN)),)" \
DEFAULT_DTB="$(GCPT_DEFAULT_DTB)" \
DTS_TEMPLATE_DIR="$(abspath dts)" \
bash scripts/build-gcpt.sh $(GCPT_SOURCE_DIR) $(GCPT_BUILD_DIR)
# Build OpenSBI
$(SBI_BIN): scripts/build-sbi.sh bootloader/opensbi.config $(TOOLCHAIN_WRAPPER)
CROSS_COMPILE="$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" \
MULTIHART="$(MULTIHART)" \
bash scripts/build-sbi.sh bootloader/opensbi $(SBI_BUILD_DIR)
define add_workload_linux
# Download files
build/linux-workloads/$(1)/download/sentinel: $$(shell find $$(abspath workloads/linux/$(1)) -iname 'links.txt')
mkdir -p build/linux-workloads/$(1)/
bash scripts/download-files.sh workloads/linux/$(1) build/linux-workloads/$(1)/download
# Build and pack workload
build/linux-workloads/$(1)/rootfs-vars.$(LINUX_ROOTFS_BUILD_VARS_HASH).stamp:
mkdir -p "$$(@D)"
rm -f "$$(@D)"/rootfs-vars.*.stamp
touch "$$@"
build/linux-workloads/$(1)/rootfs.cpio: $$(shell find $$(abspath workloads/linux/$(1))) $(TOOLCHAIN_WRAPPER) build/linux-workloads/$(1)/download/sentinel scripts/build-workload-linux.sh scripts/package-multihart-rootfs.py build/linux-workloads/$(1)/rootfs-vars.$(LINUX_ROOTFS_BUILD_VARS_HASH).stamp
CROSS_COMPILE="$$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" \
SYSROOT_DIR="$$(abspath $(BUILDROOT_DIR)/output/staging)" \
BUILDROOT_DIR="$$(abspath $(BUILDROOT_DIR))" \
MULTIHART="$$(MULTIHART)" \
HARTS="$$(HARTS)" \
bash scripts/build-workload-linux.sh workloads/linux/$(1) build/linux-workloads/$(1)
# Build all-in-one firmware
build/linux-workloads/$(1)/firmware-vars.$(LINUX_FIRMWARE_BUILD_VARS_HASH).stamp:
mkdir -p "$$(@D)"
rm -f "$$(@D)"/firmware-vars.*.stamp
touch "$$@"
build/linux-workloads/$(1)/fw_payload.bin: $$(shell find $$(abspath dts)) $(GCPT_BIN) dts/xiangshan.dts.in scripts/build-sbi.sh scripts/build-firmware-linux.sh build/linux-workloads/$(1)/rootfs.cpio $(LINUX_IMAGE) $(SBI_BIN) build/linux-workloads/$(1)/firmware-vars.$(LINUX_FIRMWARE_BUILD_VARS_HASH).stamp
CROSS_COMPILE="$$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" \
DTC="$$(abspath $(BUILDROOT_DIR)/output/host/bin)/dtc" \
DEFAULT_DTB="$(LINUX_DEFAULT_DTB)" \
MULTIHART="$$(MULTIHART)" \
HARTS="$$(HARTS)" \
bash scripts/build-firmware-linux.sh $(GCPT_BIN) $(SBI_BUILD_DIR) dts $(LINUX_IMAGE) build/linux-workloads/$(1)
linux/$(1): build/linux-workloads/$(1)/fw_payload.bin
WORKLOAD_PHONY_TARGETS += linux/$(1)
WORKLOAD_DIRS += build/linux-workloads/$(1)
WORKLOADS_LINUX += build/linux-workloads/$(1)/fw_payload.bin
ROOTFS += build/linux-workloads/$(1)/rootfs.cpio
DT_DIRS += build/linux-workloads/$(1)/dt
TARFLAGS += --transform='s|^build/linux-workloads/$(1)|workloads/linux/$(1)|'
endef
define add_workload_am
# Download files
build/am-workloads/$(1)/download/sentinel: $$(shell find $$(abspath workloads/am/$(1)) -iname 'links.txt')
mkdir -p build/am-workloads/$(1)/
bash scripts/download-files.sh workloads/am/$(1) build/am-workloads/$(1)/download
# Build and pack workload
build/am-workloads/$(1)/sentinel: $$(shell find $$(abspath workloads/am/$(1))) $(TOOLCHAIN_WRAPPER) build/am-workloads/$(1)/download/sentinel scripts/build-workload-am.sh
CROSS_COMPILE="$$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" \
SYSROOT_DIR="$$(abspath $(BUILDROOT_DIR)/output/staging)" \
ARCH="$(ARCH)" \
CPPFLAGS="$(CPPFLAGS)" \
bash scripts/build-workload-am.sh workloads/am/$(1) build/am-workloads/$(1) nexus-am
am/$(1): build/am-workloads/$(1)/sentinel
WORKLOAD_PHONY_TARGETS += am/$(1)
WORKLOAD_DIRS += build/am-workloads/$(1)
WORKLOADS_AM += build/am-workloads/$(1)/package
WORKLOADS_AM_SENTINEL += build/am-workloads/$(1)/sentinel
TARFLAGS += --transform='s|^build/am-workloads/$(1)/package|workloads/am/$(1)|'
endef
# Auto-register simple workloads. Workloads that need custom targets can place
# a rules.mk in their own directory and manage their rules there.
LINUX_WORKLOAD_RULE_DIRS := $(patsubst workloads/linux/%/rules.mk,%,$(wildcard workloads/linux/*/rules.mk))
AM_WORKLOAD_RULE_DIRS := $(patsubst workloads/am/%/rules.mk,%,$(wildcard workloads/am/*/rules.mk))
LINUX_WORKLOAD_DIRS := $(patsubst workloads/linux/%/build.sh,%,$(wildcard workloads/linux/*/build.sh))
AM_WORKLOAD_DIRS := $(patsubst workloads/am/%/build.sh,%,$(wildcard workloads/am/*/build.sh))
LINUX_GENERIC_WORKLOADS := $(sort $(filter-out $(LINUX_WORKLOAD_RULE_DIRS),$(LINUX_WORKLOAD_DIRS)))
AM_GENERIC_WORKLOADS := $(sort $(filter-out $(AM_WORKLOAD_RULE_DIRS),$(AM_WORKLOAD_DIRS)))
$(foreach workload,$(LINUX_GENERIC_WORKLOADS),$(eval $(call add_workload_linux,$(workload))))
$(foreach workload,$(AM_GENERIC_WORKLOADS),$(eval $(call add_workload_am,$(workload))))
# Include workload-specific make rules. A workload can add its own targets by
# placing rules.mk under its workload directory.
-include $(wildcard workloads/linux/*/rules.mk)
-include $(wildcard workloads/am/*/rules.mk)
# Pack all workloads
build/workloads.tar.zstd: $(WORKLOADS_LINUX) $(WORKLOADS_AM_SENTINEL)
tar -c $(WORKLOADS_LINUX) $(ROOTFS) $(DT_DIRS) $(WORKLOADS_AM) $(TARFLAGS) | zstd -f -3 -T0 -o build/workloads.tar.zstd
# PHONY targets
init:
git submodule update --init --recursive
# Prepare buildroot toolchain
prepare-sdk: $(TOOLCHAIN_WRAPPER)
# Download all source files needed by buildroot
source: $(BUILDROOT_DIR)/Makefile
make -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) nemu_defconfig
make -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) source
# Build all all-in-one firmware images
workloads: $(WORKLOADS_LINUX) $(WORKLOADS_AM_SENTINEL)
# Build all rootfs
rootfs: $(ROOTFS)
# Pack images and rootfs
tarball: build/workloads.tar.zstd
# Remove the buildroot outputs (toolchain, stageing files and output files for building the kernel)
clean-kernel:
rm -rf $(BUILDROOT_DIR)/output
# Remove all built workloads
clean-workloads:
rm -rf $(WORKLOAD_DIRS) build/workloads.tar.zstd build/rootfs.tar.zstd
.PHONY: all $(WORKLOAD_PHONY_TARGETS) init prepare-sdk source workloads rootfs tarball clean-kernel clean-workloads