Re: [PATCH] kbuild: let the environment set HOSTPKG_CONFIG

From: Nathan Chancellor

Date: Fri Aug 07 2026 - 18:15:31 EST


> HOSTPKG_CONFIG was added so that "tooling that builds the kernel" could
> choose which pkg-config the host tools ask about their dependencies, but
> it is assigned with '=', so only a make command line assignment takes
> effect. Exporting it does nothing, silently.

I found this paragraph a little hard to read and parse. I might write it
like:

HOSTPKG_CONFIG was added so that builders could choose which
pkg-config is used to query host dependencies. However, it does not
respect values exported from the builder's environment because its
assigment uses '=', requiring a make command line variable to override
it.

> That is surprising, because the other inputs to host program builds do
> honour the environment: HOSTCFLAGS, HOSTCXXFLAGS, HOSTLDFLAGS and
> HOSTLDLIBS are all read from it and documented in kbuild.rst as such.

I am not sure HOSTPKG_CONFIG is entirely comparable to these variables,
which are purely for compiler flags. I would compare it more to HOSTCC,
HOSTCXX, and HOSTRUSTC, which all use '=' and do not honor an
environment value. I am not sure we want to deviate from that here but I
am open to opinions from the other Kbuild folks.

> It also matters. A cross development environment sets
> PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH so that pkg-config answers
> for the target rather than the build machine. Those settings are correct
> for everything that will run on the target and wrong for a program that
> has to run on the build machine. objtool asks pkg-config where libelf is,
> gets the target's include directory, and compiles a host tool against
> the target's C library headers. Because the directory arrives as -I it
> is not treated as a system header directory, -Wno-system-headers no
> longer covers it, and the build stops on warnings that would otherwise
> be suppressed:
>
> usr/include/sys/cdefs.h:486: error: "__attribute_const__" redefined [-Werror]
> tools/include/linux/compiler.h:123: note: previous definition
> usr/include/stdio.h:449: error: redundant redeclaration of 'fscanf'
>
> An environment that knows it is cross building can then say
>
> export HOSTPKG_CONFIG="env -u PKG_CONFIG_SYSROOT_DIR \
> -u PKG_CONFIG_PATH pkg-config"
>
> once, in the shell it hands to the user, instead of every make command
> line growing an override. Build systems that already pass it on the
> command line are unaffected.

It would be nice if we could try and handle this situation directly
inside Kbuild somehow (like just unsetting these PKG_CONFIG variables)
but I guess that could mess with cross building tools/perf via the
tools/% Kbuild target... maybe that doesn't matter though. I am not sure
I find the argument of avoiding make command overrides convincing, as I
would expect a build wrapper to already need to support a unified set of
variables but maybe I am just naive. Another option would be passing
this value via MAKEFLAGS.

--
Cheers,
Nathan