Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] package/gobject-introspection: fix host build when /bin/sh warns
@ 2026-10-20 21:22 Yegor Yefremov via buildroot
  2026-10-20 22:13 ` [Buildroot] [PATCH v2] " Yegor Yefremov via buildroot
  0 siblings, 1 reply; 3+ messages in thread
From: Yegor Yefremov via buildroot @ 2026-10-20 21:22 UTC (permalink / raw)
  To: buildroot

host-gobject-introspection is built with LD_LIBRARY_PATH pointing to
$(HOST_DIR)/lib. When g-ir-scanner calls pkg-config, which in Buildroot
is a /bin/sh wrapper script, the shell inherits that LD_LIBRARY_PATH.
On hosts where /bin/sh is bash linked against the system libreadline
(e.g. Arch Linux), and host-ncurses has already been built, the
dynamic loader picks up Buildroot's libncursesw, which has no symbol
versioning, and warns on stderr:

/bin/sh: .../host/lib/libncursesw.so.6: no version information available (required by /usr/lib/libreadline.so.8)

giscanner merges pkg-config's stderr into its stdout and parses the
result as compiler flags, so the build fails with:

gcc: error: /bin/sh:: linker input file not found: No such file or directory
gcc: error: .../host/lib/libncursesw.so.6:: linker input file not found: No such file or directory
gcc: error: no: linker input file not found: No such file or directory
...

Add a patch, submitted upstream, so that giscanner only parses
pkg-config's stdout.

This issue has been present since commit 8270fca228b1
("package/gobject-introspection: fix host-linking"), which started
setting LD_LIBRARY_PATH for the build, while giscanner has been
merging pkg-config's stderr since 2018. It only shows up on some build
hosts, when host-ncurses is built before host-gobject-introspection.
It therefore affects 2020.05 and later, including 2025.02.x and
2026.02.x.

Fixes:
https://autobuild.buildroot.org/results/615b6701c6c200f6e6f3081e784f981e4f4f644e

Fixes: 8270fca228b1892b699801536ce136460e4892e9 ("package/gobject-introspection: fix host-linking")
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
---
 ...t-parse-pkg-config-s-stderr-as-flags.patch | 71 +++++++++++++++++++
 1 file changed, 71 insertions(+)
 create mode 100644 package/gobject-introspection/0002-giscanner-Don-t-parse-pkg-config-s-stderr-as-flags.patch

diff --git a/package/gobject-introspection/0002-giscanner-Don-t-parse-pkg-config-s-stderr-as-flags.patch b/package/gobject-introspection/0002-giscanner-Don-t-parse-pkg-config-s-stderr-as-flags.patch
new file mode 100644
index 0000000000..c0d951abbd
--- /dev/null
+++ b/package/gobject-introspection/0002-giscanner-Don-t-parse-pkg-config-s-stderr-as-flags.patch
@@ -0,0 +1,71 @@
+From 68770762fa69786ffddc3f5f5846c7140eaed624 Mon Sep 17 00:00:00 2001
+From: Yegor Yefremov <yegorslists@googlemail.com>
+Date: Tue, 20 Oct 2026 15:58:23 +0200
+Subject: [PATCH] giscanner: Don't parse pkg-config's stderr as flags
+
+check_output() merges pkg-config's stderr into its stdout, and the
+result is then split into compiler and linker flags. Anything printed
+on stderr thus ends up on the compiler command line.
+
+This breaks the build when pkg-config is a shell script wrapper and
+the shell emits a warning, e.g. a dynamic loader warning caused by
+LD_LIBRARY_PATH pointing to a different libncursesw than the one the
+shell's libreadline was linked against:
+
+  /bin/sh: .../host/lib/libncursesw.so.6: no version information available (required by /usr/lib/libreadline.so.8)
+
+which then results in:
+
+  gcc: error: /bin/sh:: linker input file not found: No such file or directory
+  gcc: error: no: linker input file not found: No such file or directory
+  ...
+
+Only use pkg-config's stdout. Its stderr is no longer captured, so
+warnings and error messages still reach the user's terminal.
+
+Upstream: https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/568
+Assisted-by: Claude:claude-opus-5-5
+Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
+---
+ giscanner/pkgconfig.py          |  2 +-
+ tests/scanner/test_pkgconfig.py | 11 +++++++++++
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/giscanner/pkgconfig.py b/giscanner/pkgconfig.py
+index 39db41d6..19c5953e 100644
+--- a/giscanner/pkgconfig.py
++++ b/giscanner/pkgconfig.py
+@@ -31,7 +31,7 @@ def check_output(flags, ignore_errors, command=None):
+     argv = command[:]
+     argv.extend(flags)
+     try:
+-        return subprocess.check_output(argv, universal_newlines=True, stderr=subprocess.STDOUT)
++        return subprocess.check_output(argv, universal_newlines=True)
+     except subprocess.CalledProcessError as e:
+         output = e.output or ''
+         if ignore_errors:
+diff --git a/tests/scanner/test_pkgconfig.py b/tests/scanner/test_pkgconfig.py
+index 8b654e38..b7aa149e 100644
+--- a/tests/scanner/test_pkgconfig.py
++++ b/tests/scanner/test_pkgconfig.py
+@@ -104,6 +104,17 @@ class PkgConfigTest(unittest.TestCase):
+             flags = pkgconfig.cflags(['bar-3.0'], command=command)
+             self.assertEqual(flags, ['-DLOG="HELLO"'])
+ 
++    def test_stderr_ignored(self):
++        """Checks that pkg-config's stderr does not end up in the flags."""
++        s = """
++        import sys
++        sys.stderr.write('warning: no version information available\\n')
++        print('-I/usr/include/foo')
++        """
++        with pkg_config_script(s) as command:
++            flags = pkgconfig.cflags(['foo-1.0'], command=command)
++            self.assertEqual(flags, ['-I/usr/include/foo'])
++
+ 
+ if __name__ == '__main__':
+     unittest.main()
+-- 
+2.34.1
+
-- 
2.34.1

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

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

* [Buildroot] [PATCH v2] package/gobject-introspection: fix host build when /bin/sh warns
  2026-10-20 21:22 [Buildroot] [PATCH] package/gobject-introspection: fix host build when /bin/sh warns Yegor Yefremov via buildroot
@ 2026-10-20 22:13 ` Yegor Yefremov via buildroot
  2026-10-21 18:59   ` Thomas Petazzoni via buildroot
  0 siblings, 1 reply; 3+ messages in thread
From: Yegor Yefremov via buildroot @ 2026-10-20 22:13 UTC (permalink / raw)
  To: buildroot

host-gobject-introspection is built with LD_LIBRARY_PATH pointing to
$(HOST_DIR)/lib. When g-ir-scanner calls pkg-config, which in Buildroot
is a /bin/sh wrapper script, the shell inherits that LD_LIBRARY_PATH.
On hosts where /bin/sh is bash linked against the system libreadline
(e.g. Arch Linux), and host-ncurses has already been built, the
dynamic loader picks up Buildroot's libncursesw, which has no symbol
versioning, and warns on stderr:

/bin/sh: .../host/lib/libncursesw.so.6: no version information available (required by /usr/lib/libreadline.so.8)

giscanner merges pkg-config's stderr into its stdout and parses the
result as compiler flags, so the build fails with:

gcc: error: /bin/sh:: linker input file not found: No such file or directory
gcc: error: .../host/lib/libncursesw.so.6:: linker input file not found: No such file or directory
gcc: error: no: linker input file not found: No such file or directory
...

Backport the pending upstream merge request, so that giscanner only
parses pkg-config's stdout.

This issue has been present since commit 8270fca228b1
("package/gobject-introspection: fix host-linking"), which started
setting LD_LIBRARY_PATH for the build, while giscanner has been
merging pkg-config's stderr since 2018. It only shows up on some build
hosts, when host-ncurses is built before host-gobject-introspection.
It therefore affects 2020.05 and later, including 2025.02.x and
2026.02.x.

Fixes:
https://autobuild.buildroot.org/results/615b6701c6c200f6e6f3081e784f981e4f4f644e

Fixes: 8270fca228b1892b699801536ce136460e4892e9 ("package/gobject-introspection: fix host-linking")
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
---
Changes v1 -> v2:
  - backport the earlier upstream MR !561 by Franciszek Stachura,
    which makes the same change, instead of my duplicate MR !568

 ...2-giscanner-Do-parse-stderr-as-flags.patch | 56 +++++++++++++++++++
 1 file changed, 56 insertions(+)
 create mode 100644 package/gobject-introspection/0002-giscanner-Do-parse-stderr-as-flags.patch

diff --git a/package/gobject-introspection/0002-giscanner-Do-parse-stderr-as-flags.patch b/package/gobject-introspection/0002-giscanner-Do-parse-stderr-as-flags.patch
new file mode 100644
index 0000000000..f19d8ce092
--- /dev/null
+++ b/package/gobject-introspection/0002-giscanner-Do-parse-stderr-as-flags.patch
@@ -0,0 +1,56 @@
+From 5685062db8924fe0a58a9a2a3f435217614dcc9f Mon Sep 17 00:00:00 2001
+From: Franciszek Stachura <fbstachura@gmail.com>
+Date: Thu, 20 Aug 2026 20:23:16 +0200
+Subject: [PATCH] giscanner: Do parse stderr as flags
+
+check_output in pkgconfig.py returns stdout with stderr. If pkg-config
+prints something to stderr (ex. dynamic linker warnings, or warnings
+from program passed in PKG_CONFIG), it may get parsed as flags and
+passed to the compiler.
+
+Do not capture stderr in check_output at all.
+
+Upstream: https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/561
+Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
+---
+ giscanner/pkgconfig.py          |  2 +-
+ tests/scanner/test_pkgconfig.py | 10 ++++++++++
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/giscanner/pkgconfig.py b/giscanner/pkgconfig.py
+index 39db41d61..19c5953ea 100644
+--- a/giscanner/pkgconfig.py
++++ b/giscanner/pkgconfig.py
+@@ -31,7 +31,7 @@ def check_output(flags, ignore_errors, command=None):
+     argv = command[:]
+     argv.extend(flags)
+     try:
+-        return subprocess.check_output(argv, universal_newlines=True, stderr=subprocess.STDOUT)
++        return subprocess.check_output(argv, universal_newlines=True)
+     except subprocess.CalledProcessError as e:
+         output = e.output or ''
+         if ignore_errors:
+diff --git a/tests/scanner/test_pkgconfig.py b/tests/scanner/test_pkgconfig.py
+index 8b654e38e..5da0eb4fc 100644
+--- a/tests/scanner/test_pkgconfig.py
++++ b/tests/scanner/test_pkgconfig.py
+@@ -104,6 +104,16 @@ class PkgConfigTest(unittest.TestCase):
+             flags = pkgconfig.cflags(['bar-3.0'], command=command)
+             self.assertEqual(flags, ['-DLOG="HELLO"'])
+ 
++    def test_pkgconfig_stderr(self):
++        s = """
++        import sys
++        print('warning: test', file=sys.stderr)
++        print('-ltest')
++        """
++        with pkg_config_script(s) as command:
++            flags = pkgconfig.cflags(['foo-2.0'], command=command)
++            self.assertEqual(flags, ['-ltest'])
++
+ 
+ if __name__ == '__main__':
+     unittest.main()
+-- 
+GitLab
+
-- 
2.34.1

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

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

* Re: [Buildroot] [PATCH v2] package/gobject-introspection: fix host build when /bin/sh warns
  2026-10-20 22:13 ` [Buildroot] [PATCH v2] " Yegor Yefremov via buildroot
@ 2026-10-21 18:59   ` Thomas Petazzoni via buildroot
  0 siblings, 0 replies; 3+ messages in thread
From: Thomas Petazzoni via buildroot @ 2026-10-21 18:59 UTC (permalink / raw)
  To: Yegor Yefremov; +Cc: buildroot

On Wed, Oct 21, 2026 at 12:13:09AM +0200, Yegor Yefremov via buildroot wrote:
> host-gobject-introspection is built with LD_LIBRARY_PATH pointing to
> $(HOST_DIR)/lib. When g-ir-scanner calls pkg-config, which in Buildroot
> is a /bin/sh wrapper script, the shell inherits that LD_LIBRARY_PATH.
> On hosts where /bin/sh is bash linked against the system libreadline
> (e.g. Arch Linux), and host-ncurses has already been built, the
> dynamic loader picks up Buildroot's libncursesw, which has no symbol
> versioning, and warns on stderr:

I've applied your patch because it is the most obvious direct
solution, but I find the above explanation rather worrying. It really
isn't great that we end up executing the system-provided bash with a
LD_LIBRARY_PATH pointing to our libraries. It happens to work by
chance because our ncurses is probably not too different from the
system-provided ncurses, but that seems like to be more luck than
correctness.

Shouldn't we investigate a different way that avoids having to pass
LD_LIBRARY_PATH? I honestly don't recall why passing LD_LIBRARY_PATH
is needed.

Thanks!

Thomas
-- 
Thomas Petazzoni, co-owner and CEO, Bootlin
Embedded Linux and Kernel engineering and training
https://bootlin.com
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

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

end of thread, other threads:[~2026-10-21 19:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-20 21:22 [Buildroot] [PATCH] package/gobject-introspection: fix host build when /bin/sh warns Yegor Yefremov via buildroot
2026-10-20 22:13 ` [Buildroot] [PATCH v2] " Yegor Yefremov via buildroot
2026-10-21 18:59   ` Thomas Petazzoni via buildroot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox