@@ -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
@@ -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"))
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/20260805055438.3482019-1-twoerner@gmail.com/ 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 <twoerner@gmail.com> --- meta/classes-recipe/toolchain-scripts.bbclass | 3 +++ meta/lib/oeqa/sdk/cases/kmod.py | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-)