Re: [PATCH] kbuild: Allow gcov to be enabled on the command line
From: Kent Overstreet
Date: Sat Nov 25 2023 - 14:56:29 EST
On Fri, Nov 24, 2023 at 11:02:00AM +0900, Masahiro Yamada wrote:
> On Thu, Nov 23, 2023 at 8:55 AM Kent Overstreet
> <kent.overstreet@xxxxxxxxx> wrote:
> >
> > This allows gcov to be enabled for a particular kernel source
> > subdirectory on the command line, without editing makefiles, like so:
> >
> > make GCOV_PROFILE_fs_bcachefs=y
> >
> > Cc: Masahiro Yamada <masahiroy@xxxxxxxxxx>
> > Cc: Nathan Chancellor <nathan@xxxxxxxxxx>
> > Cc: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>
> > Cc: Nicolas Schier <nicolas@xxxxxxxxx>
> > Cc: linux-kbuild@xxxxxxxxxxxxxxx
> > Signed-off-by: Kent Overstreet <kent.overstreet@xxxxxxxxx>
> > ---
> > scripts/Kbuild.include | 10 ++++++++++
> > scripts/Makefile.lib | 2 +-
> > 2 files changed, 11 insertions(+), 1 deletion(-)
> >
> > diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
> > index 7778cc97a4e0..5341736f2e30 100644
> > --- a/scripts/Kbuild.include
> > +++ b/scripts/Kbuild.include
> > @@ -277,3 +277,13 @@ ifneq ($(and $(filter notintermediate, $(.FEATURES)),$(filter-out 4.4,$(MAKE_VER
> > else
> > .SECONDARY:
> > endif
> > +
> > + # expand_parents(a/b/c) = a/b/c a/b a
> > +expand_parents2 = $(if $(subst .,,$(1)),$(call expand_parents,$(1)),)
> > +expand_parents = $(1) $(call expand_parents2,$(patsubst %/,%,$(dir $(1))))
> > +
> > +# flatten_dirs(a/b/c) = a_b_c a_b a
> > +flatten_dirs = $(subst /,_,$(call expand_parents,$(1)))
> > +
> > +# eval_vars(X_,a/b/c) = $(X_a_b_c) $(X_a_b) $(X_a)
> > +eval_vars = $(foreach var,$(call flatten_dirs,$(2)),$($(1)$(var)))
>
>
>
> I do not like tricky code like this.
>
> Also, with "fs_bcachefs", it is unclear which directory
> is enabled.
It's consistent with how we can specify options in makefiles for a
particular file.
I suppose CONFIG_GCOV_PROFILE_DIRS would be fine, but your patch isn't
complete so I can't test it.
>
>
>
>
> How about this?
>
>
>
> [1] Specify the list of directories by GCOV_PROFILE_DIRS
>
>
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index 1a965fe68e01..286a569556b3 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -147,8 +147,12 @@ _cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y)
> $(CPPFLAGS_$(target-stem).lds)
> # (in this order)
> #
> ifeq ($(CONFIG_GCOV_KERNEL),y)
> +ifneq ($(filter $(obj),$(GCOV_PROFILE_DIRS)),)
> +export GCOV_PROFILE_SUBDIR := y
> +endif
> +
> _c_flags += $(if $(patsubst n%,, \
> -
> $(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)),
> \
> +
> $(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(GCOV_PROFILE_SUBDIR)$(CONFIG_GCOV_PROFILE_ALL)),
> \
> $(CFLAGS_GCOV))
> endif
>
>
>
> Usage:
>
> $ make GCOV_PROFILE_DIRS=fs/bcachefs
>
> -> enable GCOV in fs/bachefs and its subdirectories.
>
> or
>
> $ make GCOV_PROFILE_DIRS="drivers/gpio drivers/pinctrl"
>
> -> enable GCOV in drivers/gpio, drivers/pinctrl, and their subdirectories.
>
>
>
>
> [2] Do equivalent, but from a CONFIG option
>
>
> config GCOV_PROFILE_DIRS
> string "Directories to enable GCOV"
>
>
> Then, you can set CONFIG_GCOV_PROFILE_DIRS="fs/bcachefs"
>
>
> This might be a more natural approach because we already have
> CONFIG_GCOV_PROFILE_ALL, although it might eventually go away
> because CONFIG_GCOV_PROFILE_ALL=y is almost equivalent to
> CONFIG_GCOV_PROFILE_DIRS="."
>
>
>
>
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index 1a965fe68e01..286a569556b3 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -147,8 +147,12 @@ _cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y)
> $(CPPFLAGS_$(target-stem).lds)
> # (in this order)
> #
> ifeq ($(CONFIG_GCOV_KERNEL),y)
> +ifneq ($(filter $(obj),$(CONFIG_GCOV_PROFILE_DIRS)),)
> +export GCOV_PROFILE_SUBDIR := y
> +endif
> +
> _c_flags += $(if $(patsubst n%,, \
> -
> $(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)),
> \
> +
> $(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(GCOV_PROFILE_SUBDIR)$(CONFIG_GCOV_PROFILE_ALL)),
> \
> $(CFLAGS_GCOV))
> endif
>
>
>
>
>
>
>
> > diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> > index 1a965fe68e01..0b4581a8bc33 100644
> > --- a/scripts/Makefile.lib
> > +++ b/scripts/Makefile.lib
> > @@ -148,7 +148,7 @@ _cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(target-stem).lds)
> > #
> > ifeq ($(CONFIG_GCOV_KERNEL),y)
> > _c_flags += $(if $(patsubst n%,, \
> > - $(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \
> > + $(GCOV_PROFILE_$(basetarget).o)$(call eval_vars,GCOV_PROFILE_,$(src))$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \
> > $(CFLAGS_GCOV))
> > endif
> >
> > --
> > 2.42.0
> >
>
>
> --
> Best Regards
> Masahiro Yamada