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@xxxxxxxxxxxxxxx Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx --- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html