:: commit 3096634a6ce6070eb9c25051677fa13654773089

mintsuki <mintsuki@protonmail.com> — 2024-02-14 06:25

parents: 3d6227fe0c

build: Misc changes to improve reproducibility of builds

diff --git a/GNUmakefile.in b/GNUmakefile.in
index de390c02..bb83a2ca 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -8,6 +8,14 @@ ifneq ($(MAKEVER_VALID),1)
 $(error GNU Make version 4.2 or greater is required to build Limine)
 endif
 
+override LC_ALL := C
+export LC_ALL
+
+override SOURCE_DATE_EPOCH := @SOURCE_DATE_EPOCH@
+export SOURCE_DATE_EPOCH
+
+override SOURCE_DATE_EPOCH_TOUCH := @SOURCE_DATE_EPOCH_TOUCH@
+
 override prefix := @prefix@
 override exec_prefix := @exec_prefix@
 override PACKAGE_TARNAME := @PACKAGE_TARNAME@
@@ -224,21 +232,16 @@ ifneq ($(BUILD_UEFI_CD),no)
 	$(MKDIR_P) '$(call SHESCAPE,$(BINDIR))'
 	rm -f '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin'
 	dd if=/dev/zero of='$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' bs=512 count=2880 2>/dev/null
-	mformat -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' -f 1440 ::
-	mmd -D s -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' ::/EFI
-	mmd -D s -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' ::/EFI/BOOT
-	if [ -f '$(call SHESCAPE,$(BUILDDIR))/common-uefi-aarch64/BOOTAA64.EFI' ]; then \
-	    mcopy -D o -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' '$(call SHESCAPE,$(BUILDDIR))/common-uefi-aarch64/BOOTAA64.EFI' ::/EFI/BOOT; \
-	fi
-	if [ -f '$(call SHESCAPE,$(BUILDDIR))/common-uefi-riscv64/BOOTRISCV64.EFI' ]; then \
-	    mcopy -D o -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' '$(call SHESCAPE,$(BUILDDIR))/common-uefi-riscv64/BOOTRISCV64.EFI' ::/EFI/BOOT; \
-	fi
-	if [ -f '$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64/BOOTX64.EFI' ]; then \
-	    mcopy -D o -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' '$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64/BOOTX64.EFI' ::/EFI/BOOT; \
-	fi
-	if [ -f '$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32/BOOTIA32.EFI' ]; then \
-	    mcopy -D o -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' '$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32/BOOTIA32.EFI' ::/EFI/BOOT; \
-	fi
+	mformat -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' -f 1440 -N 12345678 ::
+	LIMINE_UEFI_CD_TMP="$$(mktemp -d)"; \
+		mkdir -p "$$LIMINE_UEFI_CD_TMP"/EFI/BOOT; \
+		cp '$(call SHESCAPE,$(BUILDDIR))/common-uefi-aarch64/BOOTAA64.EFI' "$$LIMINE_UEFI_CD_TMP"/EFI/BOOT/ 2>/dev/null; \
+		cp '$(call SHESCAPE,$(BUILDDIR))/common-uefi-riscv64/BOOTRISCV64.EFI' "$$LIMINE_UEFI_CD_TMP"/EFI/BOOT/ 2>/dev/null; \
+		cp '$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64/BOOTX64.EFI' "$$LIMINE_UEFI_CD_TMP"/EFI/BOOT/ 2>/dev/null; \
+		cp '$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32/BOOTIA32.EFI' "$$LIMINE_UEFI_CD_TMP"/EFI/BOOT/ 2>/dev/null; \
+		find "$$LIMINE_UEFI_CD_TMP" -execdir touch -d $(SOURCE_DATE_EPOCH_TOUCH) '{}' + && \
+		mcopy -D o -s -m -i '$(call SHESCAPE,$(BINDIR))/limine-uefi-cd.bin' "$$LIMINE_UEFI_CD_TMP"/EFI :: && \
+		rm -rf "$$LIMINE_UEFI_CD_TMP"
 endif
 
 .PHONY: limine-uefi-cd
diff --git a/common/GNUmakefile b/common/GNUmakefile
index c585a4ee..922ad85a 100644
--- a/common/GNUmakefile
+++ b/common/GNUmakefile
@@ -45,7 +45,8 @@ override CFLAGS_FOR_TARGET += \
     -fno-stack-check \
     -fno-omit-frame-pointer \
     -fno-strict-aliasing \
-    -fno-lto
+    -fno-lto \
+    -ffile-prefix-map='$(call SHESCAPE,$(SRCDIR))'=
 
 override CPPFLAGS_FOR_TARGET := \
     -isystem ../freestanding-headers \
@@ -576,29 +577,29 @@ endif
 ifeq ($(TARGET),bios)
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_ia32
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
 
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_bios_ia32
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
 
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_x86
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
 endif
 
 ifeq ($(TARGET),uefi-x86-64)
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_x86_64
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf64 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf64 -o '$(call SHESCAPE,$@)'
 
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_uefi_x86_64
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf64 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf64 -o '$(call SHESCAPE,$@)'
 
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_x86
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf64 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf64 -o '$(call SHESCAPE,$@)'
 endif
 
 ifeq ($(TARGET),uefi-aarch64)
@@ -624,13 +625,13 @@ endif
 ifeq ($(TARGET),uefi-ia32)
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_ia32
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
 
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_uefi_ia32
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
 
 $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_x86
 	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' -F dwarf -g -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
+	nasm '$(call SHESCAPE,$<)' -Wall $(WERROR_FLAG) $(NASM_TARGET) -f elf32 -o '$(call SHESCAPE,$@)'
 endif
diff --git a/configure.ac b/configure.ac
index c7b81e47..110273ed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -13,6 +13,12 @@ AC_SUBST([BUILDDIR])
 REGEN_DATE="m4_esyscmd([date '+%B %Y' | tr -d '\n'])"
 AC_SUBST([REGEN_DATE])
 
+SOURCE_DATE_EPOCH="m4_esyscmd([if git log -1 >/dev/null 2>&1; then git log -1 --pretty=%ct | tr -d '\n'; else printf 1546300800; fi])"
+AC_SUBST([SOURCE_DATE_EPOCH])
+
+SOURCE_DATE_EPOCH_TOUCH="m4_esyscmd([if git log -1 >/dev/null 2>&1; then git log -1 --pretty=%cI | sed 's/+.*//g' | tr -d '\n'; else printf 2019-01-01T00:00:00Z; fi])"
+AC_SUBST([SOURCE_DATE_EPOCH_TOUCH])
+
 AC_CANONICAL_HOST
 
 AC_DEFUN([PROG_ABSPATH], [
tab: 248 wrap: offon