mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-10-19 19:47:14 +00:00
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>
47 lines
2.0 KiB
Diff
47 lines
2.0 KiB
Diff
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)
|