From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43234) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WnpQX-0003oP-Gc for qemu-devel@nongnu.org; Fri, 23 May 2014 09:22:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WnpQQ-0000X2-Qr for qemu-devel@nongnu.org; Fri, 23 May 2014 09:22:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:29363) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WnpQQ-0000Vg-Im for qemu-devel@nongnu.org; Fri, 23 May 2014 09:22:18 -0400 Message-ID: <537F4B81.4050702@redhat.com> Date: Fri, 23 May 2014 15:22:09 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1399987445-6042-1-git-send-email-famz@redhat.com> In-Reply-To: <1399987445-6042-1-git-send-email-famz@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v2] rules.mak: Rewrite unnest-vars List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng , qemu-devel@nongnu.org Cc: Peter Maydell , mjt@tls.msk.ru, Micael Roth , Richard Henderson Just one question: > +# fix-paths > +# Usage: $(call fix-paths, obj_path, src_path, vars) > +# Add prefix @obj_path to all objects in @vars, and add prefix @src_pa= th to all > +# directories in @vars. > +define fix-paths > + $(foreach v,$3, > + $(foreach o,$($v), > + $(if $($o-libs), > + $(eval $1$o-libs :=3D $(value $o-libs))) > + $(if $($o-cflags), > + $(eval $1$o-cflags :=3D $(value $o-cflags))) > + $(if $($o-objs), > + $(eval $1$o-objs :=3D $(addprefix $1,$(value $o-objs))= ))) > + $(eval $v :=3D $(addprefix $1,$(filter-out %/,$(value $v))) \ > + $(addprefix $2,$(filter %/,$(value $v))))) Why $(value $v) here in? I think you need to expand the variable,=20 especially in the last assignment but possibly also in the others. For=20 example if you have OBJECTS =3D foo1.o foo2.o foo.mo-objs =3D $(OBJECTS) the addprefix would set foo.mo-objs =3D dir/$(OBJECTS) which is wrong. Paolo > endef > > -define process-modules > -$(foreach o,$(filter %.o,$($1)), > - $(eval $(patsubst %.o,%.mo,$o): $o) \ > - $(eval $(patsubst %.o,%.mo,$o)-objs :=3D $o)) > -$(foreach o,$(filter-out $(modules-m), $(patsubst %.o,%.mo,$($1))), \ > - $(eval $o-objs +=3D module-common.o) > - $(eval $o: $($o-objs)) > - $(eval modules-objs-m +=3D $($o-objs)) > - $(eval modules-m +=3D $o) > - $(eval $o:; $$(call quiet-command,touch $$@," GEN $$(TARGET_DIR= )$$@")) > - $(if $(CONFIG_MODULES),$(eval modules: $(patsubst %.mo,%$(DSOSUF),= $o)))) \ > -$(eval modules-objs-m :=3D $(sort $(modules-objs-m))) > -$(foreach o,$(modules-objs-m), \ > - $(if $(CONFIG_MODULES),$(eval $o-cflags :=3D $(call maybe-add, $(D= SO_CFLAGS), $($o-cflags))))) > -$(eval $(patsubst %-m,%-$(call lnot,$(CONFIG_MODULES)),$1) +=3D $($1)) > +# unnest-var-recursive > +# Usage: $(call unnest-var-recursive, obj_prefix, vars, var) > +# > +# Unnest @var by including subdir Makefile.objs, while protect others = in @vars > +# unchanged. > +# > +# @obj_prefix is the starting point of object path prefix. > +# > +define unnest-var-recursive > + $(eval dirs :=3D $(sort $(filter %/,$($3)))) > + $(eval $3 :=3D $(filter-out %/,$($3))) > + $(foreach d,$(dirs:%/=3D%), > + $(call save-vars,$2) > + $(eval obj :=3D $(if $1,$1/)$d) > + $(eval -include $(SRC_PATH)/$d/Makefile.objs) > + $(call fix-paths,$(if $1,$1/)$d/,$d/,$2) > + $(call load-vars,$2,$3) > + $(call unnest-var-recursive,$1,$2,$3)) > endef > > +# unnest-vars > +# Usage: $(call unnest-vars, obj_prefix, vars) > +# > +# @obj_prefix: object path prefix, can be empty, or '..', etc. Don't i= nclude > +# ending '/'. > +# > +# @vars: the list of variable names to unnest. > +# > +# This macro will scan subdirectories's Makefile.objs, include them, t= o build > +# up each variable listed in @vars. > +# > +# Per object and per module cflags and libs are saved with relative pa= th fixed > +# as well, those variables include -libs, -cflags and -objs. Items in = -objs are > +# also fixed to relative path against SRC_PATH plus the prefix @obj_pr= efix. > +# > +# All nested variables postfixed by -m in names are treated as DSO var= iables, > +# and will be built as modules, if enabled. > +# > +# A simple example of the unnest: > +# > +# obj_prefix =3D .. > +# vars =3D hot cold > +# hot =3D fire.o sun.o season/ > +# cold =3D snow.o water/ season/ > +# > +# Unnest through a faked source directory structure: > +# > +# SRC_PATH > +# =E2=94=9C=E2=94=80=E2=94=80 water > +# =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 Makefile.objs=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=90 > +# =E2=94=82 =E2=94=82 hot +=3D steam.o =E2=94= =82 > +# =E2=94=82 =E2=94=82 cold +=3D ice.mo =E2=94= =82 > +# =E2=94=82 =E2=94=82 ice.mo-libs :=3D -licemaker =E2=94= =82 > +# =E2=94=82 =E2=94=82 ice.mo-objs :=3D ice1.o ice2.o =E2=94= =82 > +# =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=98 > +# =E2=94=82 > +# =E2=94=94=E2=94=80=E2=94=80 season > +# =E2=94=94=E2=94=80=E2=94=80 Makefile.objs=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 > +# =E2=94=82 hot +=3D summer.o =E2=94=82 > +# =E2=94=82 cold +=3D winter.o =E2=94=82 > +# =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 > +# > +# In the end, the result will be: > +# > +# hot =3D ../fire.o ../sun.o ../season/summer.o > +# cold =3D ../snow.o ../water/ice.mo ../season/winter.o > +# ../water/ice.mo-libs =3D -licemaker > +# ../water/ice.mo-objs =3D ../water/ice1.o ../water/ice2.o > +# > +# Note that 'hot' didn't include 'season/' in the input, so 'summer.o'= is not > +# included. > +# > define unnest-vars > -$(eval obj :=3D $1) > -$(eval nested-vars :=3D $2) > -$(foreach v,$(nested-vars),$(call fix-obj-vars,$v,$(obj))) > -$(eval old-nested-dirs :=3D ) > -$(call unnest-vars-1) > -$(if $1,$(foreach v,$(nested-vars),$(eval \ > - $v :=3D $(addprefix $1/,$($v))))) > -$(foreach var,$(nested-vars),$(eval $(var) :=3D $(filter-out %/, $($(v= ar))))) > -$(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))= )) > -$(foreach var,$(nested-vars), $(eval \ > - -include $(addsuffix *.d, $(sort $(dir $($(var))))))) > -$(foreach v,$(filter %-m,$(nested-vars)), \ > - $(call process-modules,$v)) > + # In the case of target build (i.e. $1 =3D=3D ..), fix path for to= p level > + # Makefile.objs objects > + $(if $1,$(call fix-paths,$1/,,$2)) > + > + # Descend and include every subdir Makefile.objs > + $(foreach v, $2, $(call unnest-var-recursive,$1,$2,$v)) > + > + $(foreach v,$(filter %-m,$2), > + # All .o found in *-m variables are single object modules, cre= ate .mo > + # for them > + $(foreach o,$(filter %.o,$($v)), > + $(eval $(o:%.o=3D%.mo)-objs :=3D $o)) > + # Now unify .o in -m variable to .mo > + $(eval $v :=3D $($v:%.o=3D%.mo)) > + > + $(eval modules: $($v:%.mo=3D%$(DSOSUF))) > + $(eval modules-m +=3D $($v:%.mo=3D%$(DSOSUF))) > + > + # For non-module build, add -m to -y > + $(if $(CONFIG_MODULES),,$(eval $(patsubst %-m,%-y,$v) +=3D $($= v)))) > + > + # .mo's are .PHONY targets > + $(eval .PHONY: $(modules-m)) > + $(eval $(modules-m): module-common.o) > + > + # Post-process all the unnested vars > + $(foreach v,$2, > + $(foreach o, $(filter %.mo,$($v)), > + # Find all the .mo objects in variables and add dependency= rules > + # according to .mo-objs. Report error if not set > + $(if $($o-objs), > + $(eval $o: $($o-objs)), > + $(error $o added in $v but $o-objs is not set)) > + # Pass the .mo-cflags along to member objects > + $(if $($o-cflags), > + $(foreach p,$($o-objs), > + $(eval $p-cflags :=3D $($o-cflags))))) > + $(shell mkdir -p ./ $(sort $(dir $($v)))) > + # Include all the .d files > + $(eval -include $(addsuffix *.d, $(sort $(dir $($v))))) > + $(eval $v :=3D $(filter-out %/,$($v)))) > endef >