All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] oeqa/selftest/reproducible: Use a fake time during build
@ 2026-09-01 17:41 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 ` [PATCH 2/2] oeqa/selftest/reproducible: Use a fake time during build Mathieu Dubois-Briand
  0 siblings, 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

Implement some long standing idea: use a fake time during the second
half of the reproducible tests, helping to find potentially hidden
reproducibility issues.
https://bugzilla.yoctoproject.org/show_bug.cgi?id=13509

No regression seen with current master branch:
https://autobuilder.yoctoproject.org/valkyrie/#/builders/37/builds/4878

Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
---
Mathieu Dubois-Briand (2):
      libfaketime: Import recipe from meta-oe
      oeqa/selftest/reproducible: Use a fake time during build

 meta/conf/distro/include/maintainers.inc           |  1 +
 meta/lib/oeqa/selftest/cases/reproducible.py       | 28 +++++++++++++-----
 ...onst-qualifiers-to-fix-build-with-ISO-C23.patch | 34 ++++++++++++++++++++++
 .../libfaketime/libfaketime_0.9.12.bb              | 31 ++++++++++++++++++++
 4 files changed, 87 insertions(+), 7 deletions(-)
---
base-commit: db81c1a42a0f552d9a8ec124f004ae2063d58c33
change-id: 20260901-mathieu-reproducible-faketime-4d11333edacf

Best regards,
-- 
Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [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

* Patchtest results for [PATCH 1/2] libfaketime: Import recipe from meta-oe
  2026-09-01 17:41 ` [PATCH 1/2] libfaketime: Import recipe from meta-oe Mathieu Dubois-Briand
@ 2026-09-01 17:47   ` patchtest
  2026-09-02  7:57   ` Mathieu Dubois-Briand
  1 sibling, 0 replies; 5+ messages in thread
From: patchtest @ 2026-09-01 17:47 UTC (permalink / raw)
  To: Mathieu Dubois-Briand; +Cc: openembedded-core

[-- Attachment #1: Type: text/plain, Size: 3198 bytes --]

Thank you for your submission. Patchtest identified one
or more issues with the patch. Please see the log below for
more information:

---
Testing patch /home/patchtest/share/mboxes/1-2-libfaketime-Import-recipe-from-meta-oe.patch

FAIL: test Signed-off-by presence: A patch file has been added without a Signed-off-by tag: '0001-Add-const-qualifiers-to-fix-build-with-ISO-C23.patch' (test_patch.TestPatch.test_signed_off_by_presence)
FAIL: test commit message presence: Please include a commit message on your patch explaining the change (test_mbox.TestMbox.test_commit_message_presence)

PASS: test CVE tag format (test_patch.TestPatch.test_cve_tag_format)
PASS: test Signed-off-by presence (test_mbox.TestMbox.test_signed_off_by_presence)
PASS: test Upstream-Status presence (test_patch.TestPatch.test_upstream_status_presence_format)
PASS: test auh changelog truncation notice (test_mbox.TestMbox.test_auh_changelog_truncation_notice)
PASS: test author valid (test_mbox.TestMbox.test_author_valid)
PASS: test commit message user tags (test_mbox.TestMbox.test_commit_message_user_tags)
PASS: test lic files chksum presence (test_metadata.TestMetadata.test_lic_files_chksum_presence)
PASS: test license presence (test_metadata.TestMetadata.test_license_presence)
PASS: test max line length (test_metadata.TestMetadata.test_max_line_length)
PASS: test mbox format (test_mbox.TestMbox.test_mbox_format)
PASS: test non-AUH upgrade (test_mbox.TestMbox.test_non_auh_upgrade)
PASS: test shortlog format (test_mbox.TestMbox.test_shortlog_format)
PASS: test shortlog length (test_mbox.TestMbox.test_shortlog_length)
PASS: test summary presence (test_metadata.TestMetadata.test_summary_presence)
PASS: test target mailing list (test_mbox.TestMbox.test_target_mailing_list)

SKIP: pretest pylint: No python related patches, skipping test (test_python_pylint.PyLint.pretest_pylint)
SKIP: pretest src uri left files: No modified recipes, skipping pretest (test_metadata.TestMetadata.pretest_src_uri_left_files)
SKIP: test CVE check ignore: No modified recipes or older target branch, skipping test (test_metadata.TestMetadata.test_cve_check_ignore)
SKIP: test bugzilla entry format: No bug ID found (test_mbox.TestMbox.test_bugzilla_entry_format)
SKIP: test lic files chksum modified not mentioned: No modified recipes, skipping test (test_metadata.TestMetadata.test_lic_files_chksum_modified_not_mentioned)
SKIP: test pylint: No python related patches, skipping test (test_python_pylint.PyLint.test_pylint)
SKIP: test series merge on head: Merge test is disabled for now (test_mbox.TestMbox.test_series_merge_on_head)
SKIP: test src uri left files: No modified recipes, skipping test (test_metadata.TestMetadata.test_src_uri_left_files)

---

Please address the issues identified and
submit a new revision of the patch, or alternatively, reply to this
email with an explanation of why the patch should be accepted. If you
believe these results are due to an error in patchtest, please submit a
bug at https://bugzilla.yoctoproject.org/ (use the 'Patchtest' category
under 'Yocto Project Subprojects'). For more information on specific
failures, see: https://wiki.yoctoproject.org/wiki/Patchtest. Thank
you!

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] libfaketime: Import recipe from meta-oe
  2026-09-01 17:41 ` [PATCH 1/2] libfaketime: Import recipe from meta-oe Mathieu Dubois-Briand
  2026-09-01 17:47   ` Patchtest results for " patchtest
@ 2026-09-02  7:57   ` Mathieu Dubois-Briand
  1 sibling, 0 replies; 5+ messages in thread
From: Mathieu Dubois-Briand @ 2026-09-02  7:57 UTC (permalink / raw)
  To: openembedded-core; +Cc: Thomas Petazzoni, Mathieu Dubois-Briand

On Tue Sep 1, 2026 at 7:41 PM CEST, Mathieu Dubois-Briand wrote:
> 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

This is failing on some platforms:

https://autobuilder.yoctoproject.org/valkyrie/#/builders/6/builds/4571
https://autobuilder.yoctoproject.org/valkyrie/#/builders/6/builds/4571
https://autobuilder.yoctoproject.org/valkyrie/#/builders/6/builds/4571

I will have a look at that.

-- 
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-09-02  7:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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: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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.