diff mbox

[RFC] Kbuild: allow code re-use across different directories

Message ID 1313800642-32418-1-git-send-email-lacombar@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Arnaud Lacombe Aug. 20, 2011, 12:37 a.m. UTC
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(-)

Comments

Amerigo Wang Aug. 22, 2011, 8:42 a.m. UTC | #1
? 2011?08?20? 08:37, Arnaud Lacombe ??:
> 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.
...
>
> 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.

Just note that don't forget to update Documentation/kbuild/makefiles.txt. ;)

Thanks.
Arnaud Lacombe Aug. 30, 2011, 12:31 a.m. UTC | #2
Hi,

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.
>
Nicolas, I guess you were the one who was interested for a generic way
to do such code re-use, did you had any chance to test the quoted
patch ?

Thanks,
 - Arnaud


> 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
>
>
Nicolas Pitre Aug. 30, 2011, 4:32 a.m. UTC | #3
On Mon, 29 Aug 2011, Arnaud Lacombe wrote:

> On Fri, Aug 19, 2011 at 8:37 PM, Arnaud Lacombe <lacombar@gmail.com> wrote:
> > 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.
> >
> Nicolas, I guess you were the one who was interested for a generic way
> to do such code re-use, did you had any chance to test the quoted
> patch ?

I actually missed the original post (I wasn't in CC) so I didn't test it. 
Will try to do so ASAP.


Nicolas
Arnaud Lacombe Aug. 30, 2011, 4:36 a.m. UTC | #4
Hi,

On Tue, Aug 30, 2011 at 12:32 AM, Nicolas Pitre <nico@fluxnic.net> wrote:
> On Mon, 29 Aug 2011, Arnaud Lacombe wrote:
>
>> On Fri, Aug 19, 2011 at 8:37 PM, Arnaud Lacombe <lacombar@gmail.com> wrote:
>> > 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.
>> >
>> Nicolas, I guess you were the one who was interested for a generic way
>> to do such code re-use, did you had any chance to test the quoted
>> patch ?
>
> I actually missed the original post (I wasn't in CC) so I didn't test it.
> Will try to do so ASAP.
>
Sorry for the miss, I thought linux-arm-kernel@ would catch enough people :)

 - Arnaud
Nicolas Pitre Sept. 7, 2011, 7:07 p.m. UTC | #5
On Fri, 19 Aug 2011, 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,

It doesn't work.  Whatever I do to arch/arm/boot/compressed/Makefile 
(which admittedly looks a bit hairy and could benefit from a shave) in 
order to remove the $(call cmd,shipped) used with lib1funcs.S, I always 
end up with:

make[2]: *** No rule to make target `arch/arm/boot/compressed/lib1funcs.S', needed by `arch/arm/boot/compressed/lib1funcs.o'.  Stop.

Obviously, restoring the explicit dependency with a $(call cmd,as_o_S) 
does make it work, but this is rather against the point of your patch.

Do you have an example of how arch/arm/boot/compressed/Makefile should 
be changed to benefit from your patch?


Nicolas
Arnaud Lacombe Sept. 7, 2011, 7:34 p.m. UTC | #6
Hi,

On Wed, Sep 7, 2011 at 3:07 PM, Nicolas Pitre <nico@fluxnic.net> wrote:
> On Fri, 19 Aug 2011, 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,
>
> It doesn't work.  Whatever I do to arch/arm/boot/compressed/Makefile
> (which admittedly looks a bit hairy and could benefit from a shave) in
> order to remove the $(call cmd,shipped) used with lib1funcs.S, I always
> end up with:
>
> make[2]: *** No rule to make target `arch/arm/boot/compressed/lib1funcs.S', needed by `arch/arm/boot/compressed/lib1funcs.o'.  Stop.
>
What was the exact change you made which triggered this ?

Thanks,
 - Arnaud

> Obviously, restoring the explicit dependency with a $(call cmd,as_o_S)
> does make it work, but this is rather against the point of your patch.
>
> Do you have an example of how arch/arm/boot/compressed/Makefile should
> be changed to benefit from your patch?
>


>
> Nicolas
>
diff mbox

Patch

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