The SDK environment sets PKG_CONFIG_SYSROOT_DIR, PKG_CONFIG_PATH and
PKG_CONFIG_LIBDIR so that pkg-config answers for the target. That is
right for everything built to run there and wrong for a program built to
run on the SDK host.

The kernel build compiles host tools of its own, and objtool asks
pkg-config where libelf is. It gets the target's include directory,
compiles a host tool against the target's C library headers, and stops
on warnings that -Wno-system-headers would otherwise have covered:

  usr/include/sys/cdefs.h:486: error: "__attribute_const__" redefined

Export a HOSTPKG_CONFIG that undoes those three variables, and pass the
same value on the make command line when the test builds an external
module. Both halves are needed: the kernel assigns HOSTPKG_CONFIG with
'=', so only a command line assignment takes effect today, and the
export is there for kernels that assign it with '?=', which is proposed
in

  
https://lore.kernel.org/linux-kbuild/[email protected]/

OE-Core already does the command line half for its own kernel builds, in
kernel.bbclass.

Fixes [YOCTO #16239].

AI-Generated: codex/claude-opus 5 (xhigh)
Signed-off-by: Trevor Woerner <[email protected]>
---
 meta/classes-recipe/toolchain-scripts.bbclass | 3 +++
 meta/lib/oeqa/sdk/cases/kmod.py               | 7 +++++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/meta/classes-recipe/toolchain-scripts.bbclass 
b/meta/classes-recipe/toolchain-scripts.bbclass
index d94dcdee39b3..54d05c242c4b 100644
--- a/meta/classes-recipe/toolchain-scripts.bbclass
+++ b/meta/classes-recipe/toolchain-scripts.bbclass
@@ -63,6 +63,9 @@ toolchain_create_sdk_env_script () {
        echo "export 
PATH=$sdkpathnative$bindir:$sdkpathnative$sbindir:$sdkpathnative$base_bindir:$sdkpathnative$base_sbindir:$sdkpathnative$bindir/../${HOST_SYS}/bin:$sdkpathnative$bindir/${TARGET_SYS}"$EXTRAPATH':"$PATH"'
 >> $script
        echo 'export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT' >> $script
        echo 'export 
PKG_CONFIG_PATH=$SDKTARGETSYSROOT'"$libdir"'/pkgconfig:$SDKTARGETSYSROOT'"$prefix"'/share/pkgconfig'
 >> $script
+       # pkg-config here answers for the target, which is wrong for the host
+       # tools the kernel build compiles. Honoured by kernels using '?='.
+       echo 'export HOSTPKG_CONFIG="env -u PKG_CONFIG_SYSROOT_DIR -u 
PKG_CONFIG_PATH -u PKG_CONFIG_LIBDIR pkg-config"' >> $script
        echo 'export 
CONFIG_SITE=${SDKPATH}/site-config-'"${multimach_target_sys}" >> $script
        echo "export OECORE_NATIVE_SYSROOT=\"$sdkpathnative\"" >> $script
        echo 'export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"' >> $script
diff --git a/meta/lib/oeqa/sdk/cases/kmod.py b/meta/lib/oeqa/sdk/cases/kmod.py
index 1be23e994fd2..1d73f076e552 100644
--- a/meta/lib/oeqa/sdk/cases/kmod.py
+++ b/meta/lib/oeqa/sdk/cases/kmod.py
@@ -26,8 +26,11 @@ class KernelModuleTest(OESDKTestCase):
         parallel_make = "-j %d" % (pmv) if pmv else ""
 
         self.ensure_target_package("kernel-devsrc")
+        # the kernel assigns HOSTPKG_CONFIG with '=', so it has to come from
+        # the make command line, as kernel.bbclass does
+        host_pkg_config = 'HOSTPKG_CONFIG="env -u PKG_CONFIG_SYSROOT_DIR -u 
PKG_CONFIG_PATH -u PKG_CONFIG_LIBDIR pkg-config"'
         # These targets need to be built before kernel modules can be built.
-        self._run("make %s -C $OECORE_TARGET_SYSROOT/usr/src/kernel prepare 
scripts" % (parallel_make))
+        self._run("make %s %s -C $OECORE_TARGET_SYSROOT/usr/src/kernel prepare 
scripts" % (parallel_make, host_pkg_config))
 
         with tempfile.TemporaryDirectory(prefix="cryptodev", 
dir=self.tc.sdk_dir) as testdir:
             git_url = "https://github.com/cryptodev-linux/cryptodev-linux";
@@ -39,5 +42,5 @@ class KernelModuleTest(OESDKTestCase):
             self.assertTrue(os.path.isdir(sourcedir))
             subprocess.check_output(["git", "-C", sourcedir, "checkout", 
git_sha], stderr=subprocess.STDOUT)
 
-            self._run("make -C %s V=1 
KERNEL_DIR=$OECORE_TARGET_SYSROOT/usr/src/kernel" % sourcedir)
+            self._run("make -C %s V=1 %s 
KERNEL_DIR=$OECORE_TARGET_SYSROOT/usr/src/kernel" % (sourcedir, 
host_pkg_config))
             self.check_elf(os.path.join(sourcedir, "cryptodev.ko"))
-- 
2.50.0.173.g8b6f19ccfc3a

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#242828): 
https://lists.openembedded.org/g/openembedded-core/message/242828
Mute This Topic: https://lists.openembedded.org/mt/120606848/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to