python3-posix-ipc: fix feature probing instead of forcing -lrt

posix_ipc decides at build time whether it needs librt and whether
message queues are available by compiling small probe programs in
build_support/discover_system_info.py. Its does_build_succeed() splices
the linker option into the compiler argv verbatim, so when no extra
library is wanted the compiler is called with a literal empty argument:

  $CC -Wall -o foo foo.c '' -lpthread

GNU ld treats '' as an input file and fails ("cannot find : No such
file or directory"); lld ignores it. With the gcc toolchain every probe
without -lrt therefore fails, the prober wrongly decides librt is
required, and on a C library without a usable librt message queue
support is dropped - which is how posix_ipc.MessageQueue went missing
(issue #916). The result depends on the linker rather than on what the
C library provides.

The previous LDFLAGS += "-lrt" workaround only papered over this, and
is itself libc specific: it forces linking librt even where mq_* live
in libc (glibc >= 2.34, musl).

Fix the prober to split linker_options with shlex, like it already does
for CC, so an empty value adds no argument, and drop the forced -lrt so
the probes decide per C library.

Verified on qemux86-64 for glibc and musl, each with the clang and gcc
toolchains: src/system_info.h defines MESSAGE_QUEUE_SUPPORT_EXISTS,
SEM_GETVALUE_EXISTS and SEM_TIMEDWAIT_EXISTS, and the extension module
imports all mq_* from libc with no librt NEEDED entry.

Fixes: https://github.com/openembedded/meta-openembedded/issues/916

AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
Khem Raj committed 2026-10-16 09:50:39 -07:00
1 parent bcc055b511
commit 53c0b99a78
2 files changed
+47 -3

No files matched your search

@@ -0,0 +1,46 @@
From a2d268590cd2e8460b40438b4eff894ae472a0f2 Mon Sep 17 00:00:00 2001
From: Khem Raj <khem.raj@oss.qualcomm.com>
Date: Fri, 16 Oct 2026 16:26:28 +0000
Subject: [PATCH] build_support: do not pass empty linker option to the
compiler
does_build_succeed() builds an argv list and inserts linker_options
verbatim. When no extra linker option is wanted it is "", so the
compiler is invoked with a literal empty argument:
cc -Wall -o foo foo.c '' -lpthread
GNU ld treats the empty argument as an input file and fails with
"cannot find : No such file or directory", while lld silently ignores
it. With GNU ld every probe that runs without -lrt therefore fails,
which makes sniff_realtime_lib() wrongly conclude that librt is needed
(or raise DiscoveryError on C libraries that have no usable librt),
independent of what the C library actually provides. With lld the
probes happen to give the right answer, so the outcome depends on the
linker rather than on the target system.
This regressed when the command was converted from a shell string
(where an empty %s vanished) to an argv list.
Split linker_options with shlex like CC already is, so an empty value
contributes no argument and multi-word values still work.
Upstream-Status: Submitted [https://github.com/osvenskan/posix_ipc/pull/114]
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
---
build_support/discover_system_info.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build_support/discover_system_info.py b/build_support/discover_system_info.py
index 1c3741f..669c234 100644
--- a/build_support/discover_system_info.py
+++ b/build_support/discover_system_info.py
@@ -57,7 +57,7 @@ def does_build_succeed(filename, linker_options=""):
'-o',
f'./build_support/src/{filename[:-2]}',
f'./build_support/src/{filename}',
- linker_options,
+ *shlex.split(linker_options),
'-lpthread'
]
p = subprocess.Popen(cmd, stdout=STDOUT, stderr=STDERR)
@@ -4,9 +4,7 @@ SECTION = "devel/python"
LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=e3d8df223c2614dbf1aabdc1ca23cc10"
SRC_URI += "file://0001-build_support-do-not-pass-empty-linker-option-to-the.patch"
SRC_URI[sha256sum] = "6923232111329954a8349f7d99f212b6e96b5206e77fbd39aaf1b3cb4a5e9260"
# Message queue support requires librt for proper linking
LDFLAGS += "-lrt"
inherit pypi python_setuptools_build_meta