From mboxrd@z Thu Jan 1 00:00:00 1970 From: lacombar@gmail.com (Arnaud Lacombe) Date: Thu, 8 Sep 2011 14:24:54 -0400 Subject: [RFC] Kbuild: allow code re-use across different directories In-Reply-To: <1313800642-32418-1-git-send-email-lacombar@gmail.com> References: <1313800642-32418-1-git-send-email-lacombar@gmail.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Michal, On Fri, Aug 19, 2011 at 8:37 PM, Arnaud Lacombe 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 > >