Re: [PATCH] kbuild: let the environment set HOSTPKG_CONFIG
Nathan Chancellor <[email protected]>
| Newsgroups | org.kernel.vger.linux-kbuild,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <178614091702.32781.13796520858880316981.b4-review@b4> |
> 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