Re: [PATCH] kbuild: Allow gcov to be enabled on the command line

From: Masahiro Yamada
Date: Tue Nov 28 2023 - 06:44:59 EST


On Sun, Nov 26, 2023 at 4:56 AM Kent Overstreet
<kent.overstreet@xxxxxxxxx> wrote:
>
> 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.


It is consistent in a bad way.

You used "GCOV_PROFILE_" prefix
for the full directory path, while it is already
used as a file name which is relative to the
current directory.



>
> I suppose CONFIG_GCOV_PROFILE_DIRS would be fine, but your patch isn't
> complete so I can't test it.


I do not understand what you mean by "isn't complete".

It is just a matter of adding the config entry somewhere.

I added a patch just in case, though.


Note, both approach pros and cons.


The command line approach works for external modules.


With the CONFIG option approach, you can easily see
which directories are profiled by checking the .config,
but it is not easy to enable gcov for external modules.







--
Best Regards
Masahiro Yamada
diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig
index 04f4ebdc3cf5..c95d93189ecc 100644
--- a/kernel/gcov/Kconfig
+++ b/kernel/gcov/Kconfig
@@ -37,6 +37,10 @@ config GCOV_KERNEL
config ARCH_HAS_GCOV_PROFILE_ALL
def_bool n

+config GCOV_PROFILE_DIRS
+ string "Directories to enable gcov profiling"
+ depends on GCOV_KERNEL
+
config GCOV_PROFILE_ALL
bool "Profile entire Kernel"
depends on !COMPILE_TEST
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 1a965fe68e01..5d80f784b922 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