qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [RFC PATCH v4 0/6] Shared Library Module Support
@ 2013-09-10 13:16 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
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Fam Zheng @ 2013-09-10 13:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth

This series implements feature of shared object building as described in:

http://wiki.qemu.org/Features/Modules

It's achieved in three steps, with extra bonus to change curl and qed to shared
library modules in the end (only to demonstrate the usage, no "make install"
support of .so files yet).

v4: Added --enable-modules in the end of series.
    Make nested-vars and obj-base as arguemnts to unnest-vars.
    Take Paolo's idea in comments for v2 and switch back module objects syntax
    to:
        $(obj)/foo.mo : $(addprefix $(obj)/, bar.o biz.o qux.o)

    because this needs less duplication among Makefiles.

Fam Zheng (6):
  make.rule: fix $(obj) to a real relative path
  rule.mak: allow per object cflags and libs
  Makefile: introduce common-obj-m and block-obj-m for DSO
  module: implement module loading function
  configure: introduce --enable-modules
  block: build qed and curl as shared library

 Makefile              | 42 +++++++++++++++++++++++++++++++++++++++-
 Makefile.objs         | 18 +++--------------
 Makefile.target       | 16 +++++++++++++---
 block.c               |  1 +
 block/Makefile.objs   |  7 ++++---
 bsd-user/main.c       |  3 +++
 configure             | 40 +++++++++++++++++++++++++++-----------
 include/qemu/module.h |  9 +++++++++
 linux-user/main.c     |  3 +++
 rules.mak             | 53 ++++++++++++++++++++++++++++++++++++++-------------
 scripts/create_config |  4 ++++
 tests/Makefile        |  2 ++
 util/module.c         | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
 vl.c                  |  2 ++
 14 files changed, 207 insertions(+), 46 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Qemu-devel] [RFC PATCH v4 1/6] make.rule: fix $(obj) to a real relative path
  2013-09-10 13:16 [Qemu-devel] [RFC PATCH v4 0/6] Shared Library Module Support Fam Zheng
@ 2013-09-10 13:16 ` Fam Zheng
  2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 2/6] rule.mak: allow per object cflags and libs Fam Zheng
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Fam Zheng @ 2013-09-10 13:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth

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 | 16 +++++++++++++---
 configure       |  1 +
 rules.mak       | 12 +++++++-----
 tests/Makefile  |  2 ++
 6 files changed, 39 insertions(+), 24 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..1d92523 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -143,13 +143,23 @@ 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)
-all-obj-y += $(addprefix ../, $(common-obj-y))
+all-obj-y += $(addprefix ../, $(common-obj-y) $(block-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..c08b356 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,6 +135,9 @@ $(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))))))
diff --git a/tests/Makefile b/tests/Makefile
index baba9e9..1b4048c 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -110,6 +110,8 @@ test-qapi-obj-y = tests/test-qapi-visit.o tests/test-qapi-types.o
 $(test-obj-y): QEMU_INCLUDES += -Itests
 QEMU_CFLAGS += -I$(SRC_PATH)/tests
 
+dummy := $(call unnest-vars,..,block-obj-y)
+
 tests/test-x86-cpuid.o: QEMU_INCLUDES += -I$(SRC_PATH)/target-i386
 
 tests/check-qint$(EXESUF): tests/check-qint.o libqemuutil.a
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [RFC PATCH v4 2/6] rule.mak: allow per object cflags and libs
  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 ` 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
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Fam Zheng @ 2013-09-10 13:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth

Adds extract-libs in LINK to expand any "per object libs", the syntax to define
such a libs options is like:

        foo.o-libs := $(CURL_LIBS)

in block/Makefile.objs.

Similarly,

        foo.o-cflags := $(FOO_CFLAGS)

is also supported.

"foo.o" must be listed a nested var (e.g. common-obj-y) to make the
option variables effective.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 rules.mak | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/rules.mak b/rules.mak
index c08b356..6342d60 100644
--- a/rules.mak
+++ b/rules.mak
@@ -17,15 +17,17 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
 # Same as -I$(SRC_PATH) -I., but for the nested source/object directories
 QEMU_INCLUDES += -I$(<D) -I$(@D)
 
+extract-libs = $(strip $(foreach o,$1,$($o-libs)))
+
 %.o: %.c
-	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
+	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
 %.o: %.rc
 	$(call quiet-command,$(WINDRES) -I. -o $@ $<,"  RC    $(TARGET_DIR)$@")
 
 ifeq ($(LIBTOOL),)
 LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
        $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
-       $(LIBS),"  LINK  $(TARGET_DIR)$@")
+       $(call extract-libs,$^) $(LIBS),"  LINK  $(TARGET_DIR)$@")
 else
 LIBTOOL += $(if $(V),,--quiet)
 %.lo: %.c
@@ -41,7 +43,7 @@ LINK = $(call quiet-command,\
        $(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
        $(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
        $(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
-       $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", "  LINK  ")"$(TARGET_DIR)$@")
+       $(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", "  LINK  ")"$(TARGET_DIR)$@")
 endif
 
 %.asm: %.S
@@ -114,11 +116,22 @@ $(eval $1 = $(value save-$2-$1) $$(subdir-$2-$1))
 $(eval save-$2-$1 :=)
 endef
 
+define fix-obj-vars
+$(foreach v,$($1), \
+	$(if $($v-cflags), \
+		$(eval $2$v-cflags := $($v-cflags)) \
+		$(eval $v-cflags := )) \
+	$(if $($v-libs), \
+		$(eval $2$v-libs := $($v-libs)) \
+		$(eval $v-libs := )))
+endef
+
 define unnest-dir
 $(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
 $(eval obj-parent-$1 := $(obj))
 $(eval obj := $(if $(obj),$(obj)/$1,$1))
 $(eval include $(SRC_PATH)/$1/Makefile.objs)
+$(foreach v,$(nested-vars),$(call fix-obj-vars,$v,$(if $(obj),$(obj)/)))
 $(eval obj := $(obj-parent-$1))
 $(eval obj-parent-$1 := )
 $(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO
  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 ` Fam Zheng
  2013-09-10 13:44   ` Paolo Bonzini
  2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 4/6] module: implement module loading function Fam Zheng
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Fam Zheng @ 2013-09-10 13:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth

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)/.

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)
 
 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)))) \
+			  $(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,$^)
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [RFC PATCH v4 4/6] module: implement module loading function
  2013-09-10 13:16 [Qemu-devel] [RFC PATCH v4 0/6] Shared Library Module Support Fam Zheng
                   ` (2 preceding siblings ...)
  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:16 ` Fam Zheng
  2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 5/6] configure: introduce --enable-modules Fam Zheng
  2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 6/6] block: build qed and curl as shared library Fam Zheng
  5 siblings, 0 replies; 10+ messages in thread
From: Fam Zheng @ 2013-09-10 13:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth

Added three types of modules:

    typedef enum {
        MODULE_LOAD_BLOCK = 0,
        MODULE_LOAD_UI,
        MODULE_LOAD_NET,
        MODULE_LOAD_MAX,
    } module_load_type;

and their loading function:

    void module_load(module_load_type).

which loads all ".so" files in a subdir under "${PREFIX}/qemu/", e.g.
"/usr/lib/qemu/block". Modules of each type should be loaded before
respective subsystem initialization code.

Requires gmodule-2.0 from glib.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 block.c               |  1 +
 bsd-user/main.c       |  3 +++
 configure             | 22 ++++++++++++---------
 include/qemu/module.h |  9 +++++++++
 linux-user/main.c     |  3 +++
 scripts/create_config |  4 ++++
 util/module.c         | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
 vl.c                  |  2 ++
 8 files changed, 88 insertions(+), 9 deletions(-)

diff --git a/block.c b/block.c
index 26639e8..16ceaaf 100644
--- a/block.c
+++ b/block.c
@@ -4008,6 +4008,7 @@ BlockDriverAIOCB *bdrv_aio_discard(BlockDriverState *bs,
 
 void bdrv_init(void)
 {
+    module_load(MODULE_LOAD_BLOCK);
     module_call_init(MODULE_INIT_BLOCK);
 }
 
diff --git a/bsd-user/main.c b/bsd-user/main.c
index f9246aa..6cb9e35 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -33,6 +33,7 @@
 #include "tcg.h"
 #include "qemu/timer.h"
 #include "qemu/envlist.h"
+#include "qemu/module.h"
 
 int singlestep;
 #if defined(CONFIG_USE_GUEST_BASE)
@@ -749,6 +750,8 @@ int main(int argc, char **argv)
     if (argc <= 1)
         usage();
 
+    module_load(MODULE_LOAD_UI);
+    module_load(MODULE_LOAD_NET);
     module_call_init(MODULE_INIT_QOM);
 
     if ((envlist = envlist_create()) == NULL) {
diff --git a/configure b/configure
index c6d4a62..a2858c2 100755
--- a/configure
+++ b/configure
@@ -2252,15 +2252,19 @@ if test "$mingw32" = yes; then
 else
     glib_req_ver=2.12
 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
-    error_exit "glib-$glib_req_ver required to compile QEMU"
-fi
+
+for i in gthread-2.0 gmodule-2.0; do
+    if $pkg_config --atleast-version=$glib_req_ver $i; then
+        glib_cflags=`$pkg_config --cflags $i`
+        glib_libs=`$pkg_config --libs $i`
+        CFLAGS="$glib_cflags $CFLAGS"
+        LIBS="$glib_libs $LIBS"
+        libs_qga="$glib_libs $libs_qga"
+    else
+        error_exit "glib-$glib_req_ver required to compile QEMU"
+    fi
+done
+
 
 ##########################################
 # pixman support probe
diff --git a/include/qemu/module.h b/include/qemu/module.h
index c4ccd57..f00bc25 100644
--- a/include/qemu/module.h
+++ b/include/qemu/module.h
@@ -37,4 +37,13 @@ void register_module_init(void (*fn)(void), module_init_type type);
 
 void module_call_init(module_init_type type);
 
+typedef enum {
+    MODULE_LOAD_BLOCK = 0,
+    MODULE_LOAD_UI,
+    MODULE_LOAD_NET,
+    MODULE_LOAD_MAX,
+} module_load_type;
+
+void module_load(module_load_type type);
+
 #endif
diff --git a/linux-user/main.c b/linux-user/main.c
index 5c2f7b2..db08c23 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -34,6 +34,7 @@
 #include "qemu/timer.h"
 #include "qemu/envlist.h"
 #include "elf.h"
+#include <qemu/module.h>
 
 char *exec_path;
 
@@ -3551,6 +3552,8 @@ int main(int argc, char **argv, char **envp)
     int i;
     int ret;
 
+    module_load(MODULE_LOAD_UI);
+    module_load(MODULE_LOAD_NET);
     module_call_init(MODULE_INIT_QOM);
 
     qemu_cache_utils_init(envp);
diff --git a/scripts/create_config b/scripts/create_config
index b1adbf5..7a54f2d 100755
--- a/scripts/create_config
+++ b/scripts/create_config
@@ -25,6 +25,7 @@ case $line in
  prefix=*)
     # save for the next definitions
     prefix=${line#*=}
+    echo "#define CONFIG_PREFIX \"$prefix\""
     ;;
  CONFIG_AUDIO_DRIVERS=*)
     drivers=${line#*=}
@@ -104,6 +105,9 @@ case $line in
     value=${line#*=}
     echo "#define $name $value"
     ;;
+ DSOSUF=*)
+    echo "#define HOST_DSOSUF \"${line#*=}\""
+    ;;
 esac
 
 done # read
diff --git a/util/module.c b/util/module.c
index 7acc33d..ef75f8e 100644
--- a/util/module.c
+++ b/util/module.c
@@ -13,6 +13,8 @@
  * GNU GPL, version 2 or (at your option) any later version.
  */
 
+#include <gmodule.h>
+#include <dirent.h>
 #include "qemu-common.h"
 #include "qemu/queue.h"
 #include "qemu/module.h"
@@ -79,3 +81,54 @@ void module_call_init(module_init_type type)
         e->init();
     }
 }
+
+void module_load(module_load_type type)
+{
+    const char *path;
+    const char *dsosuf = HOST_DSOSUF;
+    char *fname;
+    int suf_len = strlen(dsosuf);
+    DIR *dp;
+    struct dirent *ep = NULL;
+    GModule *g_module;
+
+    if (!g_module_supported()) {
+        return;
+    }
+
+    switch (type) {
+    case MODULE_LOAD_BLOCK:
+        path = CONFIG_PREFIX "/qemu/block/";
+        break;
+    case MODULE_LOAD_UI:
+        path = CONFIG_PREFIX "/qemu/ui/";
+        break;
+    case MODULE_LOAD_NET:
+        path = CONFIG_PREFIX "/qemu/net/";
+        break;
+    default:
+        return;
+    }
+
+    dp = opendir(path);
+    if (!dp) {
+        fprintf(stderr, "Failed to open dir %s\n", path);
+        return;
+    }
+    for (ep = readdir(dp); ep; ep = readdir(dp)) {
+        int len = strlen(ep->d_name);
+        if (len > suf_len &&
+                !strcmp(&ep->d_name[len - suf_len], dsosuf)) {
+            fname = g_strdup_printf("%s%s", path, ep->d_name);
+            g_module = g_module_open(fname,
+                                     G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+            if (!g_module) {
+                fprintf(stderr, "Failed to open module file %s\n",
+                        g_module_error());
+                g_free(fname);
+                continue;
+            }
+            g_free(fname);
+        }
+    }
+}
diff --git a/vl.c b/vl.c
index b4b119a..659e53a 100644
--- a/vl.c
+++ b/vl.c
@@ -2940,6 +2940,8 @@ int main(int argc, char **argv, char **envp)
 #endif
     }
 
+    module_load(MODULE_LOAD_UI);
+    module_load(MODULE_LOAD_NET);
     module_call_init(MODULE_INIT_QOM);
 
     qemu_add_opts(&qemu_drive_opts);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [RFC PATCH v4 5/6] configure: introduce --enable-modules
  2013-09-10 13:16 [Qemu-devel] [RFC PATCH v4 0/6] Shared Library Module Support Fam Zheng
                   ` (3 preceding siblings ...)
  2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 4/6] module: implement module loading function Fam Zheng
@ 2013-09-10 13:16 ` 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
  5 siblings, 1 reply; 10+ messages in thread
From: Fam Zheng @ 2013-09-10 13:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth

The new option will enable support of shared object build. Otherwise
objects are static linked to executables.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile  | 8 ++++++++
 configure | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/Makefile b/Makefile
index 3685bbd..5a2c6f2 100644
--- a/Makefile
+++ b/Makefile
@@ -135,6 +135,7 @@ endif
 
 all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
 
+ifeq ($(CONFIG_MODULES),y)
 define add-modules
 $(foreach o,$(filter %.o,$($1)),$(eval \
 	$(patsubst %.o,%.mo,$o): $o))
@@ -146,6 +147,13 @@ dummy := $(call add-modules,common-obj-m)
 
 modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))
 all: modules
+else
+block-obj-y += $(block-obj-m)
+common-obj-y += $(common-obj-m)
+block-obj-m :=
+common-obj-m :=
+endif
+
 
 vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
 
diff --git a/configure b/configure
index a2858c2..f1d7fa7 100755
--- a/configure
+++ b/configure
@@ -192,6 +192,7 @@ gcov_tool="gcov"
 EXESUF=""
 DSOSUF=".so"
 LDFLAGS_SHARED="-shared"
+modules="no"
 prefix="/usr/local"
 mandir="\${prefix}/share/man"
 datadir="\${prefix}/share"
@@ -650,6 +651,8 @@ for opt do
   ;;
   --disable-debug-info)
   ;;
+  --enable-modules) modules="yes"
+  ;;
   --cpu=*)
   ;;
   --target-list=*) target_list="$optarg"
@@ -1052,6 +1055,7 @@ echo "  --libdir=PATH            install libraries in PATH"
 echo "  --sysconfdir=PATH        install config in PATH$confsuffix"
 echo "  --localstatedir=PATH     install local state in PATH (set at runtime on win32)"
 echo "  --with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]"
+echo "  --enable-modules         enable modules support"
 echo "  --enable-debug-tcg       enable TCG debugging"
 echo "  --disable-debug-tcg      disable TCG debugging (default)"
 echo "  --enable-debug-info       enable debugging information (default)"
@@ -3580,6 +3584,7 @@ echo "python            $python"
 if test "$slirp" = "yes" ; then
     echo "smbd              $smbd"
 fi
+echo "module support    $modules"
 echo "host CPU          $cpu"
 echo "host big endian   $bigendian"
 echo "target list       $target_list"
@@ -3697,6 +3702,9 @@ echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
 
 echo "ARCH=$ARCH" >> $config_host_mak
 
+if test "$modules" = "yes"; then
+  echo "CONFIG_MODULES=y" >> $config_host_mak
+fi
 case "$cpu" in
   arm|i386|x86_64|x32|ppc|aarch64)
     # The TCG interpreter currently does not support ld/st optimization.
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [RFC PATCH v4 6/6] block: build qed and curl as shared library
  2013-09-10 13:16 [Qemu-devel] [RFC PATCH v4 0/6] Shared Library Module Support Fam Zheng
                   ` (4 preceding siblings ...)
  2013-09-10 13:16 ` [Qemu-devel] [RFC PATCH v4 5/6] configure: introduce --enable-modules Fam Zheng
@ 2013-09-10 13:16 ` Fam Zheng
  5 siblings, 0 replies; 10+ messages in thread
From: Fam Zheng @ 2013-09-10 13:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth

Curl and qed block drivers are built as shared object module.  We have
per object cflags and libs support now, move CURL_CFLAGS and CURL_LIBS
from global option variables to a per object basis.

"make install" is not installing them yet, manually copy it to
${prefix}/qemu/block/ to make it loaded.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 block/Makefile.objs | 7 ++++---
 configure           | 5 ++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/block/Makefile.objs b/block/Makefile.objs
index 3bb85b5..1b23b88 100644
--- a/block/Makefile.objs
+++ b/block/Makefile.objs
@@ -1,7 +1,6 @@
 block-obj-y += raw_bsd.o cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
 block-obj-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o qcow2-cache.o
-block-obj-y += qed.o qed-gencb.o qed-l2-cache.o qed-table.o qed-cluster.o
-block-obj-y += qed-check.o
+block-obj-m += qed.mo
 block-obj-y += vhdx.o
 block-obj-y += parallels.o blkdebug.o blkverify.o
 block-obj-y += snapshot.o qapi.o
@@ -23,4 +22,6 @@ common-obj-y += commit.o
 common-obj-y += mirror.o
 common-obj-y += backup.o
 
-$(obj)/curl.o: QEMU_CFLAGS+=$(CURL_CFLAGS)
+curl.o-cflags := $(CURL_CFLAGS)
+curl.o-libs := $(CURL_LIBS)
+$(obj)/qed.mo : $(addprefix $(obj)/, qed.o qed-gencb.o qed-l2-cache.o qed-table.o qed-cluster.o qed-check.o)
diff --git a/configure b/configure
index f1d7fa7..f8be093 100755
--- a/configure
+++ b/configure
@@ -2217,8 +2217,6 @@ EOF
   curl_libs=`$curlconfig --libs 2>/dev/null`
   if compile_prog "$curl_cflags" "$curl_libs" ; then
     curl=yes
-    libs_tools="$curl_libs $libs_tools"
-    libs_softmmu="$curl_libs $libs_softmmu"
   else
     if test "$curl" = "yes" ; then
       feature_not_found "curl"
@@ -3901,8 +3899,9 @@ if test "$bswap_h" = "yes" ; then
   echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
 fi
 if test "$curl" = "yes" ; then
-  echo "CONFIG_CURL=y" >> $config_host_mak
+  echo "CONFIG_CURL=m" >> $config_host_mak
   echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
+  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
 fi
 if test "$brlapi" = "yes" ; then
   echo "CONFIG_BRLAPI=y" >> $config_host_mak
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [RFC PATCH v4 5/6] configure: introduce --enable-modules
  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
  0 siblings, 0 replies; 10+ messages in thread
From: Paolo Bonzini @ 2013-09-10 13:42 UTC (permalink / raw)
  To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth

Il 10/09/2013 15:16, Fam Zheng ha scritto:
> +ifeq ($(CONFIG_MODULES),y)
>  define add-modules
>  $(foreach o,$(filter %.o,$($1)),$(eval \
>  	$(patsubst %.o,%.mo,$o): $o))
> @@ -146,6 +147,13 @@ dummy := $(call add-modules,common-obj-m)
>  
>  modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))
>  all: modules
> +else
> +block-obj-y += $(block-obj-m)
> +common-obj-y += $(common-obj-m)
> +block-obj-m :=
> +common-obj-m :=
> +endif
> +

Should this be done in unnest-vars instead?

Paolo

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO
  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
  2013-09-11  1:14     ` Fam Zheng
  0 siblings, 1 reply; 10+ messages in thread
From: Paolo Bonzini @ 2013-09-10 13:44 UTC (permalink / raw)
  To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth

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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO
  2013-09-10 13:44   ` Paolo Bonzini
@ 2013-09-11  1:14     ` Fam Zheng
  0 siblings, 0 replies; 10+ messages in thread
From: Fam Zheng @ 2013-09-11  1:14 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth

On Tue, 09/10 15:44, Paolo Bonzini wrote:
> 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".
> 

Good point! I thought they were exclusive ideas, but you are right we can still
generate the above rule with foo.mo-objs. I don't mind doing it in another
revision of this patch at all. Thanks!

> > 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?
> 

Yes, they are the only variable that tracks qed.mo and curl.o now.

> 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.
> 

Good idea. I'll do it.

> >  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?
> 

We don't want $(shell cat $(filter %.mo,$1)) be expanded to $(shell cat ), cat
is so smart that starts reading stdin.

Might save some typing by:

    $(shell cat /dev/null $(filter %.mo,$1))


Thanks,

Fam

> > +			  $(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
> 
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-09-11  1:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).