diff mbox

[v6,1/8] make.rule: fix $(obj) to a real relative path

Message ID 1378906448-15834-2-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng Sept. 11, 2013, 1:34 p.m. UTC
Makefile.target includes rule.mak and unnested common-obj-y, then prefix
them with '../', this will ignore object specific QEMU_CFLAGS in subdir
Makefile.objs:

    $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)

Because $(obj) here is './block', instead of '../block'. This doesn't
hurt compiling because we basically build all .o from top Makefile,
before entering Makefile.target, but it will affact arriving per-object
libs support.

The starting point of $(obj) is passed in as argument of unnest-vars, as
well as nested variables, so that different Makefiles can pass in a
right value.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile        | 16 +++++++++++++++-
 Makefile.objs   | 16 +---------------
 Makefile.target | 17 +++++++++++++----
 configure       |  1 +
 rules.mak       | 16 +++++++++++-----
 5 files changed, 41 insertions(+), 25 deletions(-)

Comments

Paolo Bonzini Sept. 11, 2013, 1:41 p.m. UTC | #1
Il 11/09/2013 15:34, Fam Zheng ha scritto:
> Makefile.target includes rule.mak and unnested common-obj-y, then prefix
> them with '../', this will ignore object specific QEMU_CFLAGS in subdir
> Makefile.objs:
> 
>     $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
> 
> Because $(obj) here is './block', instead of '../block'. This doesn't
> hurt compiling because we basically build all .o from top Makefile,
> before entering Makefile.target, but it will affact arriving per-object
> libs support.
> 
> The starting point of $(obj) is passed in as argument of unnest-vars, as
> well as nested variables, so that different Makefiles can pass in a
> right value.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  Makefile        | 16 +++++++++++++++-
>  Makefile.objs   | 16 +---------------
>  Makefile.target | 17 +++++++++++++----
>  configure       |  1 +
>  rules.mak       | 16 +++++++++++-----
>  5 files changed, 41 insertions(+), 25 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 806946e..9e603c6 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -115,14 +115,28 @@ defconfig:
>  
>  ifneq ($(wildcard config-host.mak),)
>  include $(SRC_PATH)/Makefile.objs
> -include $(SRC_PATH)/tests/Makefile
>  endif
>  ifeq ($(CONFIG_SMARTCARD_NSS),y)
>  include $(SRC_PATH)/libcacard/Makefile
>  endif
>  
> +dummy := $(call unnest-vars,, \
> +                stub-obj-y \
> +                util-obj-y \
> +                qga-obj-y \
> +                block-obj-y \
> +                common-obj-y)
> +
> +ifneq ($(wildcard config-host.mak),)
> +include $(SRC_PATH)/tests/Makefile
> +endif
> +
>  all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
>  
> +vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
> +
> +vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
> +
>  config-host.h: config-host.h-timestamp
>  config-host.h-timestamp: config-host.mak
>  qemu-options.def: $(SRC_PATH)/qemu-options.hx
> diff --git a/Makefile.objs b/Makefile.objs
> index f46a4cd..4f7a364 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -41,7 +41,7 @@ libcacard-y += libcacard/vcardt.o
>  # single QEMU executable should support all CPUs and machines.
>  
>  ifeq ($(CONFIG_SOFTMMU),y)
> -common-obj-y = $(block-obj-y) blockdev.o blockdev-nbd.o block/
> +common-obj-y = blockdev.o blockdev-nbd.o block/
>  common-obj-y += net/
>  common-obj-y += readline.o
>  common-obj-y += qdev-monitor.o device-hotplug.o
> @@ -109,17 +109,3 @@ version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
>  # FIXME: a few definitions from qapi-types.o/qapi-visit.o are needed
>  # by libqemuutil.a.  These should be moved to a separate .json schema.
>  qga-obj-y = qga/ qapi-types.o qapi-visit.o
> -
> -vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
> -
> -vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
> -
> -QEMU_CFLAGS+=$(GLIB_CFLAGS)
> -
> -nested-vars += \
> -	stub-obj-y \
> -	util-obj-y \
> -	qga-obj-y \
> -	block-obj-y \
> -	common-obj-y
> -dummy := $(call unnest-vars)
> diff --git a/Makefile.target b/Makefile.target
> index 9a49852..87906ea 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -143,13 +143,22 @@ endif # CONFIG_SOFTMMU
>  # Workaround for http://gcc.gnu.org/PR55489, see configure.
>  %/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS)
>  
> -nested-vars += obj-y
> +dummy := $(call unnest-vars,,obj-y)
>  
> -# This resolves all nested paths, so it must come last
> +# we are making another call to unnest-vars with different vars, protect obj-y,
> +# it can be overriden in subdir Makefile.objs
> +obj-y-save := $(obj-y)
> +
> +block-obj-y :=
> +common-obj-y :=
>  include $(SRC_PATH)/Makefile.objs
> +dummy := $(call unnest-vars,..,block-obj-y common-obj-y)
> +
> +# Now restore obj-y
> +obj-y := $(obj-y-save)
> +
> +all-obj-y = $(obj-y) $(common-obj-y) $(block-obj-y)
>  
> -all-obj-y = $(obj-y)
> -all-obj-y += $(addprefix ../, $(common-obj-y))
>  
>  ifndef CONFIG_HAIKU
>  LIBS+=-lm
> diff --git a/configure b/configure
> index e989609..cc3cd4d 100755
> --- a/configure
> +++ b/configure
> @@ -2251,6 +2251,7 @@ fi
>  if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
>      glib_cflags=`$pkg_config --cflags gthread-2.0`
>      glib_libs=`$pkg_config --libs gthread-2.0`
> +    CFLAGS="$glib_cflags $CFLAGS"
>      LIBS="$glib_libs $LIBS"
>      libs_qga="$glib_libs $libs_qga"
>  else
> diff --git a/rules.mak b/rules.mak
> index 4499745..9344c27 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -103,9 +103,6 @@ clean: clean-timestamp
>  
>  # magic to descend into other directories
>  
> -obj := .
> -old-nested-dirs :=
> -
>  define push-var
>  $(eval save-$2-$1 = $(value $1))
>  $(eval $1 :=)
> @@ -119,9 +116,11 @@ endef
>  
>  define unnest-dir
>  $(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
> -$(eval obj := $(obj)/$1)
> +$(eval obj-parent-$1 := $(obj))
> +$(eval obj := $(if $(obj),$(obj)/$1,$1))
>  $(eval include $(SRC_PATH)/$1/Makefile.objs)
> -$(eval obj := $(patsubst %/$1,%,$(obj)))
> +$(eval obj := $(obj-parent-$1))
> +$(eval obj-parent-$1 := )
>  $(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
>  endef
>  
> @@ -136,9 +135,16 @@ $(if $(nested-dirs),
>  endef
>  
>  define unnest-vars
> +$(eval obj := $1)
> +$(eval nested-vars := $2)
> +$(eval old-nested-dirs := )
>  $(call unnest-vars-1)
>  $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
>  $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
>  $(foreach var,$(nested-vars), $(eval \
>    -include $(addsuffix *.d, $(sort $(dir $($(var)))))))
> +
> +$(if $1,$(foreach v,$(nested-vars),$(eval \
> +	$v := $(addprefix $1/,$(value $v)))))

I think needs to be done immediately after unnest-vars-1.

Otherwise looks good, any simplification to the logic is outside the
scope of this series.

Paolo

>  endef
>
Daniel P. Berrangé Sept. 11, 2013, 2:59 p.m. UTC | #2
On Wed, Sep 11, 2013 at 09:34:01PM +0800, Fam Zheng wrote:
> Makefile.target includes rule.mak and unnested common-obj-y, then prefix
> them with '../', this will ignore object specific QEMU_CFLAGS in subdir
> Makefile.objs:
> 
>     $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
> 
> Because $(obj) here is './block', instead of '../block'. This doesn't
> hurt compiling because we basically build all .o from top Makefile,
> before entering Makefile.target, but it will affact arriving per-object
> libs support.
> 
> The starting point of $(obj) is passed in as argument of unnest-vars, as
> well as nested variables, so that different Makefiles can pass in a
> right value.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  Makefile        | 16 +++++++++++++++-
>  Makefile.objs   | 16 +---------------
>  Makefile.target | 17 +++++++++++++----
>  configure       |  1 +
>  rules.mak       | 16 +++++++++++-----
>  5 files changed, 41 insertions(+), 25 deletions(-)

This change appears to break the build of libcacard.so when I tried
the following sequence with current git master

 $ git clean -f -x -d
 $ ./configure --prefix=$HOME/usr/qemu-git --target-list=x86_64-softmmu
 $ make -j 20
   ....
  lt LINK vscclient
  ./.libs/libcacard.so: undefined reference to `monitor_fdset_get_fd'
  ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_add'
  ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_remove'
  ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_find'
  collect2: error: ld returned 1 exit status

I'm also seeing make report circular deps

  make: Circular stubs/ <- stubs/ dependency dropped.
  make: Circular trace/ <- stubs/ dependency dropped.
  make: Circular trace/ <- trace/ dependency dropped.


Regards,
Daniel
Peter Maydell Sept. 11, 2013, 4:38 p.m. UTC | #3
On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
> Makefile.target includes rule.mak and unnested common-obj-y, then prefix
> them with '../', this will ignore object specific QEMU_CFLAGS in subdir
> Makefile.objs:
>
>     $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
>
> Because $(obj) here is './block', instead of '../block'. This doesn't
> hurt compiling because we basically build all .o from top Makefile,
> before entering Makefile.target, but it will affact arriving per-object
> libs support.
>
> The starting point of $(obj) is passed in as argument of unnest-vars, as
> well as nested variables, so that different Makefiles can pass in a
> right value.

This breaks compilation on MacOSX of the cocoa UI:
make[1]: *** No rule to make target
`/Users/pm215/src/qemu/../ui/cocoa.m', needed by `../ui/cocoa.o'.
Stop.

because the dependency in ui/Makefile.objs:

$(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m

now results in cocoa.o depending on ../ui/cocoa.m
rather than ui/cocoa.m.

I think the right fix for this is just to delete that line
from ui/Makefile.objs, because we have a generic
rule that says "you can build foo.o from foo.m with
an objective-C compiler". That needs to be done
before this series can be applied though.

-- PMM
Paolo Bonzini Sept. 11, 2013, 4:40 p.m. UTC | #4
Il 11/09/2013 18:38, Peter Maydell ha scritto:
> On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
>> Makefile.target includes rule.mak and unnested common-obj-y, then prefix
>> them with '../', this will ignore object specific QEMU_CFLAGS in subdir
>> Makefile.objs:
>>
>>     $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
>>
>> Because $(obj) here is './block', instead of '../block'. This doesn't
>> hurt compiling because we basically build all .o from top Makefile,
>> before entering Makefile.target, but it will affact arriving per-object
>> libs support.
>>
>> The starting point of $(obj) is passed in as argument of unnest-vars, as
>> well as nested variables, so that different Makefiles can pass in a
>> right value.
> 
> This breaks compilation on MacOSX of the cocoa UI:
> make[1]: *** No rule to make target
> `/Users/pm215/src/qemu/../ui/cocoa.m', needed by `../ui/cocoa.o'.
> Stop.
> 
> because the dependency in ui/Makefile.objs:
> 
> $(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m
> 
> now results in cocoa.o depending on ../ui/cocoa.m
> rather than ui/cocoa.m.
> 
> I think the right fix for this is just to delete that line
> from ui/Makefile.objs, because we have a generic
> rule that says "you can build foo.o from foo.m with
> an objective-C compiler". That needs to be done
> before this series can be applied though.

Can you test it?

Paolo
Peter Maydell Sept. 11, 2013, 4:43 p.m. UTC | #5
On 11 September 2013 17:40, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 11/09/2013 18:38, Peter Maydell ha scritto:
>> I think the right fix for this is just to delete that line
>> from ui/Makefile.objs, because we have a generic
>> rule that says "you can build foo.o from foo.m with
>> an objective-C compiler". That needs to be done
>> before this series can be applied though.
>
> Can you test it?

Yes, I'm just putting together a patch.

-- PMM
Fam Zheng Sept. 12, 2013, 1:57 a.m. UTC | #6
On Wed, 09/11 15:59, Daniel P. Berrange wrote:
> On Wed, Sep 11, 2013 at 09:34:01PM +0800, Fam Zheng wrote:
> > Makefile.target includes rule.mak and unnested common-obj-y, then prefix
> > them with '../', this will ignore object specific QEMU_CFLAGS in subdir
> > Makefile.objs:
> > 
> >     $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
> > 
> > Because $(obj) here is './block', instead of '../block'. This doesn't
> > hurt compiling because we basically build all .o from top Makefile,
> > before entering Makefile.target, but it will affact arriving per-object
> > libs support.
> > 
> > The starting point of $(obj) is passed in as argument of unnest-vars, as
> > well as nested variables, so that different Makefiles can pass in a
> > right value.
> > 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  Makefile        | 16 +++++++++++++++-
> >  Makefile.objs   | 16 +---------------
> >  Makefile.target | 17 +++++++++++++----
> >  configure       |  1 +
> >  rules.mak       | 16 +++++++++++-----
> >  5 files changed, 41 insertions(+), 25 deletions(-)
> 
> This change appears to break the build of libcacard.so when I tried
> the following sequence with current git master
> 
>  $ git clean -f -x -d
>  $ ./configure --prefix=$HOME/usr/qemu-git --target-list=x86_64-softmmu
>  $ make -j 20
>    ....
>   lt LINK vscclient
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_get_fd'
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_add'
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_remove'
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_find'
>   collect2: error: ld returned 1 exit status
> 
> I'm also seeing make report circular deps
> 
>   make: Circular stubs/ <- stubs/ dependency dropped.
>   make: Circular trace/ <- stubs/ dependency dropped.
>   make: Circular trace/ <- trace/ dependency dropped.
> 
> 
I haven't seen this problem, can you paste your output of "make --debug=b V=1"?

Fam
Fam Zheng Sept. 12, 2013, 2:22 a.m. UTC | #7
On Wed, 09/11 15:59, Daniel P. Berrange wrote:
> On Wed, Sep 11, 2013 at 09:34:01PM +0800, Fam Zheng wrote:
> > Makefile.target includes rule.mak and unnested common-obj-y, then prefix
> > them with '../', this will ignore object specific QEMU_CFLAGS in subdir
> > Makefile.objs:
> > 
> >     $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
> > 
> > Because $(obj) here is './block', instead of '../block'. This doesn't
> > hurt compiling because we basically build all .o from top Makefile,
> > before entering Makefile.target, but it will affact arriving per-object
> > libs support.
> > 
> > The starting point of $(obj) is passed in as argument of unnest-vars, as
> > well as nested variables, so that different Makefiles can pass in a
> > right value.
> > 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  Makefile        | 16 +++++++++++++++-
> >  Makefile.objs   | 16 +---------------
> >  Makefile.target | 17 +++++++++++++----
> >  configure       |  1 +
> >  rules.mak       | 16 +++++++++++-----
> >  5 files changed, 41 insertions(+), 25 deletions(-)
> 
> This change appears to break the build of libcacard.so when I tried
> the following sequence with current git master
> 
>  $ git clean -f -x -d
>  $ ./configure --prefix=$HOME/usr/qemu-git --target-list=x86_64-softmmu
>  $ make -j 20
>    ....
>   lt LINK vscclient
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_get_fd'
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_add'
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_remove'
>   ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_find'
>   collect2: error: ld returned 1 exit status
> 
> I'm also seeing make report circular deps
> 
>   make: Circular stubs/ <- stubs/ dependency dropped.
>   make: Circular trace/ <- stubs/ dependency dropped.
>   make: Circular trace/ <- trace/ dependency dropped.
> 
> 

I fixed it, the order of including libcacard/Makefile and unnest-vars in top
Makefile is reversed. A Good catch, thanks.

Thanks.
Fam Zheng Sept. 12, 2013, 2:32 a.m. UTC | #8
On Wed, 09/11 15:41, Paolo Bonzini wrote:
> Il 11/09/2013 15:34, Fam Zheng ha scritto:
> > Makefile.target includes rule.mak and unnested common-obj-y, then prefix
> > them with '../', this will ignore object specific QEMU_CFLAGS in subdir
> > Makefile.objs:
> > 
> >     $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
> > 
> > Because $(obj) here is './block', instead of '../block'. This doesn't
> > hurt compiling because we basically build all .o from top Makefile,
> > before entering Makefile.target, but it will affact arriving per-object
> > libs support.
> > 
> > The starting point of $(obj) is passed in as argument of unnest-vars, as
> > well as nested variables, so that different Makefiles can pass in a
> > right value.
> > 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  Makefile        | 16 +++++++++++++++-
> >  Makefile.objs   | 16 +---------------
> >  Makefile.target | 17 +++++++++++++----
> >  configure       |  1 +
> >  rules.mak       | 16 +++++++++++-----
> >  5 files changed, 41 insertions(+), 25 deletions(-)
> > 
> > diff --git a/Makefile b/Makefile
> > index 806946e..9e603c6 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -115,14 +115,28 @@ defconfig:
> >  
> >  ifneq ($(wildcard config-host.mak),)
> >  include $(SRC_PATH)/Makefile.objs
> > -include $(SRC_PATH)/tests/Makefile
> >  endif
> >  ifeq ($(CONFIG_SMARTCARD_NSS),y)
> >  include $(SRC_PATH)/libcacard/Makefile
> >  endif
> >  
> > +dummy := $(call unnest-vars,, \
> > +                stub-obj-y \
> > +                util-obj-y \
> > +                qga-obj-y \
> > +                block-obj-y \
> > +                common-obj-y)
> > +
> > +ifneq ($(wildcard config-host.mak),)
> > +include $(SRC_PATH)/tests/Makefile
> > +endif
> > +
> >  all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
> >  
> > +vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
> > +
> > +vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
> > +
> >  config-host.h: config-host.h-timestamp
> >  config-host.h-timestamp: config-host.mak
> >  qemu-options.def: $(SRC_PATH)/qemu-options.hx
> > diff --git a/Makefile.objs b/Makefile.objs
> > index f46a4cd..4f7a364 100644
> > --- a/Makefile.objs
> > +++ b/Makefile.objs
> > @@ -41,7 +41,7 @@ libcacard-y += libcacard/vcardt.o
> >  # single QEMU executable should support all CPUs and machines.
> >  
> >  ifeq ($(CONFIG_SOFTMMU),y)
> > -common-obj-y = $(block-obj-y) blockdev.o blockdev-nbd.o block/
> > +common-obj-y = blockdev.o blockdev-nbd.o block/
> >  common-obj-y += net/
> >  common-obj-y += readline.o
> >  common-obj-y += qdev-monitor.o device-hotplug.o
> > @@ -109,17 +109,3 @@ version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
> >  # FIXME: a few definitions from qapi-types.o/qapi-visit.o are needed
> >  # by libqemuutil.a.  These should be moved to a separate .json schema.
> >  qga-obj-y = qga/ qapi-types.o qapi-visit.o
> > -
> > -vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
> > -
> > -vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
> > -
> > -QEMU_CFLAGS+=$(GLIB_CFLAGS)
> > -
> > -nested-vars += \
> > -	stub-obj-y \
> > -	util-obj-y \
> > -	qga-obj-y \
> > -	block-obj-y \
> > -	common-obj-y
> > -dummy := $(call unnest-vars)
> > diff --git a/Makefile.target b/Makefile.target
> > index 9a49852..87906ea 100644
> > --- a/Makefile.target
> > +++ b/Makefile.target
> > @@ -143,13 +143,22 @@ endif # CONFIG_SOFTMMU
> >  # Workaround for http://gcc.gnu.org/PR55489, see configure.
> >  %/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS)
> >  
> > -nested-vars += obj-y
> > +dummy := $(call unnest-vars,,obj-y)
> >  
> > -# This resolves all nested paths, so it must come last
> > +# we are making another call to unnest-vars with different vars, protect obj-y,
> > +# it can be overriden in subdir Makefile.objs
> > +obj-y-save := $(obj-y)
> > +
> > +block-obj-y :=
> > +common-obj-y :=
> >  include $(SRC_PATH)/Makefile.objs
> > +dummy := $(call unnest-vars,..,block-obj-y common-obj-y)
> > +
> > +# Now restore obj-y
> > +obj-y := $(obj-y-save)
> > +
> > +all-obj-y = $(obj-y) $(common-obj-y) $(block-obj-y)
> >  
> > -all-obj-y = $(obj-y)
> > -all-obj-y += $(addprefix ../, $(common-obj-y))
> >  
> >  ifndef CONFIG_HAIKU
> >  LIBS+=-lm
> > diff --git a/configure b/configure
> > index e989609..cc3cd4d 100755
> > --- a/configure
> > +++ b/configure
> > @@ -2251,6 +2251,7 @@ fi
> >  if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
> >      glib_cflags=`$pkg_config --cflags gthread-2.0`
> >      glib_libs=`$pkg_config --libs gthread-2.0`
> > +    CFLAGS="$glib_cflags $CFLAGS"
> >      LIBS="$glib_libs $LIBS"
> >      libs_qga="$glib_libs $libs_qga"
> >  else
> > diff --git a/rules.mak b/rules.mak
> > index 4499745..9344c27 100644
> > --- a/rules.mak
> > +++ b/rules.mak
> > @@ -103,9 +103,6 @@ clean: clean-timestamp
> >  
> >  # magic to descend into other directories
> >  
> > -obj := .
> > -old-nested-dirs :=
> > -
> >  define push-var
> >  $(eval save-$2-$1 = $(value $1))
> >  $(eval $1 :=)
> > @@ -119,9 +116,11 @@ endef
> >  
> >  define unnest-dir
> >  $(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
> > -$(eval obj := $(obj)/$1)
> > +$(eval obj-parent-$1 := $(obj))
> > +$(eval obj := $(if $(obj),$(obj)/$1,$1))
> >  $(eval include $(SRC_PATH)/$1/Makefile.objs)
> > -$(eval obj := $(patsubst %/$1,%,$(obj)))
> > +$(eval obj := $(obj-parent-$1))
> > +$(eval obj-parent-$1 := )
> >  $(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
> >  endef
> >  
> > @@ -136,9 +135,16 @@ $(if $(nested-dirs),
> >  endef
> >  
> >  define unnest-vars
> > +$(eval obj := $1)
> > +$(eval nested-vars := $2)
> > +$(eval old-nested-dirs := )
> >  $(call unnest-vars-1)
> >  $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
> >  $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
> >  $(foreach var,$(nested-vars), $(eval \
> >    -include $(addsuffix *.d, $(sort $(dir $($(var)))))))
> > +
> > +$(if $1,$(foreach v,$(nested-vars),$(eval \
> > +	$v := $(addprefix $1/,$(value $v)))))
> 
> I think needs to be done immediately after unnest-vars-1.
> 
Yes, will fix.

Fam
diff mbox

Patch

diff --git a/Makefile b/Makefile
index 806946e..9e603c6 100644
--- a/Makefile
+++ b/Makefile
@@ -115,14 +115,28 @@  defconfig:
 
 ifneq ($(wildcard config-host.mak),)
 include $(SRC_PATH)/Makefile.objs
-include $(SRC_PATH)/tests/Makefile
 endif
 ifeq ($(CONFIG_SMARTCARD_NSS),y)
 include $(SRC_PATH)/libcacard/Makefile
 endif
 
+dummy := $(call unnest-vars,, \
+                stub-obj-y \
+                util-obj-y \
+                qga-obj-y \
+                block-obj-y \
+                common-obj-y)
+
+ifneq ($(wildcard config-host.mak),)
+include $(SRC_PATH)/tests/Makefile
+endif
+
 all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
 
+vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
+
+vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
+
 config-host.h: config-host.h-timestamp
 config-host.h-timestamp: config-host.mak
 qemu-options.def: $(SRC_PATH)/qemu-options.hx
diff --git a/Makefile.objs b/Makefile.objs
index f46a4cd..4f7a364 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -41,7 +41,7 @@  libcacard-y += libcacard/vcardt.o
 # single QEMU executable should support all CPUs and machines.
 
 ifeq ($(CONFIG_SOFTMMU),y)
-common-obj-y = $(block-obj-y) blockdev.o blockdev-nbd.o block/
+common-obj-y = blockdev.o blockdev-nbd.o block/
 common-obj-y += net/
 common-obj-y += readline.o
 common-obj-y += qdev-monitor.o device-hotplug.o
@@ -109,17 +109,3 @@  version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
 # FIXME: a few definitions from qapi-types.o/qapi-visit.o are needed
 # by libqemuutil.a.  These should be moved to a separate .json schema.
 qga-obj-y = qga/ qapi-types.o qapi-visit.o
-
-vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
-
-vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
-
-QEMU_CFLAGS+=$(GLIB_CFLAGS)
-
-nested-vars += \
-	stub-obj-y \
-	util-obj-y \
-	qga-obj-y \
-	block-obj-y \
-	common-obj-y
-dummy := $(call unnest-vars)
diff --git a/Makefile.target b/Makefile.target
index 9a49852..87906ea 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -143,13 +143,22 @@  endif # CONFIG_SOFTMMU
 # Workaround for http://gcc.gnu.org/PR55489, see configure.
 %/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS)
 
-nested-vars += obj-y
+dummy := $(call unnest-vars,,obj-y)
 
-# This resolves all nested paths, so it must come last
+# we are making another call to unnest-vars with different vars, protect obj-y,
+# it can be overriden in subdir Makefile.objs
+obj-y-save := $(obj-y)
+
+block-obj-y :=
+common-obj-y :=
 include $(SRC_PATH)/Makefile.objs
+dummy := $(call unnest-vars,..,block-obj-y common-obj-y)
+
+# Now restore obj-y
+obj-y := $(obj-y-save)
+
+all-obj-y = $(obj-y) $(common-obj-y) $(block-obj-y)
 
-all-obj-y = $(obj-y)
-all-obj-y += $(addprefix ../, $(common-obj-y))
 
 ifndef CONFIG_HAIKU
 LIBS+=-lm
diff --git a/configure b/configure
index e989609..cc3cd4d 100755
--- a/configure
+++ b/configure
@@ -2251,6 +2251,7 @@  fi
 if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
     glib_cflags=`$pkg_config --cflags gthread-2.0`
     glib_libs=`$pkg_config --libs gthread-2.0`
+    CFLAGS="$glib_cflags $CFLAGS"
     LIBS="$glib_libs $LIBS"
     libs_qga="$glib_libs $libs_qga"
 else
diff --git a/rules.mak b/rules.mak
index 4499745..9344c27 100644
--- a/rules.mak
+++ b/rules.mak
@@ -103,9 +103,6 @@  clean: clean-timestamp
 
 # magic to descend into other directories
 
-obj := .
-old-nested-dirs :=
-
 define push-var
 $(eval save-$2-$1 = $(value $1))
 $(eval $1 :=)
@@ -119,9 +116,11 @@  endef
 
 define unnest-dir
 $(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
-$(eval obj := $(obj)/$1)
+$(eval obj-parent-$1 := $(obj))
+$(eval obj := $(if $(obj),$(obj)/$1,$1))
 $(eval include $(SRC_PATH)/$1/Makefile.objs)
-$(eval obj := $(patsubst %/$1,%,$(obj)))
+$(eval obj := $(obj-parent-$1))
+$(eval obj-parent-$1 := )
 $(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
 endef
 
@@ -136,9 +135,16 @@  $(if $(nested-dirs),
 endef
 
 define unnest-vars
+$(eval obj := $1)
+$(eval nested-vars := $2)
+$(eval old-nested-dirs := )
 $(call unnest-vars-1)
 $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
 $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
 $(foreach var,$(nested-vars), $(eval \
   -include $(addsuffix *.d, $(sort $(dir $($(var)))))))
+
+$(if $1,$(foreach v,$(nested-vars),$(eval \
+	$v := $(addprefix $1/,$(value $v)))))
+
 endef