linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: lacombar@gmail.com (Arnaud Lacombe)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC] Kbuild: allow code re-use across different directories
Date: Thu, 8 Sep 2011 14:24:54 -0400	[thread overview]
Message-ID: <CACqU3MVL-RVP7d6d0U+QDX2f9saNrdU8a6bfOSq_FXrjv+5Sdg@mail.gmail.com> (raw)
In-Reply-To: <1313800642-32418-1-git-send-email-lacombar@gmail.com>

Hi Michal,

On Fri, Aug 19, 2011 at 8:37 PM, Arnaud Lacombe <lacombar@gmail.com> wrote:
> Hi folks,
>
> The attached patch modify Kbuild to allow to directly re-use code in multiple
> directory without having to go through a copy. Technically, it changes Kbuild to
> use by default the VPATH feature of GNU make and provides accessors for Makefile
> to change it indirectly.
>
> Considering:
>
> arch/foo/lib:
> fancy.c
>
> We want to be able to build it with -DPANTS=32 in the kernel, but the
> bootloader requires -DPANTS_SIZE=30.
>
> Currently we would do, either:
>
> arch/foo/lib/Makefile
> LDFLAGS_fancy.o := -DPANTS=32
> obj-y += fancy.o
>
> and, either:
>
> arch/foo/boot/Makefile:
> LDFLAGS_fancy.o := -DPANTS=30
> obj-y += fancy.o
> $(obj)/fancy.c: $(srctree)/arch/foo/lib/fancy.c
> ? ? ? ?$(call cmd,shipped)
>
> or
>
> arch/foo/boot/Makefile:
> LDFLAGS_fancy.o := -DPANTS=30
> obj-y += fancy.o
> $(obj)/fancy.o: $(srctree)/arch/foo/lib/fancy.c
> ? ? ? ?$(call cmd,cc_c_o)
>
> The former implies an extra copy of the source file, the latter expose Kbuild
> internal function.
>
> With the attached patch, we would do:
>
> arch/foo/boot/Makefile:
> LDFLAGS_fancy.o := -DPANTS=30
> obj-y += fancy.o
> vpath-y += $(srctree)/arch/foo/lib
>
> and let GNU make do the job.
>
> Comments welcome,
> ?- Arnaud
>
> Cc: linux-kernel at vger.kernel.org
> Cc: linux-arm-kernel at lists.infradead.org
>
can you tell me you're point of view on the aim of the patch, and the
patch itself ? It's no use anyone start using it if you ends up
NACK'ing it.

Thanks,
 - Arnaud


> ---
> ?Makefile ? ? ? ? ? ? ? | ? ?5 +++--
> ?scripts/Makefile.build | ? 24 +++++++++++++++---------
> ?scripts/Makefile.lib ? | ? 17 ++++++++++++-----
> ?3 files changed, 30 insertions(+), 16 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index b4ca4e1..db7f7f5 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -154,9 +154,10 @@ objtree ? ? ? ? ? ?:= $(CURDIR)
> ?src ? ? ? ? ? ?:= $(srctree)
> ?obj ? ? ? ? ? ?:= $(objtree)
>
> -VPATH ? ? ? ? ?:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
> +KBUILD_VPATH ? := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
> +VPATH ? ? ? ? ?:= $(KBUILD_VPATH)
>
> -export srctree objtree VPATH
> +export srctree objtree KBUILD_VPATH
>
>
> ?# SUBARCH tells the usermode build what the underlying arch is. ?That is set
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index a0fd502..ac539d7 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -18,6 +18,8 @@ always :=
> ?targets :=
> ?subdir-y :=
> ?subdir-m :=
> +vpath-y :=
> +vpath-m :=
> ?EXTRA_AFLAGS ? :=
> ?EXTRA_CFLAGS ? :=
> ?EXTRA_CPPFLAGS :=
> @@ -37,6 +39,7 @@ include scripts/Kbuild.include
>
> ?# For backward compatibility check that these variables do not change
> ?save-cflags := $(CFLAGS)
> +save-vpath := $(VPATH)
>
> ?# The filename Kbuild has precedence over Makefile
> ?kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
> @@ -48,6 +51,9 @@ ifeq ($(KBUILD_NOPEDANTIC),)
> ? ? ? ? ifneq ("$(save-cflags)","$(CFLAGS)")
> ? ? ? ? ? ? ? ? $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use EXTRA_CFLAGS)
> ? ? ? ? endif
> + ? ? ? ?ifneq ("$(save-vpath)","$(VPATH)")
> + ? ? ? ? ? ? ? ?$(error VPATH was changed in "$(kbuild-file)". Please uses vpath-y)
> + ? ? ? ?endif
> ?endif
>
> ?#
> @@ -198,13 +204,13 @@ $(multi-objs-y:.o=.lst) : modname = $(modname-multi)
> ?quiet_cmd_cc_s_c = CC $(quiet_modtag) ?$@
> ?cmd_cc_s_c ? ? ? = $(CC) $(c_flags) -fverbose-asm -S -o $@ $<
>
> -$(obj)/%.s: $(src)/%.c FORCE
> +$(obj)/%.s: %.c FORCE
> ? ? ? ?$(call if_changed_dep,cc_s_c)
>
> ?quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
> ?cmd_cc_i_c ? ? ? = $(CPP) $(c_flags) ? -o $@ $<
>
> -$(obj)/%.i: $(src)/%.c FORCE
> +$(obj)/%.i: %.c FORCE
> ? ? ? ?$(call if_changed_dep,cc_i_c)
>
> ?cmd_gensymtypes = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> @@ -219,7 +225,7 @@ cmd_cc_symtypes_c = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> ? ? $(call cmd_gensymtypes,true,$@) >/dev/null; ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> ? ? test -s $@ || rm -f $@
>
> -$(obj)/%.symtypes : $(src)/%.c FORCE
> +$(obj)/%.symtypes : %.c FORCE
> ? ? ? ?$(call cmd,cc_symtypes_c)
>
> ?# C (.c) files
> @@ -301,13 +307,13 @@ define rule_cc_o_c
> ?endef
>
> ?# Built-in and composite module parts
> -$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> +$(obj)/%.o: %.c $(recordmcount_source) FORCE
> ? ? ? ?$(call cmd,force_checksrc)
> ? ? ? ?$(call if_changed_rule,cc_o_c)
>
> ?# Single-part modules are special since we need to mark them in $(MODVERDIR)
>
> -$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> +$(single-used-m): %.o: %.c $(recordmcount_source) FORCE
> ? ? ? ?$(call cmd,force_checksrc)
> ? ? ? ?$(call if_changed_rule,cc_o_c)
> ? ? ? ?@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
> @@ -317,7 +323,7 @@ quiet_cmd_cc_lst_c = MKLST ? $@
> ? ? ? ? ? ? ? ? ? ? $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.map $(OBJDUMP) > $@
>
> -$(obj)/%.lst: $(src)/%.c FORCE
> +$(obj)/%.lst: %.c FORCE
> ? ? ? ?$(call if_changed_dep,cc_lst_c)
>
> ?# Compile assembler sources (.S)
> @@ -331,13 +337,13 @@ $(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
> ?quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
> ?cmd_as_s_S ? ? ? = $(CPP) $(a_flags) ? -o $@ $<
>
> -$(obj)/%.s: $(src)/%.S FORCE
> +$(obj)/%.s: %.S FORCE
> ? ? ? ?$(call if_changed_dep,as_s_S)
>
> ?quiet_cmd_as_o_S = AS $(quiet_modtag) ?$@
> ?cmd_as_o_S ? ? ? = $(CC) $(a_flags) -c -o $@ $<
>
> -$(obj)/%.o: $(src)/%.S FORCE
> +$(obj)/%.o: %.S FORCE
> ? ? ? ?$(call if_changed_dep,as_o_S)
>
> ?targets += $(real-objs-y) $(real-objs-m) $(lib-y)
> @@ -349,7 +355,7 @@ quiet_cmd_cpp_lds_S = LDS ? ? $@
> ? ? ? cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
>
> -$(obj)/%.lds: $(src)/%.lds.S FORCE
> +$(obj)/%.lds: %.lds.S FORCE
> ? ? ? ?$(call if_changed_dep,cpp_lds_S)
>
> ?# Build the compiled-in targets
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index aeea84a..b57b621 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -46,6 +46,13 @@ obj-m ? ? ? ? ? ? ? ?:= $(filter-out %/, $(obj-m))
>
> ?subdir-ym ? ? ?:= $(sort $(subdir-y) $(subdir-m))
>
> +#
> +vpath-ym ? ? ? := $(vpath-y) $(vpath-m)
> +VPATH ? ? ? ? ?:= $(KBUILD_VPATH)
> +VPATH ? ? ? ? ?+= $(srctree)/$(src)
> +VPATH ? ? ? ? ?+= $(obj)
> +VPATH ? ? ? ? ?+= $(vpath-ym)
> +
> ?# if $(foo-objs) exists, foo.o is a composite object
> ?multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))
> ?multi-used-m := $(sort $(foreach m,$(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))
> @@ -167,7 +174,7 @@ ifdef REGENERATE_PARSERS
> ?quiet_cmd_gperf = GPERF $@
> ? ? ? cmd_gperf = gperf -t --output-file $@ -a -C -E -g -k 1,3,$$ -p -t $<
>
> -$(src)/%.hash.c_shipped: $(src)/%.gperf
> +$(src)/%.hash.c_shipped: %.gperf
> ? ? ? ?$(call cmd,gperf)
>
> ?# LEX
> @@ -177,7 +184,7 @@ LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy)
> ?quiet_cmd_flex = LEX ? ? $@
> ? ? ? cmd_flex = flex -o$@ -L -P $(LEX_PREFIX) $<
>
> -$(src)/%.lex.c_shipped: $(src)/%.l
> +$(src)/%.lex.c_shipped: %.l
> ? ? ? ?$(call cmd,flex)
>
> ?# YACC
> @@ -187,13 +194,13 @@ YACC_PREFIX = $(if $(YACC_PREFIX_${baseprereq}),$(YACC_PREFIX_${baseprereq}),yy)
> ?quiet_cmd_bison = YACC ? ?$@
> ? ? ? cmd_bison = bison -o$@ -t -l -p $(YACC_PREFIX) $<
>
> -$(src)/%.tab.c_shipped: $(src)/%.y
> +$(src)/%.tab.c_shipped: %.y
> ? ? ? ?$(call cmd,bison)
>
> ?quiet_cmd_bison_h = YACC ? ?$@
> ? ? ? cmd_bison_h = bison -o/dev/null --defines=$@ -t -l -p $(YACC_PREFIX) $<
>
> -$(src)/%.tab.h_shipped: $(src)/%.y
> +$(src)/%.tab.h_shipped: %.y
> ? ? ? ?$(call cmd,bison_h)
>
> ?endif
> @@ -204,7 +211,7 @@ endif
> ?quiet_cmd_shipped = SHIPPED $@
> ?cmd_shipped = cat $< > $@
>
> -$(obj)/%: $(src)/%_shipped
> +$(obj)/%: %_shipped
> ? ? ? ?$(call cmd,shipped)
>
> ?# Commands useful for building a boot image
> --
> 1.7.6.153.g78432
>
>

  parent reply	other threads:[~2011-09-08 18:24 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-20  0:37 [RFC] Kbuild: allow code re-use across different directories Arnaud Lacombe
2011-08-22  8:42 ` Cong Wang
2011-08-30  0:31 ` Arnaud Lacombe
2011-08-30  4:32   ` Nicolas Pitre
2011-08-30  4:36     ` Arnaud Lacombe
2011-09-07 19:07 ` Nicolas Pitre
2011-09-07 19:34   ` Arnaud Lacombe
2011-09-07 19:59     ` Nicolas Pitre
2011-09-07 20:52       ` Arnaud Lacombe
2011-09-08  4:50       ` Arnaud Lacombe
2011-09-08 20:33         ` Nicolas Pitre
2011-09-09  1:22           ` Arnaud Lacombe
2011-09-09 12:32             ` Michal Marek
2011-09-09 16:16               ` Arnaud Lacombe
2011-09-08 18:24 ` Arnaud Lacombe [this message]
2011-09-09 12:30 ` Michal Marek
2011-09-13 21:13   ` Arnaud Lacombe
2011-09-14  1:48     ` Michal Marek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACqU3MVL-RVP7d6d0U+QDX2f9saNrdU8a6bfOSq_FXrjv+5Sdg@mail.gmail.com \
    --to=lacombar@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).