diff mbox series

[meta-oe] libgpiod: update to v2.3

Message ID 20260616145535.83608-1-bartosz.golaszewski@oss.qualcomm.com
State Under Review
Headers show
Series [meta-oe] libgpiod: update to v2.3 | expand

Commit Message

Bartosz Golaszewski June 16, 2026, 2:55 p.m. UTC
Starting with this release, libgpiod now uses meson so the updates to
the recipe are quite extensive. There's a new shared library:
libgpiotools, that exports symbols previously only accessible to
gpio-tools that allow users to build their own high-level programs while
reusing the code doing GPIO line & chip lookup. While at it: move
libgpiodbus into its own package as well.

Full changelog:

New features:
- replace autotools with meson & ninja as the build system
- provide libgpiotools: a new shared library exposing a public API for
  line name lookup and other high-level helpers previously only available
  internally to gpio-tools
- add initial-state option to gpiomon to display line states before
  waiting for events
- provide comprehensive sphinx-based documentation for all components:
  core C API, C++ bindings, Python bindings, GLib bindings, D-Bus API,
  gpio-tools, and libgpiotools
- extend libgpiosim with new routines allowing to use the new functionality
  provided in more recent versions of the gpio-sim module in the kernel

Improvements:
- make tests work with newer coreutils by removing cases checking tools'
  behavior on SIGINT which stopped working due to changes in behavior of the
  timeout tool
- decouple the libgpiod core C library API version from the global libgpiod
  project version as the former is now quite stable and no longer changes
  with every release
- extend libgpiosim self-tests

Bug fixes:
- allow modifying settings for existing offsets in a full line-config
- fix signed/unsigned type mismatch in gpiod_line_request_get_value()
- add explicit NUL-termination after strncpy() calls in core library
- fix consumer string in line_info stream operator in C++ bindings
- use get_mapped_value() for all enum mappings in line_info in C++ bindings
- move g_tree_remove() out of g_assert() in gpiodbus_id_free() to avoid
  resource exhaustion when assertions are disabled
- return 0 when zero events are requested in edge-event API
- fix gpionotify watching lines on the wrong chip
- reject trailing garbage in parse_period() in gpio-tools
- store interactive sleep period in a long long in gpioset to avoid overflow
- use gpiod_line_settings_free() to release settings in line-config
- fix buffer over-read bugs when translating uAPI structs to library types
- fix variable and argument types where necessary
- sanitize values returned by the kernel to avoid potential buffer overflows
- fix memory leaks in gpio-tools
- add missing return value checks in gpio-tools
- fix period parsing in gpio-tools
- use correct loop counter in error path in gpio-manager
- don't try to export the same chip object twice in gpio-manager on duplicate
  uevents
- use the "add"/"remove" uevents when watching for GPIO chips in the system as
  the "bind"/"unbind" pair is only emitted by linux for controllers which don't
  have a firmware node attached
- don't allow clearing hogs on active devices in tests
- don't install uneeded files
- fix a pkgconfig check in configure
- fix a return type check in test harness
- don't implicity unquote unnamed lines in gpioinfo
- remove useless variable in reconfigure example
- don't let struct line_config balloon out of control and trigger an OOM
- drop python3-config check from configure.ac
- fix potential PyDict_Next() crash in python bindings
- disable the GPIO simulator before releasing it in C++, rust and python
  bindings tests
- fix the way we wait for simulated chips to appear in D-Bus command-line
  client tests
- make read_edge_events lifetimes more explicit in rust bindings
- make waiting for info events more reliable in GLib bindings tests
- defer removal of bank entries when device is not disabled in libgpiosim
- add missing LineInfo import to __init__.py in python bindings

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
 meta-oe/recipes-support/libgpiod/libgpiod.inc | 19 +-----
 .../libgpiod/libgpiod_1.6.5.bb                | 18 ++++-
 .../{libgpiod_2.2.4.bb => libgpiod_2.3.bb}    | 68 ++++++++++++-------
 3 files changed, 63 insertions(+), 42 deletions(-)
 rename meta-oe/recipes-support/libgpiod/{libgpiod_2.2.4.bb => libgpiod_2.3.bb} (61%)
diff mbox series

Patch

diff --git a/meta-oe/recipes-support/libgpiod/libgpiod.inc b/meta-oe/recipes-support/libgpiod/libgpiod.inc
index 63ffdc2466..7559a2c336 100644
--- a/meta-oe/recipes-support/libgpiod/libgpiod.inc
+++ b/meta-oe/recipes-support/libgpiod/libgpiod.inc
@@ -2,27 +2,19 @@  SUMMARY = "C library and tools for interacting with the linux GPIO character dev
 HOMEPAGE = "https://libgpiod.readthedocs.io/"
 RECIPE_MAINTAINER = "Bartosz Golaszewski <brgl@bgdev.pl>"
 
-inherit autotools pkgconfig ptest
+inherit pkgconfig ptest
 
 SRC_URI += " \
     https://www.kernel.org/pub/software/libs/libgpiod/libgpiod-${PV}.tar.xz \
     file://run-ptest \
 "
 
-PACKAGECONFIG[cxx] = "--enable-bindings-cxx,--disable-bindings-cxx"
-
 # Enable cxx bindings by default.
 PACKAGECONFIG ?= " \
     cxx \
     ${@bb.utils.contains('PTEST_ENABLED', '1', 'tests', '', d)} \
 "
 
-# Always build tools - they don't have any additional
-# requirements over the library.
-EXTRA_OECONF = "--enable-tools"
-
-DEPENDS += "autoconf-archive-native"
-
 PACKAGES =+ "${PN}-tools libgpiodcxx"
 FILES:${PN}-tools += " \
     ${bindir}/gpiodetect \
@@ -44,13 +36,4 @@  do_install:append() {
 
 do_install_ptest() {
     install -d ${D}${PTEST_PATH}/tests/
-
-    # These are the core C library tests
-    install -m 0755 ${B}/tests/.libs/gpiod-test ${D}${PTEST_PATH}/tests/
-
-    # Tools are always built so let's always install them for ptest even if
-    # we're not selecting libgpiod-tools.
-    for tool in ${FILES:${PN}-tools}; do
-        install ${B}/tools/.libs/$(basename $tool) ${D}${PTEST_PATH}/tests/
-    done
 }
diff --git a/meta-oe/recipes-support/libgpiod/libgpiod_1.6.5.bb b/meta-oe/recipes-support/libgpiod/libgpiod_1.6.5.bb
index 583648a6a3..45af4f8bb0 100644
--- a/meta-oe/recipes-support/libgpiod/libgpiod_1.6.5.bb
+++ b/meta-oe/recipes-support/libgpiod/libgpiod_1.6.5.bb
@@ -9,9 +9,16 @@  SRC_URI[sha256sum] = "ae280f697bf035a1fb780c9972e5c81d0d2712b7ab6124fb3fba24619d
 
 FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}-1.x:"
 
-inherit python3native
+inherit autotools python3native
 inherit_defer ${@bb.utils.contains('PACKAGECONFIG', 'python3', 'python3targetconfig', '', d)}
 
+# Always build tools - they don't have any additional
+# requirements over the library.
+EXTRA_OECONF = "--enable-tools"
+
+DEPENDS += "autoconf-archive-native"
+
+PACKAGECONFIG[cxx] = "--enable-bindings-cxx,--disable-bindings-cxx"
 PACKAGECONFIG[tests] = "--enable-tests,--disable-tests,kmod udev glib-2.0 catch2"
 PACKAGECONFIG[python3] = "--enable-bindings-python,--disable-bindings-python,python3"
 
@@ -35,6 +42,15 @@  RDEPENDS:${PN}-ptest += " \
 "
 
 do_install_ptest:append() {
+    # These are the core C library tests
+    install -m 0755 ${B}/tests/.libs/gpiod-test ${D}${PTEST_PATH}/tests/
+
+    # Tools are always built so let's always install them for ptest even if
+    # we're not selecting libgpiod-tools.
+    for tool in ${FILES:${PN}-tools}; do
+        install ${B}/tools/.libs/$(basename $tool) ${D}${PTEST_PATH}/tests/
+    done
+
     install -m 0755 ${S}/tools/gpio-tools-test ${D}${PTEST_PATH}/tests/
     install -m 0755 ${S}/tools/gpio-tools-test.bats ${D}${PTEST_PATH}/tests/
 
diff --git a/meta-oe/recipes-support/libgpiod/libgpiod_2.2.4.bb b/meta-oe/recipes-support/libgpiod/libgpiod_2.3.bb
similarity index 61%
rename from meta-oe/recipes-support/libgpiod/libgpiod_2.2.4.bb
rename to meta-oe/recipes-support/libgpiod/libgpiod_2.3.bb
index e6de4b0313..6ff2bf29d3 100644
--- a/meta-oe/recipes-support/libgpiod/libgpiod_2.2.4.bb
+++ b/meta-oe/recipes-support/libgpiod/libgpiod_2.3.bb
@@ -1,6 +1,6 @@ 
 require libgpiod.inc
 
-inherit systemd update-rc.d useradd gobject-introspection
+inherit meson systemd update-rc.d useradd gobject-introspection
 
 LICENSE = "GPL-2.0-or-later & LGPL-2.1-or-later & CC-BY-SA-4.0"
 LIC_FILES_CHKSUM = " \
@@ -15,20 +15,36 @@  SRC_URI += " \
     file://gpio-manager.init \
 "
 
-SRC_URI[sha256sum] = "13207176b0eb9b3e0f02552d5f49f5a6a449343ce47416158bb484d9d3019592"
+SRC_URI[sha256sum] = "cb71db463aec2604ac520c95bf04eff1839d86bdc9a2dfd67ef879fbb10426ea"
+
+# Always build tools - they don't have any additional
+# requirements over the library.
+EXTRA_OEMESON = "-Dtools=enabled"
 
 # Enable all project features for ptest
 PACKAGECONFIG[tests] = " \
-    --enable-tests --enable-tools --enable-bindings-cxx --enable-bindings-glib --enable-gpioset-interactive --enable-dbus, \
-    --disable-tests, \
+    -Dtests=enabled -Dtools=enabled -Dbindings-cxx=enabled -Dbindings-glib=enabled -Dgpioset-interactive=enabled -Ddbus=enabled, \
+    -Dtests=disabled, \
     kmod util-linux glib-2.0 catch2 libedit glib-2.0-native libgudev, \
     bash ${VIRTUAL-RUNTIME_dbus} glib-2.0-utils libgpiod-manager-cfg shunit2 \
 "
-PACKAGECONFIG[gpioset-interactive] = "--enable-gpioset-interactive,--disable-gpioset-interactive,libedit"
-PACKAGECONFIG[glib] = "--enable-bindings-glib,--disable-bindings-glib,glib-2.0 glib-2.0-native"
-PACKAGECONFIG[dbus] = "--enable-dbus,--disable-dbus,glib-2.0 glib-2.0-native libgudev,${VIRTUAL-RUNTIME_dbus}"
-
-PACKAGES =+ "${PN}-gpiosim ${PN}-glib ${PN}-manager ${PN}-manager-cfg ${PN}-cli"
+PACKAGECONFIG[cxx] = "-Dbindings-cxx=enabled,-Dbindings-cxx=disabled"
+PACKAGECONFIG[gpioset-interactive] = "-D=gpioset-interactive=enabled,-Dgpioset-interactive=disabled,libedit"
+PACKAGECONFIG[glib] = "-Dbindings-glib=enabled,-Dbindings-glib=disabled,glib-2.0 glib-2.0-native"
+PACKAGECONFIG[dbus] = "-Ddbus=enabled,-Ddbus=disabled,glib-2.0 glib-2.0-native libgudev,${VIRTUAL-RUNTIME_dbus}"
+
+GIR_MESON_ENABLE_FLAG = "enabled"
+GIR_MESON_DISABLE_FLAG = "disabled"
+
+PACKAGES =+ " \
+    ${PN}-gpiosim \
+    ${PN}-glib \
+    ${PN}-manager \
+    ${PN}-manager-cfg \
+    ${PN}-cli \
+    libgpiotools \
+    libgpiodbus \
+"
 FILES:${PN}-tools += "${bindir}/gpionotify"
 FILES:${PN}-gpiosim += "${libdir}/libgpiosim.so.*"
 FILES:${PN}-gpiosim-dev += "${includedir}/gpiosim.h"
@@ -38,7 +54,6 @@  FILES:${PN}-glib += " \
 "
 FILES:${PN}-manager += " \
     ${bindir}/gpio-manager \
-    ${libdir}/libgpiodbus.so.* \
     ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/gpio-manager.service', '', d)} \
     ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/init.d/gpio-manager', '', d)} \
 "
@@ -48,9 +63,16 @@  FILES:${PN}-manager-cfg += " \
     ${nonarch_base_libdir}/udev/rules.d/90-gpio.rules \
 "
 FILES:${PN}-cli += "${bindir}/gpiocli"
+FILES:libgpiotools += "${libdir}/libgpiotools.so.*"
+FILES:libgpiodbus += "${libdir}/libgpiodbus.so.*"
 
-RDEPENDS:${PN}-manager += "${VIRTUAL-RUNTIME_dbus} ${PN}-manager-cfg"
-RDEPENDS:${PN}-cli += "${PN}-manager"
+RDEPENDS:${PN}-manager += " \
+    ${VIRTUAL-RUNTIME_dbus} \
+    ${PN}-manager-cfg \
+    libgpiodbus \
+"
+RDEPENDS:${PN}-cli += "${PN}-manager libgpiodbus"
+RDEPENDS:${PN}-tools += "libgpiotools"
 
 SYSTEMD_PACKAGES = "${PN}-manager"
 
@@ -60,12 +82,12 @@  python __anonymous() {
     pn = d.getVar("PN")
 
     if "systemd" in distro_features and "dbus" in packageconfig:
-        d.appendVar("EXTRA_OECONF", " --enable-systemd")
+        d.appendVar("EXTRA_OEMESON", " -Dsystemd=enabled")
         # We need to set it conditionally or else the systemd class will look
         # for the file that we don't install with systemd support disabled.
         d.setVar("SYSTEMD_SERVICE:{}-manager".format(pn), "gpio-manager.service")
     else:
-        d.appendVar("EXTRA_OECONF", " --disable-systemd")
+        d.appendVar("EXTRA_OECONF", " -Dsystemd=disabled")
 
     # Disable gobject introspection set by the bbclass if we don't want it.
     if not any(cfg in ["glib", "dbus", "ptest"] for cfg in packageconfig):
@@ -86,10 +108,6 @@  RDEPENDS:${PN}-ptest += " \
 RRECOMMENDS:${PN}-gpiosim += "kernel-module-gpio-sim kernel-module-configfs"
 INSANE_SKIP:${PN}-ptest += "buildpaths"
 
-do_compile:prepend() {
-    export GIR_EXTRA_LIBS_PATH="${B}/lib/.libs"
-}
-
 do_install:append() {
     if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
         install -d ${D}${sysconfdir}/init.d
@@ -98,13 +116,17 @@  do_install:append() {
 }
 
 do_install_ptest:append() {
-    install -m 0755 ${B}/bindings/cxx/tests/.libs/gpiod-cxx-test ${D}${PTEST_PATH}/tests/
+    install -m 0755 ${B}/tests/gpiod-test ${D}${PTEST_PATH}/tests/
+    for tool in ${FILES:${PN}-tools}; do
+        install ${B}/tools/$(basename $tool) ${D}${PTEST_PATH}/tests/
+    done
+    install -m 0755 ${B}/bindings/cxx/tests/gpiod-cxx-test ${D}${PTEST_PATH}/tests/
     install -m 0755 ${S}/tools/gpio-tools-test.bash ${D}${PTEST_PATH}/tests/
     install -m 0644 ${S}/tests/scripts/gpiod-bash-test-helper.inc ${D}${PTEST_PATH}/tests/
     install -m 0644 ${S}/tests/gpiosim/gpiosim.h ${D}${includedir}/gpiosim.h
-    install -m 0755 ${B}/bindings/glib/tests/.libs/gpiod-glib-test ${D}${PTEST_PATH}/tests/
-    install -m 0755 ${B}/dbus/tests/.libs/gpiodbus-test ${D}${PTEST_PATH}/tests/
+    install -m 0755 ${B}/bindings/glib/tests/gpiod-glib-test ${D}${PTEST_PATH}/tests/
+    install -m 0755 ${B}/dbus/tests/gpiodbus-test ${D}${PTEST_PATH}/tests/
     install -m 0755 ${S}/dbus/client/gpiocli-test.bash ${D}${PTEST_PATH}/tests/
-    install -m 0755 ${B}/dbus/manager/.libs/gpio-manager ${D}${PTEST_PATH}/tests/
-    install -m 0755 ${B}/dbus/client/.libs/gpiocli ${D}${PTEST_PATH}/tests/
+    install -m 0755 ${B}/dbus/manager/gpio-manager ${D}${PTEST_PATH}/tests/
+    install -m 0755 ${B}/dbus/client/gpiocli ${D}${PTEST_PATH}/tests/
 }