diff mbox series

[meta-oe,walnascar,2/2] python3-evdev: Fix buildpaths errors and reproducibility

Message ID 20250628163727.859462-2-martin.jansa@gmail.com
State New
Headers show
Series [meta-oe,walnascar,1/2] python3-evdev: Use Yocto kernel headers instead of host's | expand

Commit Message

Martin Jansa June 28, 2025, 4:37 p.m. UTC
From: Yoann Congal <yoann.congal@smile.fr>

Add a submitted patch to support the reproducible generation of
intermediate file ecodes.c, then, use it to fix the buildpaths errors.

Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 ...ibility-option-for-building-ecodes.c.patch | 116 ++++++++++++++++++
 .../python/python3-evdev_1.9.1.bb             |   5 +-
 2 files changed, 119 insertions(+), 2 deletions(-)
 create mode 100644 meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch

Comments

Yoann Congal June 28, 2025, 4:59 p.m. UTC | #1
Hi,

Le sam. 28 juin 2025 à 18:37, <martin.jansa@gmail.com> a écrit :

> From: Yoann Congal <yoann.congal@smile.fr>
>
> Add a submitted patch to support the reproducible generation of
> intermediate file ecodes.c, then, use it to fix the buildpaths errors.
>
> Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
> Signed-off-by: Khem Raj <raj.khem@gmail.com>
> ---
>  ...ibility-option-for-building-ecodes.c.patch | 116 ++++++++++++++++++
>  .../python/python3-evdev_1.9.1.bb             |   5 +-
>  2 files changed, 119 insertions(+), 2 deletions(-)
>  create mode 100644
> meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch
>
> diff --git
> a/meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch
> b/meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch
> new file mode 100644
> index 0000000000..e730519884
> --- /dev/null
> +++
> b/meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch
> @@ -0,0 +1,116 @@
> +From d05c1c9dd298cb95d7feccbddb5caa043a319a01 Mon Sep 17 00:00:00 2001
> +From: Yoann Congal <yoann.congal@smile.fr>
> +Date: Sun, 13 Apr 2025 00:52:13 +0200
> +Subject: [PATCH] Add a reproducibility option for building ecodes.c
> +
> +ecodes.c currently contains the kernel info of the build machine and the
> +full path of the input*.h headers: This is not reproducible as output
> +can change even is headers content do not. Downstream distributions
> +might package ecodes.c and get non-reproducible output.
> +
> +To fix this: introduce a --reproducible option in the build:
> +- in setup.py build_ecodes command
> +- in underlying genecodes_c.py
> +
> +Note: These options are disabled by default so no change is expected in
> +current builds.
> +
> +Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
> +Upstream-Status: Submitted [
> https://github.com/gvalkov/python-evdev/pull/242]
>

For what it's worth, this is now a backport :
https://github.com/gvalkov/python-evdev/commit/6b4e8ef0ee505d9c3d46b1787eac339d8bd0b934
Never sent the update on master since it was release as part of v1.9.2.

Regards,

+---
> + setup.py                 | 13 ++++++++++---
> + src/evdev/genecodes_c.py | 17 +++++++++++------
> + 2 files changed, 21 insertions(+), 9 deletions(-)
> +
> +diff --git a/setup.py b/setup.py
> +index 6b721d7..3371199 100755
> +--- a/setup.py
> ++++ b/setup.py
> +@@ -14,7 +14,7 @@ curdir = Path(__file__).resolve().parent
> + ecodes_c_path = curdir / "src/evdev/ecodes.c"
> +
> +
> +-def create_ecodes(headers=None):
> ++def create_ecodes(headers=None, reproducibility=False):
> +     if not headers:
> +         include_paths = set()
> +         cpath = os.environ.get("CPATH", "").strip()
> +@@ -65,7 +65,10 @@ def create_ecodes(headers=None):
> +
> +     print("writing %s (using %s)" % (ecodes_c_path, " ".join(headers)))
> +     with ecodes_c_path.open("w") as fh:
> +-        cmd = [sys.executable, "src/evdev/genecodes_c.py", "--ecodes",
> *headers]
> ++        cmd = [sys.executable, "src/evdev/genecodes_c.py"]
> ++        if reproducibility:
> ++            cmd.append("--reproducibility")
> ++        cmd.extend(["--ecodes", *headers])
> +         run(cmd, check=True, stdout=fh)
> +
> +
> +@@ -74,17 +77,21 @@ class build_ecodes(Command):
> +
> +     user_options = [
> +         ("evdev-headers=", None, "colon-separated paths to input
> subsystem headers"),
> ++        ("reproducibility", None, "hide host details (host/paths) to
> create a reproducible output"),
> +     ]
> +
> +     def initialize_options(self):
> +         self.evdev_headers = None
> ++        self.reproducibility = False
> +
> +     def finalize_options(self):
> +         if self.evdev_headers:
> +             self.evdev_headers = self.evdev_headers.split(":")
> ++        if self.reproducibility is None:
> ++            self.reproducibility = False
> +
> +     def run(self):
> +-        create_ecodes(self.evdev_headers)
> ++        create_ecodes(self.evdev_headers,
> reproducibility=self.reproducibility)
> +
> +
> + class build_ext(_build_ext.build_ext):
> +diff --git a/src/evdev/genecodes_c.py b/src/evdev/genecodes_c.py
> +index 5c2d946..24cad27 100644
> +--- a/src/evdev/genecodes_c.py
> ++++ b/src/evdev/genecodes_c.py
> +@@ -15,22 +15,27 @@ headers = [
> +     "/usr/include/linux/uinput.h",
> + ]
> +
> +-opts, args = getopt.getopt(sys.argv[1:], "", ["ecodes", "stubs"])
> ++opts, args = getopt.getopt(sys.argv[1:], "", ["ecodes", "stubs",
> "reproducibility"])
> + if not opts:
> +-    print("usage: genecodes.py [--ecodes|--stubs] <headers>")
> ++    print("usage: genecodes.py [--ecodes|--stubs] [--reproducibility]
> <headers>")
> +     exit(2)
> +
> + if args:
> +     headers = args
> +
> ++reproducibility = ("--reproducibility", "") in opts
> ++
> +
> + #
> -----------------------------------------------------------------------------
> + macro_regex =
> r"#define\s+((?:KEY|ABS|REL|SW|MSC|LED|BTN|REP|SND|ID|EV|BUS|SYN|FF|UI_FF|INPUT_PROP)_\w+)"
> + macro_regex = re.compile(macro_regex)
> +
> +-# Uname without hostname.
> +-uname = list(os.uname())
> +-uname = " ".join((uname[0], *uname[2:]))
> ++if reproducibility:
> ++    uname = "hidden for reproducibility"
> ++else:
> ++    # Uname without hostname.
> ++    uname = list(os.uname())
> ++    uname = " ".join((uname[0], *uname[2:]))
> +
> +
> + #
> -----------------------------------------------------------------------------
> +@@ -138,5 +143,5 @@ elif ("--stubs", "") in opts:
> +     template = template_stubs
> +
> + body = os.linesep.join(body)
> +-text = template % (uname, headers, body)
> ++text = template % (uname, headers if not reproducibility else ["hidden
> for reproducibility"], body)
> + print(text.strip())
> diff --git a/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb
> b/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb
> index b8930c97d5..af88770c59 100644
> --- a/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb
> +++ b/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb
> @@ -3,6 +3,7 @@ HOMEPAGE = "https://github.com/gvalkov/python-evdev"
>  LICENSE = "BSD-3-Clause"
>  LIC_FILES_CHKSUM = "file://LICENSE;md5=d7bd1cc4c71b706c7e2d4053aef50f2a"
>
> +SRC_URI +=
> "file://0001-Add-a-reproducibility-option-for-building-ecodes.c.patch"
>  SRC_URI[sha256sum] =
> "dc640a064cb1c9fe1f8b970dc2039945a2a275d7b7ee62284bf427238abe45ee"
>
>  inherit pypi python_setuptools_build_meta
> @@ -12,7 +13,8 @@ do_compile:prepend() {
>  }
>
>  PEP517_BUILD_OPTS = "--config-setting=--build-option='build_ecodes \
> -    --evdev-headers
> ${STAGING_DIR_TARGET}/usr/include/linux/input.h:${STAGING_DIR_TARGET}/usr/include/linux/input-event-codes.h'"
> +    --evdev-headers
> ${STAGING_DIR_TARGET}/usr/include/linux/input.h:${STAGING_DIR_TARGET}/usr/include/linux/input-event-codes.h
> \
> +    --reproducibility'"
>
>  RDEPENDS:${PN} += "\
>      python3-ctypes \
> @@ -21,4 +23,3 @@ RDEPENDS:${PN} += "\
>      python3-shell \
>      python3-stringold \
>      "
> -INSANE_SKIP:${PN}-src = "buildpaths"
>
diff mbox series

Patch

diff --git a/meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch b/meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch
new file mode 100644
index 0000000000..e730519884
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-evdev/0001-Add-a-reproducibility-option-for-building-ecodes.c.patch
@@ -0,0 +1,116 @@ 
+From d05c1c9dd298cb95d7feccbddb5caa043a319a01 Mon Sep 17 00:00:00 2001
+From: Yoann Congal <yoann.congal@smile.fr>
+Date: Sun, 13 Apr 2025 00:52:13 +0200
+Subject: [PATCH] Add a reproducibility option for building ecodes.c
+
+ecodes.c currently contains the kernel info of the build machine and the
+full path of the input*.h headers: This is not reproducible as output
+can change even is headers content do not. Downstream distributions
+might package ecodes.c and get non-reproducible output.
+
+To fix this: introduce a --reproducible option in the build:
+- in setup.py build_ecodes command
+- in underlying genecodes_c.py
+
+Note: These options are disabled by default so no change is expected in
+current builds.
+
+Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
+Upstream-Status: Submitted [https://github.com/gvalkov/python-evdev/pull/242]
+---
+ setup.py                 | 13 ++++++++++---
+ src/evdev/genecodes_c.py | 17 +++++++++++------
+ 2 files changed, 21 insertions(+), 9 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 6b721d7..3371199 100755
+--- a/setup.py
++++ b/setup.py
+@@ -14,7 +14,7 @@ curdir = Path(__file__).resolve().parent
+ ecodes_c_path = curdir / "src/evdev/ecodes.c"
+ 
+ 
+-def create_ecodes(headers=None):
++def create_ecodes(headers=None, reproducibility=False):
+     if not headers:
+         include_paths = set()
+         cpath = os.environ.get("CPATH", "").strip()
+@@ -65,7 +65,10 @@ def create_ecodes(headers=None):
+ 
+     print("writing %s (using %s)" % (ecodes_c_path, " ".join(headers)))
+     with ecodes_c_path.open("w") as fh:
+-        cmd = [sys.executable, "src/evdev/genecodes_c.py", "--ecodes", *headers]
++        cmd = [sys.executable, "src/evdev/genecodes_c.py"]
++        if reproducibility:
++            cmd.append("--reproducibility")
++        cmd.extend(["--ecodes", *headers])
+         run(cmd, check=True, stdout=fh)
+ 
+ 
+@@ -74,17 +77,21 @@ class build_ecodes(Command):
+ 
+     user_options = [
+         ("evdev-headers=", None, "colon-separated paths to input subsystem headers"),
++        ("reproducibility", None, "hide host details (host/paths) to create a reproducible output"),
+     ]
+ 
+     def initialize_options(self):
+         self.evdev_headers = None
++        self.reproducibility = False
+ 
+     def finalize_options(self):
+         if self.evdev_headers:
+             self.evdev_headers = self.evdev_headers.split(":")
++        if self.reproducibility is None:
++            self.reproducibility = False
+ 
+     def run(self):
+-        create_ecodes(self.evdev_headers)
++        create_ecodes(self.evdev_headers, reproducibility=self.reproducibility)
+ 
+ 
+ class build_ext(_build_ext.build_ext):
+diff --git a/src/evdev/genecodes_c.py b/src/evdev/genecodes_c.py
+index 5c2d946..24cad27 100644
+--- a/src/evdev/genecodes_c.py
++++ b/src/evdev/genecodes_c.py
+@@ -15,22 +15,27 @@ headers = [
+     "/usr/include/linux/uinput.h",
+ ]
+ 
+-opts, args = getopt.getopt(sys.argv[1:], "", ["ecodes", "stubs"])
++opts, args = getopt.getopt(sys.argv[1:], "", ["ecodes", "stubs", "reproducibility"])
+ if not opts:
+-    print("usage: genecodes.py [--ecodes|--stubs] <headers>")
++    print("usage: genecodes.py [--ecodes|--stubs] [--reproducibility] <headers>")
+     exit(2)
+ 
+ if args:
+     headers = args
+ 
++reproducibility = ("--reproducibility", "") in opts
++
+ 
+ # -----------------------------------------------------------------------------
+ macro_regex = r"#define\s+((?:KEY|ABS|REL|SW|MSC|LED|BTN|REP|SND|ID|EV|BUS|SYN|FF|UI_FF|INPUT_PROP)_\w+)"
+ macro_regex = re.compile(macro_regex)
+ 
+-# Uname without hostname.
+-uname = list(os.uname())
+-uname = " ".join((uname[0], *uname[2:]))
++if reproducibility:
++    uname = "hidden for reproducibility"
++else:
++    # Uname without hostname.
++    uname = list(os.uname())
++    uname = " ".join((uname[0], *uname[2:]))
+ 
+ 
+ # -----------------------------------------------------------------------------
+@@ -138,5 +143,5 @@ elif ("--stubs", "") in opts:
+     template = template_stubs
+ 
+ body = os.linesep.join(body)
+-text = template % (uname, headers, body)
++text = template % (uname, headers if not reproducibility else ["hidden for reproducibility"], body)
+ print(text.strip())
diff --git a/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb b/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb
index b8930c97d5..af88770c59 100644
--- a/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb
+++ b/meta-python/recipes-devtools/python/python3-evdev_1.9.1.bb
@@ -3,6 +3,7 @@  HOMEPAGE = "https://github.com/gvalkov/python-evdev"
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=d7bd1cc4c71b706c7e2d4053aef50f2a"
 
+SRC_URI += "file://0001-Add-a-reproducibility-option-for-building-ecodes.c.patch"
 SRC_URI[sha256sum] = "dc640a064cb1c9fe1f8b970dc2039945a2a275d7b7ee62284bf427238abe45ee"
 
 inherit pypi python_setuptools_build_meta
@@ -12,7 +13,8 @@  do_compile:prepend() {
 }
 
 PEP517_BUILD_OPTS = "--config-setting=--build-option='build_ecodes \
-    --evdev-headers ${STAGING_DIR_TARGET}/usr/include/linux/input.h:${STAGING_DIR_TARGET}/usr/include/linux/input-event-codes.h'"
+    --evdev-headers ${STAGING_DIR_TARGET}/usr/include/linux/input.h:${STAGING_DIR_TARGET}/usr/include/linux/input-event-codes.h \
+    --reproducibility'"
 
 RDEPENDS:${PN} += "\
     python3-ctypes \
@@ -21,4 +23,3 @@  RDEPENDS:${PN} += "\
     python3-shell \
     python3-stringold \
     "
-INSANE_SKIP:${PN}-src = "buildpaths"