Patchwork Use vpath directive

login
register
mail settings
Submitter Paolo Bonzini
Date Dec. 21, 2009, 9:06 a.m.
Message ID <1261386415-32704-1-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/41540/
State New
Headers show

Comments

Paolo Bonzini - Dec. 21, 2009, 9:06 a.m.
The vpath directive has two advantages over the VPATH variable:
1) it allows to skip searching of .o files; 2) the default semantics
are to append to the vpath, so there is no confusion between "VPATH=xyz"
and "VPATH+=xyz".

Since "vpath %.c %.h PATH" is not valid, I'm introducing a wrapper
macro to append one or more directories to the vpath.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
	This one also fixes the same race (by building cutils.o twice).
        However, it is nicer in that it fixes the wrong occurrence of
        "vpath %.c %.h PATH" (sorry for missing that on my review of
        Kirill's patch).

 Makefile                   |    2 +-
 Makefile.hw                |    2 +-
 Makefile.target            |   11 +++++++----
 Makefile.user              |    6 +-----
 pc-bios/optionrom/Makefile |    3 ++-
 rules.mak                  |    2 ++
 tests/Makefile             |    3 ++-
 7 files changed, 16 insertions(+), 13 deletions(-)
Juan Quintela - Dec. 23, 2009, 6:41 p.m.
Paolo Bonzini <pbonzini@redhat.com> wrote:
> The vpath directive has two advantages over the VPATH variable:
> 1) it allows to skip searching of .o files; 2) the default semantics
> are to append to the vpath, so there is no confusion between "VPATH=xyz"
> and "VPATH+=xyz".
>
> Since "vpath %.c %.h PATH" is not valid, I'm introducing a wrapper
> macro to append one or more directories to the vpath.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Acked-by: Juan Quintela <quintela@redhat.com>

Just created a new tree to get build fixes/changes and added this patch
to it.

It is located at:

http://repo.or.cz/w/qemu/quintela.git/shortlog/refs/heads/build

Later, Juan.
Anthony Liguori - Jan. 8, 2010, 4:34 p.m.
On 12/21/2009 03:06 AM, Paolo Bonzini wrote:
> The vpath directive has two advantages over the VPATH variable:
> 1) it allows to skip searching of .o files; 2) the default semantics
> are to append to the vpath, so there is no confusion between "VPATH=xyz"
> and "VPATH+=xyz".
>
> Since "vpath %.c %.h PATH" is not valid, I'm introducing a wrapper
> macro to append one or more directories to the vpath.
>
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
>    


Applied.  Thanks.

Regards,

Anthony Liguori


> ---
> 	This one also fixes the same race (by building cutils.o twice).
>          However, it is nicer in that it fixes the wrong occurrence of
>          "vpath %.c %.h PATH" (sorry for missing that on my review of
>          Kirill's patch).
>
>   Makefile                   |    2 +-
>   Makefile.hw                |    2 +-
>   Makefile.target            |   11 +++++++----
>   Makefile.user              |    6 +-----
>   pc-bios/optionrom/Makefile |    3 ++-
>   rules.mak                  |    2 ++
>   tests/Makefile             |    3 ++-
>   7 files changed, 16 insertions(+), 13 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index ec52ee2..645ec82 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -25,7 +25,7 @@ configure: ;
>   .PHONY: all clean cscope distclean dvi html info install install-doc \
>   	recurse-all speed tar tarbin test build-all
>
> -VPATH=$(SRC_PATH):$(SRC_PATH)/hw
> +$(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
>
>   LIBS+=-lz $(LIBS_TOOLS)
>
> diff --git a/Makefile.hw b/Makefile.hw
> index bd252f5..781c006 100644
> --- a/Makefile.hw
> +++ b/Makefile.hw
> @@ -7,7 +7,7 @@ include $(SRC_PATH)/rules.mak
>
>   .PHONY: all
>
> -VPATH=$(SRC_PATH):$(SRC_PATH)/hw
> +$(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
>
>   QEMU_CFLAGS+=-I.. -I$(SRC_PATH)/fpu
>
> diff --git a/Makefile.target b/Makefile.target
> index 0504d3b..92c2027 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -9,7 +9,7 @@ include config-target.mak
>   include $(SRC_PATH)/rules.mak
>
>   TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
> -VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw
> +$(call set-vpath, $(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw)
>   QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
>
>   ifdef CONFIG_USER_ONLY
> @@ -87,7 +87,8 @@ signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
>
>   ifdef CONFIG_LINUX_USER
>
> -VPATH+=:$(SRC_PATH)/linux-user:$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR)
> +$(call set-vpath, $(SRC_PATH)/linux-user:$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR))
> +
>   QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user -I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR)
>   obj-y = main.o syscall.o strace.o mmap.o signal.o thunk.o \
>         elfload.o linuxload.o uaccess.o gdbstub.o
> @@ -115,7 +116,8 @@ endif #CONFIG_LINUX_USER
>
>   ifdef CONFIG_DARWIN_USER
>
> -VPATH+=:$(SRC_PATH)/darwin-user
> +$(call set-vpath, $(SRC_PATH)/darwin-user)
> +
>   QEMU_CFLAGS+=-I$(SRC_PATH)/darwin-user -I$(SRC_PATH)/darwin-user/$(TARGET_ARCH)
>
>   # Leave some space for the regular program loading zone
> @@ -137,7 +139,8 @@ endif #CONFIG_DARWIN_USER
>
>   ifdef CONFIG_BSD_USER
>
> -VPATH+=:$(SRC_PATH)/bsd-user
> +$(call set-vpath, $(SRC_PATH)/bsd-user)
> +
>   QEMU_CFLAGS+=-I$(SRC_PATH)/bsd-user -I$(SRC_PATH)/bsd-user/$(TARGET_ARCH)
>
>   obj-y = main.o bsdload.o elfload.o mmap.o signal.o strace.o syscall.o \
> diff --git a/Makefile.user b/Makefile.user
> index 7daedef..5df114f 100644
> --- a/Makefile.user
> +++ b/Makefile.user
> @@ -6,11 +6,7 @@ include $(SRC_PATH)/rules.mak
>
>   .PHONY: all
>
> -# Do not take %.o from $(SRC_PATH), only %.c and %.h
> -# All %.o for user targets should be built with -fpie, when
> -# configured with --enable-user-pie, so we don't want to
> -# take %.o from $(SRC_PATH), since they built without -fpie
> -vpath %.c %.h $(SRC_PATH)
> +$(call set-vpath, $(SRC_PATH))
>
>   QEMU_CFLAGS+=-I..
>
> diff --git a/pc-bios/optionrom/Makefile b/pc-bios/optionrom/Makefile
> index 54db882..b4be31e 100644
> --- a/pc-bios/optionrom/Makefile
> +++ b/pc-bios/optionrom/Makefile
> @@ -5,7 +5,8 @@ all: build-all
>   include ../../config-host.mak
>   include $(SRC_PATH)/rules.mak
>
> -VPATH=$(SRC_PATH)/pc-bios/optionrom
> +$(call set-vpath, $(SRC_PATH)/pc-bios/optionrom)
> +
>   .PHONY : all clean build-all
>
>   CFLAGS := -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin
> diff --git a/rules.mak b/rules.mak
> index 5d9f684..9cd67f0 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -39,6 +39,8 @@ quiet-command = $(if $(V),$1,$(if $(2),@echo $2&&  $1, @$1))
>   cc-option = $(if $(shell $(CC) $1 $2 -S -o /dev/null -xc /dev/null \
>                 >/dev/null 2>&1&&  echo OK), $2, $3)
>
> +set-vpath = $(if $1,$(foreach PATTERN,%.c %.h %.S, $(eval vpath $(PATTERN) $1)))
> +
>   # Generate timestamp files for .h include files
>
>   %.h: %.h-timestamp
> diff --git a/tests/Makefile b/tests/Makefile
> index 69092e5..ff7f787 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -1,5 +1,6 @@
>   -include ../config-host.mak
> -VPATH=$(SRC_PATH)/tests
> +
> +$(call set-vpath, $(SRC_PATH)/tests)
>
>   CFLAGS=-Wall -O2 -g -fno-strict-aliasing
>   #CFLAGS+=-msse2
>

Patch

diff --git a/Makefile b/Makefile
index ec52ee2..645ec82 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@  configure: ;
 .PHONY: all clean cscope distclean dvi html info install install-doc \
 	recurse-all speed tar tarbin test build-all
 
-VPATH=$(SRC_PATH):$(SRC_PATH)/hw
+$(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
 
 LIBS+=-lz $(LIBS_TOOLS)
 
diff --git a/Makefile.hw b/Makefile.hw
index bd252f5..781c006 100644
--- a/Makefile.hw
+++ b/Makefile.hw
@@ -7,7 +7,7 @@  include $(SRC_PATH)/rules.mak
 
 .PHONY: all
 
-VPATH=$(SRC_PATH):$(SRC_PATH)/hw
+$(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
 
 QEMU_CFLAGS+=-I.. -I$(SRC_PATH)/fpu
 
diff --git a/Makefile.target b/Makefile.target
index 0504d3b..92c2027 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -9,7 +9,7 @@  include config-target.mak
 include $(SRC_PATH)/rules.mak
 
 TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
-VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw
+$(call set-vpath, $(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw)
 QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
 
 ifdef CONFIG_USER_ONLY
@@ -87,7 +87,8 @@  signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
 
 ifdef CONFIG_LINUX_USER
 
-VPATH+=:$(SRC_PATH)/linux-user:$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR)
+$(call set-vpath, $(SRC_PATH)/linux-user:$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR))
+
 QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user -I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR)
 obj-y = main.o syscall.o strace.o mmap.o signal.o thunk.o \
       elfload.o linuxload.o uaccess.o gdbstub.o
@@ -115,7 +116,8 @@  endif #CONFIG_LINUX_USER
 
 ifdef CONFIG_DARWIN_USER
 
-VPATH+=:$(SRC_PATH)/darwin-user
+$(call set-vpath, $(SRC_PATH)/darwin-user)
+
 QEMU_CFLAGS+=-I$(SRC_PATH)/darwin-user -I$(SRC_PATH)/darwin-user/$(TARGET_ARCH)
 
 # Leave some space for the regular program loading zone
@@ -137,7 +139,8 @@  endif #CONFIG_DARWIN_USER
 
 ifdef CONFIG_BSD_USER
 
-VPATH+=:$(SRC_PATH)/bsd-user
+$(call set-vpath, $(SRC_PATH)/bsd-user)
+
 QEMU_CFLAGS+=-I$(SRC_PATH)/bsd-user -I$(SRC_PATH)/bsd-user/$(TARGET_ARCH)
 
 obj-y = main.o bsdload.o elfload.o mmap.o signal.o strace.o syscall.o \
diff --git a/Makefile.user b/Makefile.user
index 7daedef..5df114f 100644
--- a/Makefile.user
+++ b/Makefile.user
@@ -6,11 +6,7 @@  include $(SRC_PATH)/rules.mak
 
 .PHONY: all
 
-# Do not take %.o from $(SRC_PATH), only %.c and %.h
-# All %.o for user targets should be built with -fpie, when
-# configured with --enable-user-pie, so we don't want to
-# take %.o from $(SRC_PATH), since they built without -fpie
-vpath %.c %.h $(SRC_PATH)
+$(call set-vpath, $(SRC_PATH))
 
 QEMU_CFLAGS+=-I..
 
diff --git a/pc-bios/optionrom/Makefile b/pc-bios/optionrom/Makefile
index 54db882..b4be31e 100644
--- a/pc-bios/optionrom/Makefile
+++ b/pc-bios/optionrom/Makefile
@@ -5,7 +5,8 @@  all: build-all
 include ../../config-host.mak
 include $(SRC_PATH)/rules.mak
 
-VPATH=$(SRC_PATH)/pc-bios/optionrom
+$(call set-vpath, $(SRC_PATH)/pc-bios/optionrom)
+
 .PHONY : all clean build-all
 
 CFLAGS := -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin
diff --git a/rules.mak b/rules.mak
index 5d9f684..9cd67f0 100644
--- a/rules.mak
+++ b/rules.mak
@@ -39,6 +39,8 @@  quiet-command = $(if $(V),$1,$(if $(2),@echo $2 && $1, @$1))
 cc-option = $(if $(shell $(CC) $1 $2 -S -o /dev/null -xc /dev/null \
               >/dev/null 2>&1 && echo OK), $2, $3)
 
+set-vpath = $(if $1,$(foreach PATTERN,%.c %.h %.S, $(eval vpath $(PATTERN) $1)))
+
 # Generate timestamp files for .h include files
 
 %.h: %.h-timestamp
diff --git a/tests/Makefile b/tests/Makefile
index 69092e5..ff7f787 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -1,5 +1,6 @@ 
 -include ../config-host.mak
-VPATH=$(SRC_PATH)/tests
+
+$(call set-vpath, $(SRC_PATH)/tests)
 
 CFLAGS=-Wall -O2 -g -fno-strict-aliasing
 #CFLAGS+=-msse2