From 129cb214bdc1b47a9c847df1a561926f6d51946a Mon Sep 17 00:00:00 2001 From: Yinan Xu Date: Thu, 14 May 2026 14:53:07 +0800 Subject: [PATCH] fix(spec): unify exported image directories Align SPEC2006 and SPEC2026 image exports with the SPEC2017 layout so all three workloads write bin, kernel, rootfs, elf, cmd, cfg, gcpt, logs, and stamp artifacts consistently. Add single-case image export support with BENCH for SPEC2006, SPEC2017, and SPEC2026, export SPEC2006 build logs into the image tree, and make SPEC2026 image builds track input-sensitive build state. Update the SPEC2006, SPEC2017, and SPEC2026 READMEs to document the unified output structure and the single-case export commands. --- workloads/linux/spec2006/README.md | 14 +++++++ workloads/linux/spec2006/rules.mk | 26 ++++++++---- workloads/linux/spec2006/spec2006-package.py | 12 ++++++ workloads/linux/spec2017/README.md | 2 + workloads/linux/spec2017/rules.mk | 12 ++++-- workloads/linux/spec2026/README.md | 38 ++++++++++++++---- workloads/linux/spec2026/rules.mk | 42 +++++++++++--------- 7 files changed, 108 insertions(+), 38 deletions(-) diff --git a/workloads/linux/spec2006/README.md b/workloads/linux/spec2006/README.md index ca60c88..9c6d83a 100644 --- a/workloads/linux/spec2006/README.md +++ b/workloads/linux/spec2006/README.md @@ -48,6 +48,13 @@ make spec2006-images SPEC2006_ISO=/path/to/cpu2006.iso SPEC2006_INPUT=test -jN make spec2006-images SPEC2006_ISO=/path/to/cpu2006.iso SPEC2006_INPUT=all -jN ``` +Export a single configured case with `BENCH`: + +```sh +make spec2006-images BENCH=mcf SPEC2006_ISO=/path/to/cpu2006.iso -jN +make spec2006-images BENCH=astar_biglakes SPEC2006_ISO=/path/to/cpu2006.iso -jN +``` + Selected SPEC cases are built one by one to avoid concurrent `runspec` instances contending on shared temporary state inside the SPEC tool tree. @@ -57,14 +64,21 @@ The export directory is organized as: build/images/spec2006/ bin/.fw_payload.bin kernel/.Image + rootfs/.rootfs.cpio elf/.elf + cmd/.run.sh gcpt/gcpt.elf gcpt/gcpt.bin cfg/ + logs/build_elf/.log + stamps/.images.stamp ``` `gcpt/` and `cfg/` are copied once per export tree, not once per case. +Re-running `make spec2006-images` rebuilds the export tree so the directory +layout and contents stay complete and consistent. + Override the destination with `SPEC2006_IMAGE_DIR=/path/to/image`. ## Build ELF only diff --git a/workloads/linux/spec2006/rules.mk b/workloads/linux/spec2006/rules.mk index 4b8c163..f7a26ba 100644 --- a/workloads/linux/spec2006/rules.mk +++ b/workloads/linux/spec2006/rules.mk @@ -37,10 +37,11 @@ SPEC2006_DTC ?= $(SPEC2006_BUILDROOT_DIR)/output/host/bin/dtc SPEC2006_CASE := $(if $(INPUT),$(BENCH)_$(INPUT),$(BENCH)) SPEC2006_ALL_CASES := $(shell python3 $(SPEC2006_HELPER) --cases-config $(SPEC2006_CASE_CONFIG) --list-cases 2>/dev/null) SPEC2006_SELECTED_CASES := $(shell python3 $(SPEC2006_HELPER) --cases-config $(SPEC2006_CASE_CONFIG) --list-cases --input-set $(SPEC2006_INPUT) 2>/dev/null) -SPEC2006_IMAGE_CASES := $(SPEC2006_SELECTED_CASES) +SPEC2006_IMAGE_CASES := $(if $(BENCH),$(SPEC2006_CASE),$(SPEC2006_SELECTED_CASES)) SPEC2006_ELF_TARGETS := $(foreach case,$(SPEC2006_SELECTED_CASES),$(SPEC2006_BUILD_DIR)/$(case)/elf/$(case).elf) SPEC2006_DTS_SOURCES := $(shell find $(SPEC2006_DTS_DIR) -type f 2>/dev/null) SPEC2006_DEFAULT_DTB_STAMP := $(SPEC2006_BUILD_DIR)/dtb.$(shell printf '%s\n' "$(SPEC2006_DEFAULT_DTB)" | sha256sum | cut -d ' ' -f 1) +spec2006_case_image_stamp = $(SPEC2006_IMAGE_DIR)/stamps/$(1).images.stamp WORKLOAD_DIRS += $(SPEC2006_BUILD_DIR) @@ -132,9 +133,9 @@ linux/$(1): $(SPEC2006_BUILD_DIR)/$(1)/fw_payload.bin WORKLOAD_PHONY_TARGETS += linux/$(1) -$(SPEC2006_IMAGE_DIR)/bin/$(1).fw_payload.bin: $(SPEC2006_BUILD_DIR)/$(1)/fw_payload.bin $(SPEC2006_LINUX_IMAGE) +$(call spec2006_case_image_stamp,$(1)): $(SPEC2006_PREPARE_STAMP) $(SPEC2006_BUILD_DIR)/$(1)/fw_payload.bin $(SPEC2006_GCPT_ELF) $(SPEC2006_GCPT_BIN) $(SPEC2006_LINUX_IMAGE) | spec2006-check-spec-iso @printf '$(SPEC2006_PROGRESS_PREFIX) Exporting $(1) artifacts to $(SPEC2006_IMAGE_DIR)\n' - @mkdir -p "$(SPEC2006_IMAGE_DIR)/bin" "$(SPEC2006_IMAGE_DIR)/kernel" "$(SPEC2006_IMAGE_DIR)/elf" "$(SPEC2006_IMAGE_DIR)/cfg" "$(SPEC2006_IMAGE_DIR)/gcpt" + @mkdir -p "$(SPEC2006_IMAGE_DIR)/bin" "$(SPEC2006_IMAGE_DIR)/kernel" "$(SPEC2006_IMAGE_DIR)/rootfs" "$(SPEC2006_IMAGE_DIR)/elf" "$(SPEC2006_IMAGE_DIR)/cmd" "$(SPEC2006_IMAGE_DIR)/cfg" "$(SPEC2006_IMAGE_DIR)/gcpt" "$(SPEC2006_IMAGE_DIR)/logs/build_elf" "$(SPEC2006_IMAGE_DIR)/stamps" @if [ ! -f "$(SPEC2006_IMAGE_DIR)/cfg/$(notdir $(SPEC2006_CFG))" ]; then \ printf '$(SPEC2006_PROGRESS_PREFIX) Exporting spec2006 cfg to $(SPEC2006_IMAGE_DIR)/cfg\n'; \ cp "$(SPEC2006_CFG)" "$(SPEC2006_IMAGE_DIR)/cfg/$(notdir $(SPEC2006_CFG))"; \ @@ -144,9 +145,13 @@ $(SPEC2006_IMAGE_DIR)/bin/$(1).fw_payload.bin: $(SPEC2006_BUILD_DIR)/$(1)/fw_pay cp "$(SPEC2006_GCPT_ELF)" "$(SPEC2006_IMAGE_DIR)/gcpt/gcpt.elf"; \ cp "$(SPEC2006_GCPT_BIN)" "$(SPEC2006_IMAGE_DIR)/gcpt/gcpt.bin"; \ fi - @cp $(SPEC2006_BUILD_DIR)/$(1)/elf/$(1).elf $(SPEC2006_IMAGE_DIR)/elf/$(1).elf - @cp $(SPEC2006_LINUX_IMAGE) $(SPEC2006_IMAGE_DIR)/kernel/$(1).Image - @cp $(SPEC2006_BUILD_DIR)/$(1)/fw_payload.bin $(SPEC2006_IMAGE_DIR)/bin/$(1).fw_payload.bin + @cp "$(SPEC2006_BUILD_DIR)/$(1)/elf/$(1).elf" "$(SPEC2006_IMAGE_DIR)/elf/$(1).elf" + @cp "$(SPEC2006_BUILD_DIR)/$(1)/logs/build_elf/build.log" "$(SPEC2006_IMAGE_DIR)/logs/build_elf/$(1).log" + @cp "$(SPEC2006_LINUX_IMAGE)" "$(SPEC2006_IMAGE_DIR)/kernel/$(1).Image" + @cp "$(SPEC2006_BUILD_DIR)/$(1)/rootfs.cpio" "$(SPEC2006_IMAGE_DIR)/rootfs/$(1).rootfs.cpio" + @cp "$(SPEC2006_BUILD_DIR)/$(1)/fw_payload.bin" "$(SPEC2006_IMAGE_DIR)/bin/$(1).fw_payload.bin" + @cp "$(SPEC2006_BUILD_DIR)/$(1)/package/spec/run.sh" "$(SPEC2006_IMAGE_DIR)/cmd/$(1).run.sh" + @touch "$$@" endef $(foreach case,$(SPEC2006_ALL_CASES),$(eval $(call add_spec2006_case,$(case)))) @@ -177,15 +182,20 @@ spec2006-elfs: spec2006-check-spec-iso done spec2006-images: spec2006-check-spec-iso - @if [ -z "$(SPEC2006_IMAGE_CASES)" ]; then \ + @if [ -n "$(BENCH)" ] && [ -z "$(filter $(SPEC2006_CASE),$(SPEC2006_ALL_CASES))" ]; then \ + echo "Unknown SPEC2006 case for BENCH=$(BENCH) INPUT=$(INPUT)"; \ + exit 1; \ + fi; \ + if [ -z "$(SPEC2006_IMAGE_CASES)" ]; then \ echo "No SPEC2006 cases selected by SPEC2006_INPUT=$(SPEC2006_INPUT)"; \ exit 1; \ fi; \ + rm -rf "$(SPEC2006_IMAGE_DIR)/bin" "$(SPEC2006_IMAGE_DIR)/kernel" "$(SPEC2006_IMAGE_DIR)/rootfs" "$(SPEC2006_IMAGE_DIR)/elf" "$(SPEC2006_IMAGE_DIR)/cmd" "$(SPEC2006_IMAGE_DIR)/cfg" "$(SPEC2006_IMAGE_DIR)/gcpt" "$(SPEC2006_IMAGE_DIR)/logs" "$(SPEC2006_IMAGE_DIR)/stamps"; \ total="$(words $(SPEC2006_IMAGE_CASES))"; \ i=0; \ for case in $(SPEC2006_IMAGE_CASES); do \ i=$$((i + 1)); \ - SPEC2006_PROGRESS_K="$$i" SPEC2006_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2006_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2006_DEFAULT_DTB)" "$(SPEC2006_IMAGE_DIR)/bin/$$case.fw_payload.bin" || exit $$?; \ + SPEC2006_PROGRESS_K="$$i" SPEC2006_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2006_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2006_DEFAULT_DTB)" "$(call spec2006_case_image_stamp,$$case)" || exit $$?; \ done @printf '[spec2006 %s/%s] Output written to %s\n' "$(words $(SPEC2006_IMAGE_CASES))" "$(words $(SPEC2006_IMAGE_CASES))" "$(abspath $(SPEC2006_IMAGE_DIR))" diff --git a/workloads/linux/spec2006/spec2006-package.py b/workloads/linux/spec2006/spec2006-package.py index 58f42c1..7f817dd 100644 --- a/workloads/linux/spec2006/spec2006-package.py +++ b/workloads/linux/spec2006/spec2006-package.py @@ -373,6 +373,16 @@ def export_elf_artifact(elf, case_name, out_dir): return exported_elf +def export_build_log_artifact(build_log, out_dir): + if not build_log.is_file(): + return None + log_dir = out_dir / "logs" / "build_elf" + log_dir.mkdir(parents=True, exist_ok=True) + exported_log = log_dir / build_log.name + shutil.copy2(build_log, exported_log) + return exported_log + + def install_runtime_binary(elf, binary_name, pkg_dir): spec_root = pkg_dir / "spec" shutil.copy2(elf, spec_root / binary_name) @@ -499,6 +509,7 @@ def build_elf(spec_dir, bench_dir, spec_cfg, out_dir, log_dir, cross_compile, tu elf = None if elf is not None: status(f"Reusing {bench_dir} build from {shared_dir}") + export_build_log_artifact(build_log, out_dir) return elf, build_log if output_root.exists(): @@ -547,6 +558,7 @@ def build_elf(spec_dir, bench_dir, spec_cfg, out_dir, log_dir, cross_compile, tu detail = explain_missing_elf(output_root, bench_dir, tune) raise RuntimeError(str(exc) + detail) from exc write_json(metadata_path, metadata) + export_build_log_artifact(build_log, out_dir) return elf, build_log diff --git a/workloads/linux/spec2017/README.md b/workloads/linux/spec2017/README.md index bd45504..0cde41a 100644 --- a/workloads/linux/spec2017/README.md +++ b/workloads/linux/spec2017/README.md @@ -90,6 +90,8 @@ perlbench_rate_refrate_00_checkspam.2500.5.25.11.150.1.1.1.1.fw_payload.bin Useful selectors: ```sh +make spec2017-images BENCH=mcf MODE=rate INPUT=test SPEC2017_ISO=/path/to/cpu2017.iso -jN +make spec2017-images BENCH=mcf MODE=speed INPUT=test SPEC2017_ISO=/path/to/cpu2017.iso -jN make spec2017-images SPEC2017_ISO=/path/to/cpu2017.iso SPEC2017_IMAGE_INPUT=test -jN make spec2017-images SPEC2017_ISO=/path/to/cpu2017.iso SPEC2017_IMAGE_INPUT=all -jN make spec2017-images SPEC2017_ISO=/path/to/cpu2017.iso SPEC2017_IMAGE_MODE=rate -jN diff --git a/workloads/linux/spec2017/rules.mk b/workloads/linux/spec2017/rules.mk index 78891fb..c492227 100644 --- a/workloads/linux/spec2017/rules.mk +++ b/workloads/linux/spec2017/rules.mk @@ -56,7 +56,7 @@ SPEC2017_BUILD_VARS_HASH := $(shell printf '%s\n' '$(SPEC2017_PROFILING)' '$(SPE SPEC2017_CASE := $(shell $(SPEC2017_PYTHON) $(SPEC2017_HELPER) --resolve-case --bench '$(BENCH)' --input-set '$(SPEC2017_INPUT)' --mode '$(SPEC2017_MODE)' 2>/dev/null) SPEC2017_ALL_CASES := $(shell $(SPEC2017_PYTHON) $(SPEC2017_HELPER) --list-cases --input-set all --mode all 2>/dev/null) SPEC2017_SELECTED_CASES := $(shell $(SPEC2017_PYTHON) $(SPEC2017_HELPER) --list-cases --input-set $(SPEC2017_INPUT) --mode $(SPEC2017_MODE) 2>/dev/null) -SPEC2017_IMAGE_CASES := $(shell $(SPEC2017_PYTHON) $(SPEC2017_HELPER) --list-cases --input-set $(SPEC2017_IMAGE_INPUT) --mode $(SPEC2017_IMAGE_MODE) 2>/dev/null) +SPEC2017_IMAGE_CASES := $(if $(BENCH),$(SPEC2017_CASE),$(shell $(SPEC2017_PYTHON) $(SPEC2017_HELPER) --list-cases --input-set $(SPEC2017_IMAGE_INPUT) --mode $(SPEC2017_IMAGE_MODE) 2>/dev/null)) SPEC2017_DTS_SOURCES := $(shell find $(SPEC2017_DTS_DIR) -type f 2>/dev/null) WORKLOAD_DIRS += $(SPEC2017_BUILD_DIR) @@ -246,7 +246,7 @@ linux/spec2017: spec2017-check-spec-config echo "Cannot resolve SPEC2017 case from BENCH=$(BENCH), MODE=$(SPEC2017_MODE), INPUT=$(SPEC2017_INPUT)"; \ exit 1; \ fi - @$(MAKE) --no-print-directory -f "$(SPEC2017_RECURSE_MAKEFILE)" $(SPEC2017_BUILD_DIR)/$(SPEC2017_CASE)/fw_payload.bin + @$(MAKE) --no-print-directory -f "$(SPEC2017_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2017_DEFAULT_DTB)" $(SPEC2017_BUILD_DIR)/$(SPEC2017_CASE)/fw_payload.bin spec2017-elf: spec2017-check-spec-config @if [ -z "$(BENCH)" ]; then \ @@ -272,7 +272,11 @@ spec2017-elfs: spec2017-check-spec-config done spec2017-images: spec2017-check-spec-config - @if [ -z "$(SPEC2017_IMAGE_CASES)" ]; then \ + @if [ -n "$(BENCH)" ] && [ -z "$(SPEC2017_CASE)" ]; then \ + echo "Cannot resolve SPEC2017 case from BENCH=$(BENCH), MODE=$(SPEC2017_MODE), INPUT=$(SPEC2017_INPUT)"; \ + exit 1; \ + fi; \ + if [ -z "$(SPEC2017_IMAGE_CASES)" ]; then \ echo "No SPEC2017 cases selected by SPEC2017_IMAGE_INPUT=$(SPEC2017_IMAGE_INPUT) SPEC2017_IMAGE_MODE=$(SPEC2017_IMAGE_MODE)"; \ exit 1; \ fi; \ @@ -281,7 +285,7 @@ spec2017-images: spec2017-check-spec-config i=0; \ for case in $(SPEC2017_IMAGE_CASES); do \ i=$$((i + 1)); \ - SPEC2017_PROGRESS_K="$$i" SPEC2017_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2017_RECURSE_MAKEFILE)" "$(SPEC2017_IMAGE_DIR)/stamps/$$case.images.stamp" || exit $$?; \ + SPEC2017_PROGRESS_K="$$i" SPEC2017_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2017_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2017_DEFAULT_DTB)" "$(SPEC2017_IMAGE_DIR)/stamps/$$case.images.stamp" || exit $$?; \ done @printf '[spec2017 %s/%s] Output written to %s\n' "$(words $(SPEC2017_IMAGE_CASES))" "$(words $(SPEC2017_IMAGE_CASES))" "$(abspath $(SPEC2017_IMAGE_DIR))" diff --git a/workloads/linux/spec2026/README.md b/workloads/linux/spec2026/README.md index 71e8cb0..8892814 100644 --- a/workloads/linux/spec2026/README.md +++ b/workloads/linux/spec2026/README.md @@ -1,5 +1,14 @@ # SPEC CPU2026 Linux Workload +This workload prepares a writable SPEC workspace from `SPEC2026_ISO` first, +then builds cases against that local install. + +Prepare the workspace: + +```sh +make spec2026-prepare SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso +``` + Build one case: ```sh @@ -13,13 +22,14 @@ make spec2026-images SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso -jN ``` Default image export mode is `rate`. Use `MODE=speed` or `MODE=all` to -change the selected cases. +change the selected cases. `SPEC2026_IMAGE_MODE` and `SPEC2026_IMAGE_INPUT` +can be used independently from the single-case build selectors. -Output goes to `build/images/spec2026`. -Rate cases are written to `build/images/spec2026rate`; speed cases are written -to `build/images/spec2026speed`. +By default, rate images are exported under `build/images/spec2026rate/` and +speed images under `build/images/spec2026speed/`. `SPEC2026_IMAGE_MODE=all` +keeps the combined export under `build/images/spec2026/`. -The export tree now includes: +The export tree is: ```text build/images/spec2026rate/ @@ -47,5 +57,19 @@ build/images/spec2026speed/ stamps/.images.stamp ``` -Re-running `make spec2026-images` skips completed cases and resumes an -interrupted case build through `build/linux-workloads/spec2026/_bench-builds`. +Useful selectors: + +```sh +make spec2026-images BENCH=706.stockfish_r SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso -jN +make spec2026-images BENCH=800.pot3d_s MODE=speed SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso -jN +make spec2026-images SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso SPEC2026_IMAGE_INPUT=test -jN +make spec2026-images SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso SPEC2026_IMAGE_INPUT=all -jN +make spec2026-images SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso SPEC2026_IMAGE_MODE=rate -jN +make spec2026-images SPEC2026_ISO=/path/to/cpu2026-1.0.1.iso SPEC2026_IMAGE_MODE=all -jN +``` + +`SPEC2026_IMAGE_MODE=all` exports both rate and speed images into the same +combined tree that `SPEC2026_IMAGE_DIR` points to. + +Re-running `make spec2026-images` rebuilds the export tree so the directory +layout and contents stay complete and consistent. diff --git a/workloads/linux/spec2026/rules.mk b/workloads/linux/spec2026/rules.mk index 5629ea0..97e5124 100644 --- a/workloads/linux/spec2026/rules.mk +++ b/workloads/linux/spec2026/rules.mk @@ -8,6 +8,7 @@ SPEC2026_DTS_DIR := $(SPEC2026_REPO_ROOT)/dts SPEC2026_BUILD_DIR ?= $(SPEC2026_REPO_ROOT)/build/linux-workloads/spec2026 SPEC2026_CFG ?= $(SPEC2026_WORKLOAD_DIR)/riscv_gcc15_base.cfg SPEC2026_HELPER := $(SPEC2026_WORKLOAD_DIR)/spec2026-package.py +SPEC2026_IMAGE_DIR ?= $(SPEC2026_REPO_ROOT)/build/images/$(if $(filter rate,$(SPEC2026_IMAGE_MODE)),spec2026rate,$(if $(filter speed,$(SPEC2026_IMAGE_MODE)),spec2026speed,spec2026)) SPEC2026_IMAGE_RATE_DIR ?= $(SPEC2026_REPO_ROOT)/build/images/spec2026rate SPEC2026_IMAGE_SPEED_DIR ?= $(SPEC2026_REPO_ROOT)/build/images/spec2026speed SPEC2026_SOURCE_SPEC_ISO := $(SPEC2026_ISO) @@ -42,15 +43,17 @@ SPEC2026_RATE_DTB_MIN_MEMORY_BYTES ?= 8589934592 SPEC2026_SPEED_DTB_MIN_MEMORY_BYTES ?= 68719476736 SPEC2026_ALL_CASES := $(shell python3 $(SPEC2026_HELPER) --list-cases --mode all 2>/dev/null) SPEC2026_SELECTED_CASES := $(shell python3 $(SPEC2026_HELPER) --list-cases --input-set $(SPEC2026_INPUT) --mode $(SPEC2026_MODE) 2>/dev/null) -SPEC2026_IMAGE_CASES := $(shell python3 $(SPEC2026_HELPER) --list-cases --input-set $(SPEC2026_IMAGE_INPUT) --mode $(SPEC2026_IMAGE_MODE) 2>/dev/null) +SPEC2026_IMAGE_CASES := $(if $(BENCH),$(BENCH),$(shell python3 $(SPEC2026_HELPER) --list-cases --input-set $(SPEC2026_IMAGE_INPUT) --mode $(SPEC2026_IMAGE_MODE) 2>/dev/null)) SPEC2026_DTS_SOURCES := $(shell find $(SPEC2026_DTS_DIR) -type f 2>/dev/null) +SPEC2026_CFG_HASH := $(shell if [ -f "$(abspath $(SPEC2026_CFG))" ]; then sha256sum "$(abspath $(SPEC2026_CFG))" | cut -d ' ' -f 1; else printf 'missing'; fi) +SPEC2026_BUILD_VARS_HASH := $(shell printf '%s\n' '$(SPEC2026_INPUT)' '$(SPEC2026_TUNE)' '$(SPEC2026_JOBS)' '$(SPEC2026_CROSS_COMPILE)' | sha256sum | cut -d ' ' -f 1) spec2026_case_dtb_memory = $(if $(SPEC2026_DTB_MEMORY),$(SPEC2026_DTB_MEMORY),$(if $(filter %_s,$(1)),$(SPEC2026_SPEED_DTB_MEMORY),$(SPEC2026_RATE_DTB_MEMORY))) spec2026_case_dtb_profile = $(if $(SPEC2026_EXPLICIT_DEFAULT_DTB),,$(call spec2026_case_dtb_memory,$(1))) spec2026_case_dtb_name = $(SPEC2026_DEFAULT_DTB)$(if $(call spec2026_case_dtb_profile,$(1)),-mem$(call spec2026_case_dtb_profile,$(1))) spec2026_case_dtb_tag = $(subst /,_,$(call spec2026_case_dtb_name,$(1))) spec2026_case_dtb_min_memory_bytes = $(if $(filter %_s,$(1)),$(SPEC2026_SPEED_DTB_MIN_MEMORY_BYTES),$(SPEC2026_RATE_DTB_MIN_MEMORY_BYTES)) -spec2026_case_image_dir = $(if $(filter %_s,$(1)),$(SPEC2026_IMAGE_SPEED_DIR),$(SPEC2026_IMAGE_RATE_DIR)) +spec2026_case_image_dir = $(SPEC2026_IMAGE_DIR) spec2026_case_image_stamp = $(call spec2026_case_image_dir,$(1))/stamps/$(1).images.stamp WORKLOAD_DIRS += $(SPEC2026_BUILD_DIR) @@ -100,6 +103,14 @@ $(SPEC2026_BUILD_DIR)/$(1)/download/sentinel: @mkdir -p "$$(@D)" @touch "$$@" +$(SPEC2026_BUILD_DIR)/$(1)/cfg.$(SPEC2026_CFG_HASH).stamp: | spec2026-check-spec-iso + @mkdir -p "$$(@D)" + @printf '%s\n' "cfg=$(abspath $(SPEC2026_CFG))" > "$$@" + +$(SPEC2026_BUILD_DIR)/$(1)/build-vars.$(SPEC2026_BUILD_VARS_HASH).stamp: + @mkdir -p "$$(@D)" + @printf '%s\n' "input=$(SPEC2026_INPUT)" "tune=$(SPEC2026_TUNE)" "jobs=$(SPEC2026_JOBS)" "cross_compile=$(SPEC2026_CROSS_COMPILE)" > "$$@" + $(SPEC2026_BUILD_DIR)/$(1)/firmware/dtb-$(call spec2026_case_dtb_tag,$(1)).stamp: spec2026-force @mkdir -p "$$(@D)" @printf '%s\n' \ @@ -109,7 +120,7 @@ $(SPEC2026_BUILD_DIR)/$(1)/firmware/dtb-$(call spec2026_case_dtb_tag,$(1)).stamp "min_memory_bytes=$(call spec2026_case_dtb_min_memory_bytes,$(1))" > "$$@.tmp" @if [ -f "$$@" ] && cmp -s "$$@.tmp" "$$@"; then rm "$$@.tmp"; else mv "$$@.tmp" "$$@"; fi -$(SPEC2026_BUILD_DIR)/$(1)/elf/$(1).elf: $(SPEC2026_PREPARE_STAMP) $$(SPEC2026_HELPER) $$(SPEC2026_WORKLOAD_DIR)/build.sh $$(SPEC2026_CFG) +$(SPEC2026_BUILD_DIR)/$(1)/elf/$(1).elf: $(SPEC2026_PREPARE_STAMP) $(SPEC2026_BUILD_DIR)/$(1)/cfg.$(SPEC2026_CFG_HASH).stamp $(SPEC2026_BUILD_DIR)/$(1)/build-vars.$(SPEC2026_BUILD_VARS_HASH).stamp $$(SPEC2026_HELPER) $$(SPEC2026_WORKLOAD_DIR)/build.sh @mkdir -p "$$(dir $$@)" @WORKLOAD_DIR="$$(abspath $$(SPEC2026_WORKLOAD_DIR))" \ WORKLOAD_BUILD_DIR="$$(abspath $(SPEC2026_BUILD_DIR)/$(1))" \ @@ -125,7 +136,7 @@ $(SPEC2026_BUILD_DIR)/$(1)/elf/$(1).elf: $(SPEC2026_PREPARE_STAMP) $$(SPEC2026_H SPEC2026_ELF_ONLY=1 \ bash "$$(abspath $$(SPEC2026_WORKLOAD_DIR))/build.sh" -$(SPEC2026_BUILD_DIR)/$(1)/rootfs.cpio: $(SPEC2026_PREPARE_STAMP) $$(SPEC2026_HELPER) $$(SPEC2026_WORKLOAD_DIR)/build.sh $$(SPEC2026_CFG) $(SPEC2026_BUILD_DIR)/$(1)/download/sentinel $$(SPEC2026_SCRIPTS_DIR)/build-workload-linux.sh +$(SPEC2026_BUILD_DIR)/$(1)/rootfs.cpio: $(SPEC2026_PREPARE_STAMP) $(SPEC2026_BUILD_DIR)/$(1)/cfg.$(SPEC2026_CFG_HASH).stamp $(SPEC2026_BUILD_DIR)/$(1)/build-vars.$(SPEC2026_BUILD_VARS_HASH).stamp $$(SPEC2026_HELPER) $$(SPEC2026_WORKLOAD_DIR)/build.sh $(SPEC2026_BUILD_DIR)/$(1)/download/sentinel $$(SPEC2026_SCRIPTS_DIR)/build-workload-linux.sh @CROSS_COMPILE="$$(SPEC2026_CROSS_COMPILE)" \ SPEC2026_PROGRESS_K="$$(SPEC2026_PROGRESS_K)" \ SPEC2026_PROGRESS_N="$$(SPEC2026_PROGRESS_N)" \ @@ -193,28 +204,21 @@ spec2026-elfs: spec2026-check-spec-iso done spec2026-images: spec2026-check-spec-iso - @if [ -z "$(SPEC2026_IMAGE_CASES)" ]; then \ + @if [ -n "$(BENCH)" ] && [ -z "$(filter $(BENCH),$(SPEC2026_ALL_CASES))" ]; then \ + echo "Unknown SPEC2026 case BENCH=$(BENCH)"; \ + exit 1; \ + fi; \ + if [ -z "$(SPEC2026_IMAGE_CASES)" ]; then \ echo "No SPEC2026 cases selected by SPEC2026_IMAGE_INPUT=$(SPEC2026_IMAGE_INPUT), SPEC2026_IMAGE_MODE=$(SPEC2026_IMAGE_MODE)"; \ exit 1; \ fi; \ + rm -rf "$(SPEC2026_IMAGE_DIR)/bin" "$(SPEC2026_IMAGE_DIR)/kernel" "$(SPEC2026_IMAGE_DIR)/rootfs" "$(SPEC2026_IMAGE_DIR)/elf" "$(SPEC2026_IMAGE_DIR)/cmd" "$(SPEC2026_IMAGE_DIR)/cfg" "$(SPEC2026_IMAGE_DIR)/gcpt" "$(SPEC2026_IMAGE_DIR)/logs" "$(SPEC2026_IMAGE_DIR)/stamps"; \ total="$(words $(SPEC2026_IMAGE_CASES))"; \ i=0; \ for case in $(SPEC2026_IMAGE_CASES); do \ i=$$((i + 1)); \ - case "$$case" in \ - *_s) image_dir="$(SPEC2026_IMAGE_SPEED_DIR)" ;; \ - *) image_dir="$(SPEC2026_IMAGE_RATE_DIR)" ;; \ - esac; \ - stamp="$$image_dir/stamps/$$case.images.stamp"; \ - if [ -f "$$stamp" ] && [ -f "$$image_dir/bin/$$case.fw_payload.bin" ] && [ -f "$$image_dir/kernel/$$case.Image" ] && [ -f "$$image_dir/rootfs/$$case.rootfs.cpio" ] && [ -f "$$image_dir/elf/$$case.elf" ] && [ -f "$$image_dir/cmd/$$case.run.sh" ] && [ -f "$$image_dir/cfg/$(notdir $(SPEC2026_CFG))" ] && [ -f "$$image_dir/gcpt/gcpt.elf" ] && [ -f "$$image_dir/gcpt/gcpt.bin" ] && [ -f "$$image_dir/logs/build_elf/$$case.log" ]; then \ - printf '[spec2026 %s/%s] Reusing exported images for %s\n' "$$i" "$$total" "$$case"; \ - continue; \ - fi; \ - if [ -f "$$stamp" ]; then \ - rm -f "$$stamp"; \ - fi; \ - SPEC2026_PROGRESS_K="$$i" SPEC2026_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2026_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2026_DEFAULT_DTB)" "$$stamp" || exit $$?; \ + SPEC2026_INPUT="$(SPEC2026_IMAGE_INPUT)" SPEC2026_PROGRESS_K="$$i" SPEC2026_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2026_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2026_DEFAULT_DTB)" "$(call spec2026_case_image_stamp,$$case)" || exit $$?; \ done - @printf '[spec2026 %s/%s] Output written to %s and %s\n' "$(words $(SPEC2026_IMAGE_CASES))" "$(words $(SPEC2026_IMAGE_CASES))" "$(abspath $(SPEC2026_IMAGE_RATE_DIR))" "$(abspath $(SPEC2026_IMAGE_SPEED_DIR))" + @printf '[spec2026 %s/%s] Output written to %s\n' "$(words $(SPEC2026_IMAGE_CASES))" "$(words $(SPEC2026_IMAGE_CASES))" "$(abspath $(SPEC2026_IMAGE_DIR))" .PHONY: linux/spec2026 spec2026-check-spec-iso spec2026-prepare spec2026-elf spec2026-elfs spec2026-images spec2026-force