• Masahiro Yamada's avatar
    kbuild: change *FLAGS_<basetarget>.o to take the path relative to $(obj) · 54b8ae66
    Masahiro Yamada authored
    Kbuild provides per-file compiler flag addition/removal:
    
      CFLAGS_<basetarget>.o
      CFLAGS_REMOVE_<basetarget>.o
      AFLAGS_<basetarget>.o
      AFLAGS_REMOVE_<basetarget>.o
      CPPFLAGS_<basetarget>.lds
      HOSTCFLAGS_<basetarget>.o
      HOSTCXXFLAGS_<basetarget>.o
    
    The <basetarget> is the filename of the target with its directory and
    suffix stripped.
    
    This syntax comes into a trouble when two files with the same basename
    appear in one Makefile, for example:
    
      obj-y += foo.o
      obj-y += dir/foo.o
      CFLAGS_foo.o := <some-flags>
    
    Here, the <some-flags> applies to both foo.o and dir/foo.o
    
    The real world problem is:
    
      scripts/kconfig/util.c
      scripts/kconfig/lxdialog/util.c
    
    Both files are compiled into scripts/kconfig/mconf, but only the
    latter should be given with the ncurses flags.
    
    It is more sensible to use the relative path to the Makefile, like this:
    
      obj-y += foo.o
      CFLAGS_foo.o := <some-flags>
      obj-y += dir/foo.o
      CFLAGS_dir/foo.o := <other-flags>
    
    At first, I attempted to replace $(basetarget) with $*. The $* variable
    is replaced with the stem ('%') part in a pattern rule. This works with
    most of cases, but does not for explicit rules.
    
    For example, arch/ia64/lib/Makefile reuses rule_as_o_S in its own
    explicit rules, so $* will be empty, resulting in ignoring the per-file
    AFLAGS.
    
    I introduced a new variable, target-stem, which can be used also from
    explicit rules.
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Acked-by: default avatarMarc Zyngier <maz@kernel.org>
    54b8ae66
Makefile 1.34 KB