Patchwork [v14,2/8] make.rule: fix $(obj) to a real relative path

login
register
mail settings
Submitter Fam Zheng
Date Oct. 16, 2013, 3:26 a.m.
Message ID <1381894008-29164-3-git-send-email-famz@redhat.com>
Download mbox | patch
Permalink /patch/283832/
State New
Headers show

Comments

Fam Zheng - Oct. 16, 2013, 3:26 a.m.
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        | 14 ++++++++++++++
 Makefile.objs   | 17 +----------------
 Makefile.target | 20 ++++++++++++++++----
 configure       |  1 +
 rules.mak       | 14 +++++++++-----
 5 files changed, 41 insertions(+), 25 deletions(-)
Paolo Bonzini - Oct. 17, 2013, 2:57 p.m.
Il 16/10/2013 05:26, 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        | 14 ++++++++++++++
>  Makefile.objs   | 17 +----------------
>  Makefile.target | 20 ++++++++++++++++----
>  configure       |  1 +
>  rules.mak       | 14 +++++++++-----
>  5 files changed, 41 insertions(+), 25 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index b15003f..94dae51 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -115,6 +115,16 @@ defconfig:
>  
>  ifneq ($(wildcard config-host.mak),)
>  include $(SRC_PATH)/Makefile.objs
> +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
>  ifeq ($(CONFIG_SMARTCARD_NSS),y)
> @@ -123,6 +133,10 @@ 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 2b6c1fe..91235a6 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
> @@ -110,18 +110,3 @@ version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
>  # by libqemuutil.a.  These should be moved to a separate .json schema.
>  qga-obj-y = qga/ qapi-types.o qapi-visit.o
>  qga-vss-dll-obj-y = qga/
> -
> -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 \
> -	qga-vss-dll-obj-y \
> -	block-obj-y \
> -	common-obj-y
> -dummy := $(call unnest-vars)
> diff --git a/Makefile.target b/Makefile.target
> index 9a49852..fb3a970 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -143,13 +143,25 @@ 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)
>  
> -all-obj-y = $(obj-y)
> -all-obj-y += $(addprefix ../, $(common-obj-y))
> +ifdef CONFIG_SOFTMMU
> +all-obj-y += $(block-obj-y)
> +endif

Just:

all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y)

>  ifndef CONFIG_HAIKU
>  LIBS+=-lm
> diff --git a/configure b/configure
> index 57ee62a..3381264 100755
> --- a/configure
> +++ b/configure
> @@ -2283,6 +2283,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 abc2e84..01e552e 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -110,9 +110,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 :=)
> @@ -126,9 +123,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
>  
> @@ -143,7 +142,12 @@ $(if $(nested-dirs),
>  endef
>  
>  define unnest-vars
> +$(eval obj := $1)
> +$(eval nested-vars := $2)
> +$(eval old-nested-dirs := )
>  $(call unnest-vars-1)
> +$(if $1,$(foreach v,$(nested-vars),$(eval \
> +	$v := $(addprefix $1/,$($v)))))
>  $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
>  $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
>  $(foreach var,$(nested-vars), $(eval \
>
Fam Zheng - Oct. 18, 2013, 1:59 a.m.
On Thu, 10/17 16:57, Paolo Bonzini wrote:
> Il 16/10/2013 05:26, 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        | 14 ++++++++++++++
> >  Makefile.objs   | 17 +----------------
> >  Makefile.target | 20 ++++++++++++++++----
> >  configure       |  1 +
> >  rules.mak       | 14 +++++++++-----
> >  5 files changed, 41 insertions(+), 25 deletions(-)
> > 
> > diff --git a/Makefile b/Makefile
> > index b15003f..94dae51 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -115,6 +115,16 @@ defconfig:
> >  
> >  ifneq ($(wildcard config-host.mak),)
> >  include $(SRC_PATH)/Makefile.objs
> > +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
> >  ifeq ($(CONFIG_SMARTCARD_NSS),y)
> > @@ -123,6 +133,10 @@ 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 2b6c1fe..91235a6 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
> > @@ -110,18 +110,3 @@ version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
> >  # by libqemuutil.a.  These should be moved to a separate .json schema.
> >  qga-obj-y = qga/ qapi-types.o qapi-visit.o
> >  qga-vss-dll-obj-y = qga/
> > -
> > -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 \
> > -	qga-vss-dll-obj-y \
> > -	block-obj-y \
> > -	common-obj-y
> > -dummy := $(call unnest-vars)
> > diff --git a/Makefile.target b/Makefile.target
> > index 9a49852..fb3a970 100644
> > --- a/Makefile.target
> > +++ b/Makefile.target
> > @@ -143,13 +143,25 @@ 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)
> >  
> > -all-obj-y = $(obj-y)
> > -all-obj-y += $(addprefix ../, $(common-obj-y))
> > +ifdef CONFIG_SOFTMMU
> > +all-obj-y += $(block-obj-y)
> > +endif
> 
> Just:
> 
> all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y)
> 

OK. Thanks,

Fam

> >  ifndef CONFIG_HAIKU
> >  LIBS+=-lm
> > diff --git a/configure b/configure
> > index 57ee62a..3381264 100755
> > --- a/configure
> > +++ b/configure
> > @@ -2283,6 +2283,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 abc2e84..01e552e 100644
> > --- a/rules.mak
> > +++ b/rules.mak
> > @@ -110,9 +110,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 :=)
> > @@ -126,9 +123,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
> >  
> > @@ -143,7 +142,12 @@ $(if $(nested-dirs),
> >  endef
> >  
> >  define unnest-vars
> > +$(eval obj := $1)
> > +$(eval nested-vars := $2)
> > +$(eval old-nested-dirs := )
> >  $(call unnest-vars-1)
> > +$(if $1,$(foreach v,$(nested-vars),$(eval \
> > +	$v := $(addprefix $1/,$($v)))))
> >  $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
> >  $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
> >  $(foreach var,$(nested-vars), $(eval \
> > 
> 
>
Fam Zheng - Nov. 12, 2013, 6:26 a.m.
On 2013年10月17日 22:57, Paolo Bonzini wrote:
> Il 16/10/2013 05:26, 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        | 14 ++++++++++++++
>>   Makefile.objs   | 17 +----------------
>>   Makefile.target | 20 ++++++++++++++++----
>>   configure       |  1 +
>>   rules.mak       | 14 +++++++++-----
>>   5 files changed, 41 insertions(+), 25 deletions(-)
>>
>> diff --git a/Makefile b/Makefile
>> index b15003f..94dae51 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -115,6 +115,16 @@ defconfig:
>>
>>   ifneq ($(wildcard config-host.mak),)
>>   include $(SRC_PATH)/Makefile.objs
>> +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
>>   ifeq ($(CONFIG_SMARTCARD_NSS),y)
>> @@ -123,6 +133,10 @@ 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 2b6c1fe..91235a6 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
>> @@ -110,18 +110,3 @@ version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
>>   # by libqemuutil.a.  These should be moved to a separate .json schema.
>>   qga-obj-y = qga/ qapi-types.o qapi-visit.o
>>   qga-vss-dll-obj-y = qga/
>> -
>> -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 \
>> -	qga-vss-dll-obj-y \
>> -	block-obj-y \
>> -	common-obj-y
>> -dummy := $(call unnest-vars)
>> diff --git a/Makefile.target b/Makefile.target
>> index 9a49852..fb3a970 100644
>> --- a/Makefile.target
>> +++ b/Makefile.target
>> @@ -143,13 +143,25 @@ 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)
>>
>> -all-obj-y = $(obj-y)
>> -all-obj-y += $(addprefix ../, $(common-obj-y))
>> +ifdef CONFIG_SOFTMMU
>> +all-obj-y += $(block-obj-y)
>> +endif
>
> Just:
>
> all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y)
>

Paolo. I think this is the only comment on this series. Do you want me 
to respin?

Thanks,
Fam

>>   ifndef CONFIG_HAIKU
>>   LIBS+=-lm
>> diff --git a/configure b/configure
>> index 57ee62a..3381264 100755
>> --- a/configure
>> +++ b/configure
>> @@ -2283,6 +2283,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 abc2e84..01e552e 100644
>> --- a/rules.mak
>> +++ b/rules.mak
>> @@ -110,9 +110,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 :=)
>> @@ -126,9 +123,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
>>
>> @@ -143,7 +142,12 @@ $(if $(nested-dirs),
>>   endef
>>
>>   define unnest-vars
>> +$(eval obj := $1)
>> +$(eval nested-vars := $2)
>> +$(eval old-nested-dirs := )
>>   $(call unnest-vars-1)
>> +$(if $1,$(foreach v,$(nested-vars),$(eval \
>> +	$v := $(addprefix $1/,$($v)))))
>>   $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
>>   $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
>>   $(foreach var,$(nested-vars), $(eval \
>>
>
>

Patch

diff --git a/Makefile b/Makefile
index b15003f..94dae51 100644
--- a/Makefile
+++ b/Makefile
@@ -115,6 +115,16 @@  defconfig:
 
 ifneq ($(wildcard config-host.mak),)
 include $(SRC_PATH)/Makefile.objs
+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
 ifeq ($(CONFIG_SMARTCARD_NSS),y)
@@ -123,6 +133,10 @@  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 2b6c1fe..91235a6 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
@@ -110,18 +110,3 @@  version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
 # by libqemuutil.a.  These should be moved to a separate .json schema.
 qga-obj-y = qga/ qapi-types.o qapi-visit.o
 qga-vss-dll-obj-y = qga/
-
-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 \
-	qga-vss-dll-obj-y \
-	block-obj-y \
-	common-obj-y
-dummy := $(call unnest-vars)
diff --git a/Makefile.target b/Makefile.target
index 9a49852..fb3a970 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -143,13 +143,25 @@  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)
 
-all-obj-y = $(obj-y)
-all-obj-y += $(addprefix ../, $(common-obj-y))
+ifdef CONFIG_SOFTMMU
+all-obj-y += $(block-obj-y)
+endif
 
 ifndef CONFIG_HAIKU
 LIBS+=-lm
diff --git a/configure b/configure
index 57ee62a..3381264 100755
--- a/configure
+++ b/configure
@@ -2283,6 +2283,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 abc2e84..01e552e 100644
--- a/rules.mak
+++ b/rules.mak
@@ -110,9 +110,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 :=)
@@ -126,9 +123,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
 
@@ -143,7 +142,12 @@  $(if $(nested-dirs),
 endef
 
 define unnest-vars
+$(eval obj := $1)
+$(eval nested-vars := $2)
+$(eval old-nested-dirs := )
 $(call unnest-vars-1)
+$(if $1,$(foreach v,$(nested-vars),$(eval \
+	$v := $(addprefix $1/,$($v)))))
 $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
 $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
 $(foreach var,$(nested-vars), $(eval \