From patchwork Thu Feb 26 14:31:10 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 82006 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2EEFBFCE095 for ; Thu, 26 Feb 2026 14:31:21 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.71073.1772116275281042262 for ; Thu, 26 Feb 2026 06:31:16 -0800 Authentication-Results: mx.groups.io; dkim=none (message not signed); spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 33AC9497 for ; Thu, 26 Feb 2026 06:31:08 -0800 (PST) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 3777C3F73B for ; Thu, 26 Feb 2026 06:31:14 -0800 (PST) From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [PATCH 1/3] classes/pkgconfig: rationalise variable usage Date: Thu, 26 Feb 2026 14:31:10 +0000 Message-ID: <20260226143112.702564-1-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Thu, 26 Feb 2026 14:31:21 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/232032 Our PKG_CONFIG_* variables were a bit of a mess. First, PKG_CONFIG_DIR is not used by either pkg-config or pkgconf. It's set to (approximately) ${libdir}/pkgconfig but we also want to search ${datadir}/pkgconfig so it isn't actually useful as an intermediate variable. Remove PKG_CONFIG_DIR and replace with the neatest expression for the value we want: ${STAGING_LIBDIR}/pkgconfig. Second, PKG_CONFIG_PATH and PKG_CONFIG_LIBDIR shouldn't be set to the same paths. The semantics of these variables is that PKG_CONFIG_PATH is searched first, followed by either PKG_CONFIG_LIBDIR or the default paths compiled into the pkg-config binary. Currently we set PKG_CONFIG_PATH to (approx.) ${libdir}:${datadir} and PKG_CONFIG_LIBDIR to ${libdir}, so we search libdir twice. Also the default paths embedded in the binary will be incorrect as they point to pkgconfig-native's sysroot, so we absolutely need to set PKG_CONFIG_LIBDIR. Instead, set PKG_CONFIG_LIBDIR to ${libdir}:${datadir} so that the default search path is correct. We can then leave PKG_CONFIG_PATH empty, if a recipe has specific needs it can set that but normally it is not needed anymore. Then bubble these changes out to the few places where the variables are used directly: - Kernel/kconfig interaction where 'pkg-config' needs to read the native files, not target. - The class classes (native, etc) which redefine the values. However, as the values are defined in terms of sysroot variables, we can typically remove assignments from those classes as they are redundant. Signed-off-by: Ross Burton --- meta/classes-recipe/cml1.bbclass | 7 +++---- meta/classes-recipe/cross-canadian.bbclass | 3 +-- meta/classes-recipe/cross.bbclass | 4 ++-- meta/classes-recipe/kernel.bbclass | 8 ++------ meta/classes-recipe/native.bbclass | 1 - meta/classes-recipe/nativesdk.bbclass | 3 --- meta/classes-recipe/pkgconfig.bbclass | 7 ++++--- meta/recipes-kernel/linux/linux-yocto.inc | 7 +++---- 8 files changed, 15 insertions(+), 25 deletions(-) diff --git a/meta/classes-recipe/cml1.bbclass b/meta/classes-recipe/cml1.bbclass index 3c2b4da4aff..ac65eec4bff 100644 --- a/meta/classes-recipe/cml1.bbclass +++ b/meta/classes-recipe/cml1.bbclass @@ -51,12 +51,11 @@ python do_menuconfig() { mtime = 0 # setup native pkg-config variables (kconfig scripts call pkg-config directly, cannot generically be overriden to pkg-config-native) - d.setVar("PKG_CONFIG_DIR", "${STAGING_DIR_NATIVE}${libdir_native}/pkgconfig") - d.setVar("PKG_CONFIG_PATH", "${PKG_CONFIG_DIR}:${STAGING_DATADIR_NATIVE}/pkgconfig") - d.setVar("PKG_CONFIG_LIBDIR", "${PKG_CONFIG_DIR}") + d.setVar("PKG_CONFIG_PATH", "") + d.setVar("PKG_CONFIG_LIBDIR", "${STAGING_LIBDIR_NATIVE}/pkgconfig:${STAGING_DATADIR_NATIVE}/pkgconfig") d.setVarFlag("PKG_CONFIG_SYSROOT_DIR", "unexport", "1") # ensure that environment variables are overwritten with this tasks 'd' values - d.appendVar("OE_TERMINAL_EXPORTS", " PKG_CONFIG_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR") + d.appendVar("OE_TERMINAL_EXPORTS", " PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR") oe_terminal("sh -c 'make %s; if [ $? -ne 0 ]; then echo \"Command failed.\"; printf \"Press any key to continue... \"; read r; fi'" % d.getVar('KCONFIG_CONFIG_COMMAND'), d.getVar('PN') + ' Configuration', d) diff --git a/meta/classes-recipe/cross-canadian.bbclass b/meta/classes-recipe/cross-canadian.bbclass index 059d9aa95f5..6d3d2f76231 100644 --- a/meta/classes-recipe/cross-canadian.bbclass +++ b/meta/classes-recipe/cross-canadian.bbclass @@ -161,8 +161,7 @@ libexecdir = "${exec_prefix}/libexec/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS} FILES:${PN} = "${prefix}" -export PKG_CONFIG_DIR = "${STAGING_DIR_HOST}${exec_prefix}/lib/pkgconfig" -export PKG_CONFIG_SYSROOT_DIR = "${STAGING_DIR_HOST}" +PKG_CONFIG_LIBDIR = "${STAGING_DIR_HOST}${exec_prefix}/lib/pkgconfig:${STAGING_DIR_HOST}${exec_prefix}/share/pkgconfig" do_populate_sysroot[stamp-extra-info] = "" do_packagedata[stamp-extra-info] = "" diff --git a/meta/classes-recipe/cross.bbclass b/meta/classes-recipe/cross.bbclass index 574ce6988d2..82a49dc8f5c 100644 --- a/meta/classes-recipe/cross.bbclass +++ b/meta/classes-recipe/cross.bbclass @@ -33,8 +33,8 @@ PACKAGE_ARCH = "${BUILD_ARCH}" MULTIMACH_TARGET_SYS = "${BUILD_ARCH}${BUILD_VENDOR}-${BUILD_OS}" -export PKG_CONFIG_DIR = "${exec_prefix}/lib/pkgconfig" -export PKG_CONFIG_SYSROOT_DIR = "" +PKG_CONFIG_LIBDIR = "${exec_prefix}/lib/pkgconfig:${exec_prefix}/share/pkgconfig" +PKG_CONFIG_SYSROOT_DIR = "" TARGET_CPPFLAGS = "" TARGET_CFLAGS = "" diff --git a/meta/classes-recipe/kernel.bbclass b/meta/classes-recipe/kernel.bbclass index f989b31c477..b43b4ff4fb5 100644 --- a/meta/classes-recipe/kernel.bbclass +++ b/meta/classes-recipe/kernel.bbclass @@ -365,9 +365,7 @@ kernel_do_compile() { unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE # setup native pkg-config variables (kconfig scripts call pkg-config directly, cannot generically be overriden to pkg-config-native) - export PKG_CONFIG_DIR="${STAGING_DIR_NATIVE}${libdir_native}/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_DIR:${STAGING_DATADIR_NATIVE}/pkgconfig" - export PKG_CONFIG_LIBDIR="$PKG_CONFIG_DIR" + export PKG_CONFIG_LIBDIR="${STAGING_LIBDIR_NATIVE}/pkgconfig:${STAGING_DATADIR_NATIVE}/pkgconfig" export PKG_CONFIG_SYSROOT_DIR="" if [ "${KERNEL_DEBUG_TIMESTAMPS}" != "1" ]; then @@ -421,9 +419,7 @@ do_compile_kernelmodules() { unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE # setup native pkg-config variables (kconfig scripts call pkg-config directly, cannot generically be overriden to pkg-config-native) - export PKG_CONFIG_DIR="${STAGING_DIR_NATIVE}${libdir_native}/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_DIR:${STAGING_DATADIR_NATIVE}/pkgconfig" - export PKG_CONFIG_LIBDIR="$PKG_CONFIG_DIR" + export PKG_CONFIG_LIBDIR="${STAGING_LIBDIR_NATIVE}/pkgconfig:${STAGING_DATADIR_NATIVE}/pkgconfig" export PKG_CONFIG_SYSROOT_DIR="" if [ "${KERNEL_DEBUG_TIMESTAMPS}" != "1" ]; then diff --git a/meta/classes-recipe/native.bbclass b/meta/classes-recipe/native.bbclass index 65b5b97c690..5aa9c8e4145 100644 --- a/meta/classes-recipe/native.bbclass +++ b/meta/classes-recipe/native.bbclass @@ -98,7 +98,6 @@ do_populate_sysroot[sstate-outputdirs] = "${COMPONENTS_DIR}/${PACKAGE_ARCH}/${PN # Since we actually install these into situ there is no staging prefix STAGING_DIR_HOST = "" STAGING_DIR_TARGET = "" -PKG_CONFIG_DIR = "${libdir}/pkgconfig" EXTRA_NATIVE_PKGCONFIG_PATH ?= "" PKG_CONFIG_PATH .= "${EXTRA_NATIVE_PKGCONFIG_PATH}" diff --git a/meta/classes-recipe/nativesdk.bbclass b/meta/classes-recipe/nativesdk.bbclass index 4404a18856a..5adb7515bf1 100644 --- a/meta/classes-recipe/nativesdk.bbclass +++ b/meta/classes-recipe/nativesdk.bbclass @@ -73,9 +73,6 @@ exec_prefix = "${SDKPATHNATIVE}${prefix_nativesdk}" baselib = "lib" sbindir = "${bindir}" -export PKG_CONFIG_DIR = "${STAGING_DIR_HOST}${libdir}/pkgconfig" -export PKG_CONFIG_SYSROOT_DIR = "${STAGING_DIR_HOST}" - python nativesdk_virtclass_handler () { pn = e.data.getVar("PN") if not (pn.endswith("-nativesdk") or pn.startswith("nativesdk-")): diff --git a/meta/classes-recipe/pkgconfig.bbclass b/meta/classes-recipe/pkgconfig.bbclass index 98b63420135..c0d91393b36 100644 --- a/meta/classes-recipe/pkgconfig.bbclass +++ b/meta/classes-recipe/pkgconfig.bbclass @@ -6,10 +6,11 @@ DEPENDS:prepend = "pkgconfig-native " -export PKG_CONFIG_DIR ?= "${STAGING_DIR_HOST}${libdir}/pkgconfig" -export PKG_CONFIG_PATH ?= "${PKG_CONFIG_DIR}:${STAGING_DATADIR}/pkgconfig" -export PKG_CONFIG_LIBDIR ?= "${PKG_CONFIG_DIR}" +export PKG_CONFIG_PATH ?= "" +export PKG_CONFIG_LIBDIR ?= "${STAGING_LIBDIR}/pkgconfig:${STAGING_DATADIR}/pkgconfig" + export PKG_CONFIG_SYSROOT_DIR ?= "${STAGING_DIR_HOST}" export PKG_CONFIG_DISABLE_UNINSTALLED ?= "yes" + export PKG_CONFIG_SYSTEM_LIBRARY_PATH ?= "${base_libdir}:${libdir}" export PKG_CONFIG_SYSTEM_INCLUDE_PATH ?= "${includedir}" diff --git a/meta/recipes-kernel/linux/linux-yocto.inc b/meta/recipes-kernel/linux/linux-yocto.inc index 4d0a726bb65..d57c1aae25e 100644 --- a/meta/recipes-kernel/linux/linux-yocto.inc +++ b/meta/recipes-kernel/linux/linux-yocto.inc @@ -89,9 +89,8 @@ EXTRA_OEMAKE += '${@bb.utils.contains("KERNEL_DEBUG", "True", "", "PAHOLE=false" do_devshell:prepend() { # setup native pkg-config variables (kconfig scripts call pkg-config directly, cannot generically be overriden to pkg-config-native) - d.setVar("PKG_CONFIG_DIR", "${STAGING_DIR_NATIVE}${libdir_native}/pkgconfig") - d.setVar("PKG_CONFIG_PATH", "${PKG_CONFIG_DIR}:${STAGING_DATADIR_NATIVE}/pkgconfig") - d.setVar("PKG_CONFIG_LIBDIR", "${PKG_CONFIG_DIR}") + d.setVar("PKG_CONFIG_PATH", "") + d.setVar("PKG_CONFIG_LIBDIR", "${STAGING_LIBDIR_NATIVE}/pkgconfig:${STAGING_DATADIR_NATIVE}/pkgconfig") d.setVarFlag("PKG_CONFIG_SYSROOT_DIR", "unexport", "1") - d.appendVar("OE_TERMINAL_EXPORTS", " PKG_CONFIG_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR") + d.appendVar("OE_TERMINAL_EXPORTS", " PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR") }