Re: [PATCH v2 0/3] kbuild: fix host progs build with libs in non standard locations
From: Masahiro Yamada
Date: Wed Feb 28 2018 - 05:23:40 EST
2018-02-28 2:45 GMT+09:00 Josh Poimboeuf <jpoimboe@xxxxxxxxxx>:
> On Mon, Feb 26, 2018 at 07:41:45PM +0100, Robin Jarry wrote:
>> This patchset allows to build host programs that depend on external libs
>> installed in non standard locations (i.e. not in /usr/include, /usr/lib,
>> etc.). For now, the only way is to force HOSTCC to include both the
>> path to the host compiler and the build flags.
>>
>> I have encountered this issue when building linux into the buildroot
>> framework. host-* versions of libs may be compiled and installed in a
>> host staging dir removing the need to install them on the build system.
>>
>> I'm not really satisfied with the new HOST_{C,LD}FLAGS variables. They
>> are too similar to HOST{C,LD}FLAGS and I find them confusing. However,
>> HOST_EXTRA*FLAGS are already reserved for local use in makefiles (see
>> Documentation/kbuild/makefiles.txt). And I didn't want to have even
>> longer USER_HOST_*FLAGS. If someone has a better proposition, I'll
>> happily make a v3.
>
> In Documentation/kbuild/kbuild.txt, we have the following environment
> variables:
>
> KCFLAGS
> --------------------------------------------------
> Additional options to the C compiler (for built-in and modules).
>
> CFLAGS_KERNEL
> --------------------------------------------------
> Additional options for $(CC) when used to compile
> code that is compiled as built-in.
>
> CFLAGS_MODULE
> --------------------------------------------------
> Additional module specific options to use for $(CC).
>
> LDFLAGS_MODULE
> --------------------------------------------------
> Additional options used for $(LD) when linking modules.
>
> LDFLAGS_vmlinux
> --------------------------------------------------
> Additional options passed to final link of vmlinux.
>
> So instead of
>
> HOST_CFLAGS
> HOST_LDFLAGS
>
> maybe it would be more consistent to call them
>
> CFLAGS_HOST
> LDFLAGS_HOST
>
> ?
>
> Also, the new environment variables should be documented in the above
> file.
>
> --
> Josh
A generic rule I see is almost like this:
[1] "KBUILD_" + (Executable Name) + "FLAGS" = (Internal-use Variable)
[2] (Executable Name) + "FLAGS" = (User Interface via Command Line)
They also derive
[3] (Internal-use Variable) =
"KBUILD_" + (User Interface via Command Line)
The following is the current situation:
[1] Flags for $(CC)
Internal use User interface via command line
---------------------------------------------------------------------------
(common) KBUILD_CFLAGS KCFLAGS
(builtin) KBUILD_CFLAGS_KERNEL CFLAGS_KERNEL
(module) KBUILD_CFLAGS_MODULE CFLAGS_MODULE
[2] Flags for $(AS)
Internal use User interface via command line
--------------------------------------------------------------------------
(common) KBUILD_AFLAGS KAFLAGS
(builtin) KBUILD_AFLAGS_KERNEL AFLAGS_KERNEL
(module) KBUILD_AFLAGS_MODULE AFLAGS_MODULE
[3] Flags for $(CPP)
Internal use User interface via command line
--------------------------------------------------------------------------
(common) KBUILD_CPPFLAGS KCPPFLAGS
[4] Flags for $(LD)
Internal use User interface via command line
--------------------------------------------------------------------------
(builtin) [None] #1 [None]
(module) KBUILD_LDFLAGS_MODULE LDFLAGS_MODULE
#1 (LDFLAGS_vmlinux is used for internal variable for builtin)
[5] Flags for HOSTCC, HOSTCXX
Internal use User interface via command line
-----------------------------------------------------------------------------
C HOSTCFLAGS [None]
C++ HOSTCXXFLAGS [None]
Link HOSTLDFLAGS [None]
Library HOST_LOADLIBES [None]
KCFLAGS, KAFLAGS, KCPPFLAGS are exceptions.
[5] is also an exception.
A consistent way could be
[5] Flags for HOSTCC, HOSTCXX
Internal use User interface via command line
-----------------------------------------------------------------------------
C KBUILD_HOSTCFLAGS HOSTCFLAGS
C++ KBUILD_HOSTCXXFLAGS HOSTCXXFLAGS
Link KBUILD_HOSTLDFLAGS HOSTLDFLAGS
Lib KBUILD_HOSTLDLIBS HOSTLDLIBS
Documentation/kbuild/kbuild.txt lists user interface parameters.
It is difficult to change them. (probably, not allowed)
Documentation/kbuild/makefiles.txt lists Make variables
used in kernel sources. So, it is easier to rename them.
Only the problem would be external modules that compile
their own host-programs with own flags. It is rare.
Anyway, external modules are often broken
when the kernel version is updated.
So, my idea is to rename existing
HOSTCFLAGS -> KBUILD_HOSTCFLAGS
HOSTCXXFLAGS -> KBUILD_HOSTCXXFLAGS
HOSTLDFLAGS -> KBUILD_HOSTLDFLAGS
HOST_LOADLIBES -> KBUILD_HOSTLDLIBS
("LOADLIBES" is too long, so rename it to "LDLIBS")
Then, re-add no-prefix ones as user interface.
--
Best Regards
Masahiro Yamada