* [PATCH 1/2] libfaketime: Import recipe from meta-oe
2026-09-01 17:41 [PATCH 0/2] oeqa/selftest/reproducible: Use a fake time during build Mathieu Dubois-Briand
@ 2026-09-01 17:41 ` Mathieu Dubois-Briand
2026-09-01 17:47 ` Patchtest results for " patchtest
2026-09-02 7:57 ` Mathieu Dubois-Briand
2026-09-01 17:41 ` [PATCH 2/2] oeqa/selftest/reproducible: Use a fake time during build Mathieu Dubois-Briand
1 sibling, 2 replies; 5+ messages in thread
From: Mathieu Dubois-Briand @ 2026-09-01 17:41 UTC (permalink / raw)
To: openembedded-core; +Cc: Thomas Petazzoni, Mathieu Dubois-Briand
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
---
meta/conf/distro/include/maintainers.inc | 1 +
...onst-qualifiers-to-fix-build-with-ISO-C23.patch | 34 ++++++++++++++++++++++
.../libfaketime/libfaketime_0.9.12.bb | 31 ++++++++++++++++++++
3 files changed, 66 insertions(+)
diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc
index 2966cddc0569..fc57eb1395a1 100644
--- a/meta/conf/distro/include/maintainers.inc
+++ b/meta/conf/distro/include/maintainers.inc
@@ -342,6 +342,7 @@ RECIPE_MAINTAINER:pn-libevdev = "Unassigned <unassigned@yoctoproject.org>"
RECIPE_MAINTAINER:pn-libevent = "Unassigned <unassigned@yoctoproject.org>"
RECIPE_MAINTAINER:pn-libexif = "Unassigned <unassigned@yoctoproject.org>"
RECIPE_MAINTAINER:pn-libfakekey = "Unassigned <unassigned@yoctoproject.org>"
+RECIPE_MAINTAINER:pn-libfaketime = "Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>"
RECIPE_MAINTAINER:pn-libffi = "Unassigned <unassigned@yoctoproject.org>"
RECIPE_MAINTAINER:pn-libfm = "Unassigned <unassigned@yoctoproject.org>"
RECIPE_MAINTAINER:pn-libfm-extra = "Unassigned <unassigned@yoctoproject.org>"
diff --git a/meta/recipes-support/libfaketime/libfaketime/0001-Add-const-qualifiers-to-fix-build-with-ISO-C23.patch b/meta/recipes-support/libfaketime/libfaketime/0001-Add-const-qualifiers-to-fix-build-with-ISO-C23.patch
new file mode 100644
index 000000000000..1696e7146e83
--- /dev/null
+++ b/meta/recipes-support/libfaketime/libfaketime/0001-Add-const-qualifiers-to-fix-build-with-ISO-C23.patch
@@ -0,0 +1,34 @@
+From dbe865dfdba0145d993d70b7fd4ec88b2f47554b Mon Sep 17 00:00:00 2001
+From: Tomas Korbar <tkorbar@redhat.com>
+Date: Mon, 15 Dec 2025 11:03:21 +0100
+Subject: [PATCH] Add const qualifiers to fix build with ISO C23
+
+Fix https://github.com/wolfcw/libfaketime/issues/524
+
+Upstream-Status: Backport [https://github.com/wolfcw/libfaketime/pull/525]
+---
+ src/libfaketime.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/libfaketime.c b/src/libfaketime.c
+index ef1dca9..02839c8 100644
+--- a/src/libfaketime.c
++++ b/src/libfaketime.c
+@@ -2666,7 +2666,7 @@ int timespec_get(struct timespec *ts, int base)
+ static void parse_ft_string(const char *user_faked_time)
+ {
+ struct tm user_faked_time_tm;
+- char * tmp_time_fmt;
++ const char * tmp_time_fmt;
+ char * nstime_str;
+
+ if (!strncmp(user_faked_time, user_faked_time_saved, BUFFERLEN))
+@@ -3338,7 +3338,7 @@ static void prepare_config_contents(char *contents)
+ bool str_array_contains(const char *haystack, const char *needle)
+ {
+ size_t needle_len = strlen(needle);
+- char *pos = strstr(haystack, needle);
++ const char *pos = strstr(haystack, needle);
+ while (pos) {
+ if (pos == haystack || *(pos - 1) == ',') {
+ char nextc = *(pos + needle_len);
diff --git a/meta/recipes-support/libfaketime/libfaketime_0.9.12.bb b/meta/recipes-support/libfaketime/libfaketime_0.9.12.bb
new file mode 100644
index 000000000000..89e4eebeaa46
--- /dev/null
+++ b/meta/recipes-support/libfaketime/libfaketime_0.9.12.bb
@@ -0,0 +1,31 @@
+SUMMARY = "A library for faking the system time in user-space programs"
+SECTION = "libs"
+HOMEPAGE = "https://github.com/wolfcw/libfaketime"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+
+SRCREV = "3ccdd344aadf1e317156fa5fb7c881f2c4404778"
+
+SRC_URI = "git://github.com/wolfcw/libfaketime.git;branch=master;tag=v${PV};protocol=https \
+ file://0001-Add-const-qualifiers-to-fix-build-with-ISO-C23.patch \
+"
+
+CFLAGS:append:libc-musl = " -D_LARGEFILE64_SOURCE"
+
+do_configure[noexec] = "1"
+
+do_compile () {
+ oe_runmake
+}
+
+do_install () {
+ install -d ${D}${libdir}/faketime
+ oe_libinstall -C src libfaketime ${D}${libdir}/faketime
+ install -d ${D}${bindir}
+ install -m 0755 src/faketime ${D}${bindir}
+}
+
+FILES:${PN} = "${bindir}/faketime ${libdir}/faketime/lib*${SOLIBS}"
+FILES:${PN}-dev += "${libdir}/faketime/lib*${SOLIBSDEV}"
+
+BBCLASSEXTEND = "native"
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/2] oeqa/selftest/reproducible: Use a fake time during build
2026-09-01 17:41 [PATCH 0/2] oeqa/selftest/reproducible: Use a fake time during build Mathieu Dubois-Briand
2026-09-01 17:41 ` [PATCH 1/2] libfaketime: Import recipe from meta-oe Mathieu Dubois-Briand
@ 2026-09-01 17:41 ` Mathieu Dubois-Briand
1 sibling, 0 replies; 5+ messages in thread
From: Mathieu Dubois-Briand @ 2026-09-01 17:41 UTC (permalink / raw)
To: openembedded-core; +Cc: Thomas Petazzoni, Mathieu Dubois-Briand
Use a fake time during the second build, ensuring the build time is way
different from the first build.
Fixes [YOCTO #13509]
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
---
meta/lib/oeqa/selftest/cases/reproducible.py | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/meta/lib/oeqa/selftest/cases/reproducible.py b/meta/lib/oeqa/selftest/cases/reproducible.py
index 7adeaacd4f53..1a71b9832e34 100644
--- a/meta/lib/oeqa/selftest/cases/reproducible.py
+++ b/meta/lib/oeqa/selftest/cases/reproducible.py
@@ -229,7 +229,7 @@ class ReproducibleTests(OESelftestTestCase):
bb.utils.mkdirhier(os.path.dirname(dest))
shutil.copyfile(source, dest)
- def do_test_build(self, name, use_sstate):
+ def do_test_build(self, name, use_sstate, use_faketime, libfaketime_sysroot):
capture_vars = ['DEPLOY_DIR_' + c.upper() for c in self.package_classes]
tmpdir = os.path.join(self.topdir, name, 'tmp')
@@ -295,7 +295,17 @@ class ReproducibleTests(OESelftestTestCase):
d = get_bb_vars(capture_vars)
try:
# targets used to be called images
- bitbake("--continue "+' '.join(getattr(self, 'images', self.targets)))
+ targets = ' '.join(getattr(self, 'images', self.targets))
+ if use_faketime:
+ # 397 days: one year and 31/32 days: this will always be a
+ # different year, month and day of week.
+ # 2 hours, 2 minutes and 2 seconds: different values, even if we
+ # have some DST or leap second involved.
+ timespecs = "+397days +2hours +2minutes +2seconds"
+ runCmd(f"faketime '{timespecs}' bitbake --continue {targets}",
+ native_sysroot=libfaketime_sysroot)
+ else:
+ bitbake(f"--continue {targets}")
except AssertionError as e:
bitbake_failure_count += 1
self.logger.error("Bitbake failed! but keep going... Log:")
@@ -320,9 +330,10 @@ class ReproducibleTests(OESelftestTestCase):
# Build native utilities
self.write_config('')
- bitbake("diffoscope-native diffutils-native -c addto_recipe_sysroot")
+ bitbake("diffoscope-native diffutils-native libfaketime-native -c addto_recipe_sysroot")
diffutils_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "diffutils-native")
diffoscope_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "diffoscope-native")
+ libfaketime_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "libfaketime-native")
if self.save_results:
os.makedirs(self.save_results, exist_ok=True)
@@ -338,10 +349,13 @@ class ReproducibleTests(OESelftestTestCase):
fails = []
vars_list = [None, None]
- for i, (name, use_sstate) in enumerate(
- (('reproducibleA', self.build_from_sstate),
- ('reproducibleB-extended', False))):
- (variables, bitbake_failure_count) = self.do_test_build(name, use_sstate)
+ for i, (name, use_sstate, use_faketime) in enumerate(
+ (('reproducibleA', self.build_from_sstate, False),
+ ('reproducibleB-extended', False, True))):
+ (variables, bitbake_failure_count) = self.do_test_build(name,
+ use_sstate,
+ use_faketime,
+ libfaketime_sysroot)
if bitbake_failure_count > 0:
self.logger.error('%s build failed. Trying to compute built packages differences but the test will fail.' % name)
fails.append("Bitbake %s failure" % name)
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread