[5/8] rootfs: make file timestamps reproducible

Message ID 20260820083014.3377283-6-felix.moessbauer@siemens.com
State New
Headers show
Series Make all sstate artifacts reproducible | expand

Commit Message

Felix Moessbauer Aug. 20, 2026, 8:30 a.m. UTC
As a preparation to get a bit-by-bit reproducible sstate artifact of the
rootfs, we make the file timestamps of do_rootfs_install reproducible.
For that, we move the corresponding logic from the image class to the
rootfs class. In image, we still do one final pass, as later tasks might
have changed the timestamps again.

Signed-off-by: Felix Moessbauer <felix.moessbauer@siemens.com>
---
 meta/classes-recipe/image.bbclass  | 6 ++----
 meta/classes-recipe/rootfs.bbclass | 8 ++++++++
 2 files changed, 10 insertions(+), 4 deletions(-)

Patch

diff --git a/meta/classes-recipe/image.bbclass b/meta/classes-recipe/image.bbclass
index f3a27782..7abda3de 100644
--- a/meta/classes-recipe/image.bbclass
+++ b/meta/classes-recipe/image.bbclass
@@ -487,10 +487,8 @@  EOSUDO
         bbwarn "found core dump in rootfs, check it in ${WORKDIR}/temp/${f##*/}"
     done
 
-    # Set same time-stamps to the newly generated file/folders in the
-    # rootfs image for the purpose of reproducible builds.
-    run_privileged find ${ROOTFSDIR} -newermt "$(date -d@${SOURCE_DATE_EPOCH} '+%Y-%m-%d %H:%M:%S')" \
-        -exec touch '{}' -h -d@${SOURCE_DATE_EPOCH} ';'
+    # Final pass to set timestamps of files in rootfs to SOURCE_DATE_EPOCH for reproducible builds
+    rootfs_set_timestamps
 }
 do_rootfs_finalize[network] = "${TASK_USE_SUDO}"
 addtask rootfs_finalize before do_rootfs after do_rootfs_install
diff --git a/meta/classes-recipe/rootfs.bbclass b/meta/classes-recipe/rootfs.bbclass
index 79dec69f..9a08312e 100644
--- a/meta/classes-recipe/rootfs.bbclass
+++ b/meta/classes-recipe/rootfs.bbclass
@@ -438,6 +438,7 @@  do_rootfs_install[depends] += "base-apt:do_cache isar-apt:do_cache_config"
 do_rootfs_install[deptask] = "do_deploy_deb"
 do_rootfs_install[rdeptask] = "do_deploy_deb"
 do_rootfs_install[network] = "${TASK_USE_SUDO}"
+do_rootfs_install[postfuncs] += "rootfs_set_timestamps"
 python do_rootfs_install() {
     configure_cmds = (d.getVar("ROOTFS_CONFIGURE_COMMAND") or "").split()
     install_cmds = (d.getVar("ROOTFS_INSTALL_COMMAND") or "").split()
@@ -619,6 +620,13 @@  image_postprocess_populate_systemd_preset() {
 EOSH
 }
 
+# Set same time-stamps to the newly generated file/folders in the rootfs image for the purpose of reproducible builds.
+# This has to be done after unmounting
+rootfs_set_timestamps() {
+    run_privileged find ${ROOTFSDIR} -newermt "$(date -d@${SOURCE_DATE_EPOCH} '+%Y-%m-%d %H:%M:%S')" \
+        -exec touch '{}' -h -d@${SOURCE_DATE_EPOCH} ';'
+}
+
 ROOTFS_INSTALL_COMMAND += "${@bb.utils.contains('ROOTFS_FEATURES', 'generate-initrd', 'rootfs_generate_initramfs', '', d)}"
 rootfs_generate_initramfs[weight] = "1000"
 rootfs_generate_initramfs[progress] = "custom:rootfs_progress.InitrdProgressHandler"