From: Paolo Bonzini <pbonzini@redhat.com>
To: Fam Zheng <famz@redhat.com>
Cc: peter.maydell@linaro.org, mjt@tls.msk.ru, qemu-devel@nongnu.org,
stefanha@redhat.com, vilanova@ac.upc.edu, rth@twiddle.net
Subject: Re: [Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO
Date: Tue, 10 Sep 2013 15:44:56 +0200 [thread overview]
Message-ID: <522F2258.2090705@redhat.com> (raw)
In-Reply-To: <1378818985-12584-4-git-send-email-famz@redhat.com>
Il 10/09/2013 15:16, Fam Zheng ha scritto:
> Add necessary rules and flags for shared object generation.
> $(common-obj-m) will include $(block-obj-m), like $(common-obj-y) does
> for $(block-obj-y). The new rules introduced here are:
>
> 0) For all %.so compiling:
>
> QEMU_CFLAGS += -fPIC
>
> 1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so.
>
> 2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern
> matching in Makefile. It's linked to "-shared" with all its dependencies
> (multiple *.o) as input. Which means the list of depended objects must
> be ruled out in each sub-Makefile.objs with:
>
> $(obj)/foo.mo : $(addprefix $(obj)/, bar.o baz.o qux.o)
>
> With target and dependencies both prefixed with $(obj)/.
Just curious why you abandoned the foo.mo-objs idea. But anyway it can
be implemented on top, together with "dirs".
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> Makefile | 20 +++++++++++++++++++-
> Makefile.objs | 2 ++
> configure | 6 ++++++
> rules.mak | 26 +++++++++++++++++++-------
> 4 files changed, 46 insertions(+), 8 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 9e603c6..3685bbd 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -125,7 +125,9 @@ dummy := $(call unnest-vars,, \
> util-obj-y \
> qga-obj-y \
> block-obj-y \
> - common-obj-y)
> + block-obj-m \
> + common-obj-y \
> + common-obj-m)
Do block-obj-m and common-obj-m need to be expanded in Makefile.target too?
Perhaps unnest-vars should automatically handle both -y and -m variants;
possibly even call add-modules. Even though it would be unused in
Makefile.target, it would keep all the logic in one place in rules.mak.
> ifneq ($(wildcard config-host.mak),)
> include $(SRC_PATH)/tests/Makefile
> @@ -133,6 +135,18 @@ endif
>
> all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
>
> +define add-modules
> +$(foreach o,$(filter %.o,$($1)),$(eval \
> + $(patsubst %.o,%.mo,$o): $o))
> +$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
> +endef
> +
> +dummy := $(call add-modules,block-obj-m)
> +dummy := $(call add-modules,common-obj-m)
> +
> +modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))
> +all: modules
> +
> vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
>
> vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
> @@ -249,6 +263,10 @@ clean:
> rm -f qemu-options.def
> find . -name '*.[oda]' -type f -exec rm -f {} +
> find . -name '*.l[oa]' -type f -exec rm -f {} +
> + find . -name '*.so' -type f -exec rm -f {} +
> + find . -name '*.mo' -type f -exec rm -f {} +
> + find . -name '*.dll' -type f -exec rm -f {} +
> +
> rm -f $(TOOLS) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
> rm -Rf .libs
> rm -f qemu-img-cmds.h
> diff --git a/Makefile.objs b/Makefile.objs
> index 4f7a364..023166b 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -19,6 +19,8 @@ block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o
> block-obj-y += qemu-coroutine-sleep.o
> block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
>
> +block-obj-m = block/
> +
> ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
> # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
> # only pull in the actual virtio-9p device if we also enabled virtio.
> diff --git a/configure b/configure
> index cc3cd4d..c6d4a62 100755
> --- a/configure
> +++ b/configure
> @@ -190,6 +190,8 @@ mingw32="no"
> gcov="no"
> gcov_tool="gcov"
> EXESUF=""
> +DSOSUF=".so"
> +LDFLAGS_SHARED="-shared"
> prefix="/usr/local"
> mandir="\${prefix}/share/man"
> datadir="\${prefix}/share"
> @@ -485,6 +487,7 @@ OpenBSD)
> Darwin)
> bsd="yes"
> darwin="yes"
> + LDFLAGS_SHARED="-bundle"
> if [ "$cpu" = "x86_64" ] ; then
> QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
> LDFLAGS="-arch x86_64 $LDFLAGS"
> @@ -584,6 +587,7 @@ fi
>
> if test "$mingw32" = "yes" ; then
> EXESUF=".exe"
> + DSOSUF=".dll"
> QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
> # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
> QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
> @@ -4175,6 +4179,8 @@ echo "LIBTOOLFLAGS=$LIBTOOLFLAGS" >> $config_host_mak
> echo "LIBS+=$LIBS" >> $config_host_mak
> echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
> echo "EXESUF=$EXESUF" >> $config_host_mak
> +echo "DSOSUF=$DSOSUF" >> $config_host_mak
> +echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
> echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
> echo "POD2MAN=$POD2MAN" >> $config_host_mak
> echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
> diff --git a/rules.mak b/rules.mak
> index 6342d60..2be7901 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -18,6 +18,10 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
> QEMU_INCLUDES += -I$(<D) -I$(@D)
>
> extract-libs = $(strip $(foreach o,$1,$($o-libs)))
> +expand-objs = $(strip $(sort $(filter %.o,$1)) \
> + $(if $(realpath $(filter %.mo,$1)), \
> + $(shell cat $(realpath $(filter %.mo,$1)))) \
Why test realpath?
> + $(filter-out %.o %.mo,$1))
>
> %.o: %.c
> $(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<," CC $(TARGET_DIR)$@")
> @@ -26,8 +30,8 @@ extract-libs = $(strip $(foreach o,$1,$($o-libs)))
>
> ifeq ($(LIBTOOL),)
> LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
> - $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
> - $(call extract-libs,$^) $(LIBS)," LINK $(TARGET_DIR)$@")
> + $(call expand-objs $1) $(version-obj-y) \
> + $(call extract-libs,$1) $(LIBS)," LINK $(TARGET_DIR)$@")
> else
> LIBTOOL += $(if $(V),,--quiet)
> %.lo: %.c
> @@ -38,12 +42,12 @@ LIBTOOL += $(if $(V),,--quiet)
> $(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC dtrace -o $@ -G -s $<, " lt GEN $(TARGET_DIR)$@")
>
> LINK = $(call quiet-command,\
> - $(if $(filter %.lo %.la,$^),$(LIBTOOL) --mode=link --tag=CC \
> + $(if $(filter %.lo %.la,$1),$(LIBTOOL) --mode=link --tag=CC \
> )$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
> - $(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
> - $(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
> - $(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
> - $(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
> + $(call expand-objs,$1) \
> + $(if $(filter %.lo %.la,$1),$(version-lobj-y),$(version-obj-y)) \
> + $(if $(filter %.lo %.la,$1),$(LIBTOOLFLAGS)) \
> + $(call extract-libs,$1) $(LIBS),$(if $(filter %.lo %.la,$1),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
> endif
>
> %.asm: %.S
> @@ -58,6 +62,14 @@ endif
> %.o: %.dtrace
> $(call quiet-command,dtrace -o $@ -G -s $<, " GEN $(TARGET_DIR)$@")
>
> +%$(DSOSUF): QEMU_CFLAGS += -fPIC
> +%$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
> +%$(DSOSUF): %.mo
> + $(call LINK,$^)
> +
> +%.mo:
> + $(call quiet-command,echo $(sort $^) > $@," GEN $(TARGET_DIR)$@")
> +
> %$(EXESUF): %.o
> $(call LINK,$^)
Personally I find this easier to read, but I'm obviously biased.
Thanks,
Paolo
next prev parent reply other threads:[~2013-09-10 13:45 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-10 13:16 [Qemu-devel] [RFC PATCH v4 0/6] Shared Library Module Support Fam Zheng
2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 1/6] make.rule: fix $(obj) to a real relative path Fam Zheng
2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 2/6] rule.mak: allow per object cflags and libs Fam Zheng
2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO Fam Zheng
2013-09-10 13:44 ` Paolo Bonzini [this message]
2013-09-11 1:14 ` Fam Zheng
2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 4/6] module: implement module loading function Fam Zheng
2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 5/6] configure: introduce --enable-modules Fam Zheng
2013-09-10 13:42 ` Paolo Bonzini
2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 6/6] block: build qed and curl as shared library Fam Zheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=522F2258.2090705@redhat.com \
--to=pbonzini@redhat.com \
--cc=famz@redhat.com \
--cc=mjt@tls.msk.ru \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=stefanha@redhat.com \
--cc=vilanova@ac.upc.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.