On 30/12/2024 9:00 pm, Maximilian Engelhardt wrote:
> Use the solution described in [1] to replace the call to the 'date'
> command with a version that uses SOURCE_DATE_EPOCH if available. This
> is needed for reproducible builds.
>
> The -d "@..." syntax was introduced in GNU date about 2005 (but only
> added to the docuemntation in 2011), so I assume a version supporting
> this syntax is available, if SOURCE_DATE_EPOCH is defined. If
> SOURCE_DATE_EPOCH is not defined, nothing changes with respect to the
> current behavior.
>
> [1] https://reproducible-builds.org/docs/source-date-epoch/
>
> Signed-off-by: Maximilian Engelhardt <m...@daemonizer.de>
> ---
> docs/Makefile | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/docs/Makefile b/docs/Makefile
> index b30cc619f8..beba02a94f 100644
> --- a/docs/Makefile
> +++ b/docs/Makefile
> @@ -3,7 +3,13 @@ include $(XEN_ROOT)/Config.mk
> -include $(XEN_ROOT)/config/Docs.mk
>
> VERSION := $(shell $(MAKE) -C $(XEN_ROOT)/xen
> --no-print-directory xenversion)
> -DATE := $(shell date +%Y-%m-%d)
> +
> +DATE_FMT := +%Y-%m-%d
> +ifdef SOURCE_DATE_EPOCH
> +DATE := $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "$(DATE_FMT)"
> 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "$(DATE_FMT)" 2>/dev/null ||
> date -u "$(DATE_FMT)")
> +else
> +DATE := $(shell date "$(DATE_FMT)")
> +endif
>
> DOC_ARCHES := arm x86_32 x86_64
> MAN_SECTIONS := 1 5 7 8
While this looks fine for docs, there's another (identical) use of date
in tools/firmware/hvmloader/Makefile, as well as some differing uses to
construct XEN_BUILD_{DATE,TIME}. INSTALL talks about VGABIOS_REL_DATE too.
Does something like this work for you? It seems to DTRT for SMBIOS. It
needs adapting a bit more for vgabios and Xen, but I think having one
common $(date) is going to be better than ad-hoc ones over the tree.
~Andrew
diff --git a/Config.mk b/Config.mk
index fa0414055b93..0931e702b025 100644
--- a/Config.mk
+++ b/Config.mk
@@ -141,6 +141,14 @@ export XEN_HAS_BUILD_ID=y
build_id_linker := --build-id=sha1
endif
+# Wrap date(1) to use SOURCE_DATE_EPOCH if set the environment.
+# See https://reproducible-builds.org/docs/source-date-epoch/
+ifdef SOURCE_DATE_EPOCH
+date = $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "$(1)" 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "$(1)" 2>/dev/null || date -u "$(1)")
+else
+date = $(shell date "$(1)")
+endif
+
define buildmakevars2shellvars
export PREFIX="$(prefix)"; \
export XEN_SCRIPT_DIR="$(XEN_SCRIPT_DIR)"; \
diff --git a/docs/Makefile b/docs/Makefile
index b30cc619f8dd..95dc83ff9c59 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -3,7 +3,7 @@ include $(XEN_ROOT)/Config.mk
-include $(XEN_ROOT)/config/Docs.mk
VERSION := $(shell $(MAKE) -C $(XEN_ROOT)/xen --no-print-directory xenversion)
-DATE := $(shell date +%Y-%m-%d)
+DATE := $(call date,+%Y-%m-%d)
DOC_ARCHES := arm x86_32 x86_64
MAN_SECTIONS := 1 5 7 8
diff --git a/tools/firmware/hvmloader/Makefile b/tools/firmware/hvmloader/Makefile
index c7bc4006578a..1e77b014f614 100644
--- a/tools/firmware/hvmloader/Makefile
+++ b/tools/firmware/hvmloader/Makefile
@@ -23,7 +23,7 @@ include $(XEN_ROOT)/tools/firmware/Rules.mk
ld-option = $(shell if $(LD) -v $(1) >/dev/null 2>&1; then echo y; else echo n; fi)
# SMBIOS spec requires format mm/dd/yyyy
-SMBIOS_REL_DATE ?= $(shell date +%m/%d/%Y)
+SMBIOS_REL_DATE ?= $(call date,+%m/%d/%Y)
CFLAGS += $(CFLAGS_xeninclude) -fno-pic -mregparm=3