[RFC] Kbuild: allow code re-use across different directories
From: Arnaud Lacombe <hidden>
Date: 2011-08-20 00:37:36
Also in:
linux-arm-kernel, lkml
Subsystem:
kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers:
Nathan Chancellor, Nicolas Schier, Linus Torvalds
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@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org --- 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