qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support
@ 2013-10-16  3:26 Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
                   ` (9 more replies)
  0 siblings, 10 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, pbonzini,
	vilanova, rth

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

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

The main idea behind modules is to isolate dependencies on third party
libraries from qemu executables, such as libglusterfs or librbd, so that the
end users can install core qemu package with fewer dependencies.  And only for
those who want to use particular modules, need they install qemu-foo
sub-package, which in turn requires libbar and libbiz packages.

It's implemented in three steps:

1. The first patches fix current build system to correctly handle nested
   variables and object specific options:

    [01/08] ui/Makefile.objs: delete unnecessary cocoa.o dependency
    [02/08] make.rule: fix $(obj) to a real relative path
    [03/08] rule.mak: allow per object cflags and libs

2. The Makefile changes adds necessary options and rules to build DSO objects:

    [04/08] build-sys: introduce common-obj-m and block-obj-m for DSO

3. The next patch adds code to load modules from installed directory:

    [05/08] module: implement module loading

A few more changes are following to complete it:

    [06/08] Makefile: install modules with "make install"
    [07/08] .gitignore: ignore module related files (dll, so, mo)

In the end of series, the block drivers are converted:

    [08/08] block: convert block drivers linked with libs to modules

v14: Fix alpha-linux-user compiling by:
     a) Add object specific libs to qcow.o and linux-aio.o.
     b) Only link block-obj-m to softmmu targets.
     (Thanks Paolo)

v13: Drop --moddir option in configure. (Paolo)

v12: Rebase to current master, no conflict.
     Drop "-Wl,--enable-new-tags -Wl,-rpath,'$$ORIGIN'". (Paolo)

v11:
    [04] Link DSO with  -Wl,--enable-new-dtags -Wl,-rpath,'$$ORIGIN' (Richard)
    [05] Reuse module_init_type in module_load, no separate load type enums.
         Separate list of modules by type. It's simply list of built modules
         now. No whitelist option in configure.
         Support multiple module_init() in single module.

v10:
    All modules in a single directory (moddir), with module type prefixed:
        /usr/lib/qemu/block-{curl,iscsi,...}.so
    The module names for user to list in module whitelist is consequently:
        block-curl, block-iscsi, ui-*, etc.
    In Makfile, the installed module filename is simply generated by:
        $(subst /,-,%.so)
    Which is also the rule for module names.

    [05] Add #undef CONFIG_MODULE_WHITELIST in config-host.h.
         Use static array for whitelist. (Richard)

Fam Zheng (7):
  make.rule: fix $(obj) to a real relative path
  rule.mak: allow per object cflags and libs
  build-sys: introduce common-obj-m and block-obj-m for DSO
  module: implement module loading
  Makefile: install modules with "make install"
  .gitignore: ignore module related files (dll, so, mo)
  block: convert block drivers linked with libs to modules

Peter Maydell (1):
  ui/Makefile.objs: delete unnecessary cocoa.o dependency

 .gitignore            |   3 ++
 Makefile              |  30 +++++++++++++-
 Makefile.objs         |  19 ++-------
 Makefile.target       |  24 +++++++++--
 block/Makefile.objs   |  13 +++++-
 configure             |  81 ++++++++++++++++++++++++++------------
 include/qemu/module.h |  12 ++++++
 module-common.c       |  10 +++++
 rules.mak             |  80 +++++++++++++++++++++++++++++++------
 scripts/create_config |  14 +++++++
 ui/Makefile.objs      |   2 -
 util/module.c         | 107 +++++++++++++++++++++++++++++++++++++++++++++++++-
 12 files changed, 330 insertions(+), 65 deletions(-)
 create mode 100644 module-common.c

-- 
1.8.3.1

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

* [Qemu-devel] [PATCH v14 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path Fam Zheng
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, pbonzini,
	vilanova, rth

From: Peter Maydell <peter.maydell@linaro.org>

Delete an unnecessary dependency for cocoa.o; we already have
a general rule that tells Make that we can build a .o file
from a .m source using an ObjC compiler, so this specific
rule is unnecessary. Further, it is using the dubious construct
"$(SRC_PATH)/$(obj)" to get at the source directory, which will
break when $(obj) is redefined as part of the preparation for
per-object library support.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 ui/Makefile.objs | 2 --
 1 file changed, 2 deletions(-)

diff --git a/ui/Makefile.objs b/ui/Makefile.objs
index 6ddc0de..f33be47 100644
--- a/ui/Makefile.objs
+++ b/ui/Makefile.objs
@@ -17,6 +17,4 @@ common-obj-$(CONFIG_GTK) += gtk.o x_keymap.o
 
 $(obj)/sdl.o $(obj)/sdl_zoom.o: QEMU_CFLAGS += $(SDL_CFLAGS) 
 
-$(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m
-
 $(obj)/gtk.o: QEMU_CFLAGS += $(GTK_CFLAGS) $(VTE_CFLAGS)
-- 
1.8.3.1

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

* [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-17 14:57   ` Paolo Bonzini
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 3/8] rule.mak: allow per object cflags and libs Fam Zheng
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, 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        | 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
 
 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 \
-- 
1.8.3.1

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

* [Qemu-devel] [PATCH v14 3/8] rule.mak: allow per object cflags and libs
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO Fam Zheng
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, 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 01e552e..e732261 100644
--- a/rules.mak
+++ b/rules.mak
@@ -21,15 +21,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
@@ -45,7 +47,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
@@ -121,11 +123,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] 16+ messages in thread

* [Qemu-devel] [PATCH v14 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
                   ` (2 preceding siblings ...)
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 3/8] rule.mak: allow per object cflags and libs Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 5/8] module: implement module loading Fam Zheng
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, 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 specified in each sub-Makefile.objs:

    foo.mo-objs := bar.o baz.o qux.o

in the same style with foo.o-cflags and foo.o-libs. The objects here
will be prefixed with "$(obj)/" if it's a subdirectory Makefile.objs.

Also introduce --enable-modules in configure, the option will enable
support of shared object build. Otherwise objects are static linked to
executables.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile        |  9 +++++++--
 Makefile.objs   |  2 ++
 Makefile.target |  6 +++++-
 configure       | 22 ++++++++++++++++++++++
 rules.mak       | 54 +++++++++++++++++++++++++++++++++++++++++++++---------
 5 files changed, 81 insertions(+), 12 deletions(-)

diff --git a/Makefile b/Makefile
index 94dae51..557a219 100644
--- a/Makefile
+++ b/Makefile
@@ -122,7 +122,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
@@ -131,7 +133,7 @@ ifeq ($(CONFIG_SMARTCARD_NSS),y)
 include $(SRC_PATH)/libcacard/Makefile
 endif
 
-all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
+all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules
 
 vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
 
@@ -249,6 +251,9 @@ 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 $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
 	rm -f fsdev/*.pod
 	rm -rf .libs */.libs
diff --git a/Makefile.objs b/Makefile.objs
index 91235a6..072d2e5 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/Makefile.target b/Makefile.target
index fb3a970..bc57f47 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -152,7 +152,11 @@ 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)
+dummy := $(call unnest-vars,.., \
+               block-obj-y \
+               block-obj-m \
+               common-obj-y \
+               common-obj-m)
 
 # Now restore obj-y
 obj-y := $(obj-y-save)
diff --git a/configure b/configure
index 3381264..ba0502d 100755
--- a/configure
+++ b/configure
@@ -190,6 +190,9 @@ mingw32="no"
 gcov="no"
 gcov_tool="gcov"
 EXESUF=""
+DSOSUF=".so"
+LDFLAGS_SHARED="-shared"
+modules="no"
 prefix="/usr/local"
 mandir="\${prefix}/share/man"
 datadir="\${prefix}/share"
@@ -493,6 +496,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"
@@ -588,6 +592,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"
@@ -652,6 +657,8 @@ for opt do
   ;;
   --disable-debug-info)
   ;;
+  --enable-modules) modules="yes"
+  ;;
   --cpu=*)
   ;;
   --target-list=*) target_list="$optarg"
@@ -1077,6 +1084,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)"
@@ -3674,6 +3682,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"
@@ -3792,6 +3801,17 @@ 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
+  aarch64 | arm | i386 | x86_64 | x32 | ppc*)
+    # The TCG interpreter currently does not support ld/st optimization.
+    if test "$tcg_interpreter" = "no" ; then
+        echo "CONFIG_QEMU_LDST_OPTIMIZATION=y" >> $config_host_mak
+    fi
+  ;;
+esac
 if test "$debug_tcg" = "yes" ; then
   echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
 fi
@@ -4264,6 +4284,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 e732261..2ff2f16 100644
--- a/rules.mak
+++ b/rules.mak
@@ -21,7 +21,11 @@ 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)))
+extract-libs = $(strip $(sort $(foreach o,$1,$($o-libs)) \
+                  $(foreach o,$(call expand-objs,$1),$($o-libs))))
+expand-objs = $(strip $(sort $(filter %.o,$1)) \
+                  $(foreach o,$(filter %.mo,$1),$($o-objs)) \
+                  $(filter-out %.o %.mo,$1))
 
 %.o: %.c
 	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
@@ -30,8 +34,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
@@ -42,12 +46,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
@@ -65,6 +69,17 @@ endif
 %.o: %.dtrace
 	$(call quiet-command,dtrace -o $@ -G -s $<, "  GEN   $(TARGET_DIR)$@")
 
+%$(DSOSUF): QEMU_CFLAGS += -fPIC
+%$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
+%$(DSOSUF): %.mo libqemustub.a
+	$(call LINK,$^)
+
+.PHONY: modules
+modules:
+
+%.mo:
+	$(call quiet-command,touch $@,"  GEN   $(TARGET_DIR)$@")
+
 %$(EXESUF): %.o
 	$(call LINK,$^)
 
@@ -130,7 +145,10 @@ $(foreach v,$($1), \
 		$(eval $v-cflags := )) \
 	$(if $($v-libs), \
 		$(eval $2$v-libs := $($v-libs)) \
-		$(eval $v-libs := )))
+		$(eval $v-libs := )) \
+	$(if $($v-objs), \
+		$(eval $2$v-objs := $(addprefix $2,$($v-objs))) \
+		$(eval $v-objs := )))
 endef
 
 define unnest-dir
@@ -154,6 +172,15 @@ $(if $(nested-dirs),
   $(call unnest-vars-1))
 endef
 
+define add-modules
+$(foreach o,$(filter %.o,$($1)),
+	$(eval $(patsubst %.o,%.mo,$o): $o) \
+	$(eval $(patsubst %.o,%.mo,$o)-objs := $o))
+$(foreach o,$(filter %.mo,$($1)),$(eval \
+    $o: $($o-objs)))
+$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+endef
+
 define unnest-vars
 $(eval obj := $1)
 $(eval nested-vars := $2)
@@ -165,4 +192,13 @@ $(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)))))))
+$(foreach v,$(filter %-m,$(nested-vars)), \
+    $(call add-modules,$v))
+
+$(if $(CONFIG_MODULES), \
+    $(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))), \
+    $(foreach v,$(filter %-m,$(nested-vars)), \
+        $(eval $(patsubst %-m,%-y,$v) += $($v)) \
+        $(eval $v := )))
+
 endef
-- 
1.8.3.1

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

* [Qemu-devel] [PATCH v14 5/8] module: implement module loading
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
                   ` (3 preceding siblings ...)
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 6/8] Makefile: install modules with "make install" Fam Zheng
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, pbonzini,
	vilanova, rth

This patch adds loading, stamp checking and initialization of modules.

The init function of dynamic module is no longer directly called as
__attribute__((constructor)) in static linked version, it is called
only after passed the checking of presense of stamp symbol:

    qemu_stamp_$(date +%s$$$RANDOM)

With this, modules built from a different tree/version/configure will
not be loaded.

The module loading code requires gmodule-2.0.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile              |   3 ++
 configure             |  29 +++++++++-----
 include/qemu/module.h |  12 ++++++
 module-common.c       |  10 +++++
 rules.mak             |   7 ++--
 scripts/create_config |  14 +++++++
 util/module.c         | 107 +++++++++++++++++++++++++++++++++++++++++++++++++-
 7 files changed, 167 insertions(+), 15 deletions(-)
 create mode 100644 module-common.c

diff --git a/Makefile b/Makefile
index 557a219..f940080 100644
--- a/Makefile
+++ b/Makefile
@@ -196,6 +196,9 @@ Makefile: $(version-obj-y) $(version-lobj-y)
 libqemustub.a: $(stub-obj-y)
 libqemuutil.a: $(util-obj-y) qapi-types.o qapi-visit.o
 
+block-modules = $(foreach o,$(block-obj-m),"$(basename $(subst /,-,$o))",) NULL
+util/module.o-cflags = -D'CONFIG_BLOCK_MODULES=$(block-modules)'
+
 ######################################################################
 
 qemu-img.o: qemu-img-cmds.h
diff --git a/configure b/configure
index ba0502d..5b09d9d 100755
--- a/configure
+++ b/configure
@@ -199,6 +199,7 @@ datadir="\${prefix}/share"
 qemu_docdir="\${prefix}/share/doc/qemu"
 bindir="\${prefix}/bin"
 libdir="\${prefix}/lib"
+moddir="\${prefix}/lib/qemu"
 libexecdir="\${prefix}/libexec"
 includedir="\${prefix}/include"
 sysconfdir="\${prefix}/etc"
@@ -657,7 +658,8 @@ for opt do
   ;;
   --disable-debug-info)
   ;;
-  --enable-modules) modules="yes"
+  --enable-modules)
+      modules="yes"
   ;;
   --cpu=*)
   ;;
@@ -2288,15 +2290,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
@@ -3657,6 +3663,7 @@ echo "Install prefix    $prefix"
 echo "BIOS directory    `eval echo $qemu_datadir`"
 echo "binary directory  `eval echo $bindir`"
 echo "library directory `eval echo $libdir`"
+echo "module directory  `eval echo $moddir`"
 echo "libexec directory `eval echo $libexecdir`"
 echo "include directory `eval echo $includedir`"
 echo "config directory  `eval echo $sysconfdir`"
@@ -3783,6 +3790,7 @@ echo all: >> $config_host_mak
 echo "prefix=$prefix" >> $config_host_mak
 echo "bindir=$bindir" >> $config_host_mak
 echo "libdir=$libdir" >> $config_host_mak
+echo "moddir=$moddir" >> $config_host_mak
 echo "libexecdir=$libexecdir" >> $config_host_mak
 echo "includedir=$includedir" >> $config_host_mak
 echo "mandir=$mandir" >> $config_host_mak
@@ -3801,6 +3809,7 @@ echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
 
 echo "ARCH=$ARCH" >> $config_host_mak
 
+echo "CONFIG_STAMP=$(date +%s$$$RANDOM)" >> $config_host_mak
 if test "$modules" = "yes"; then
   echo "CONFIG_MODULES=y" >> $config_host_mak
 fi
diff --git a/include/qemu/module.h b/include/qemu/module.h
index c4ccd57..47b7f1d 100644
--- a/include/qemu/module.h
+++ b/include/qemu/module.h
@@ -14,11 +14,22 @@
 #ifndef QEMU_MODULE_H
 #define QEMU_MODULE_H
 
+#ifdef BUILD_DSO
+void DSO_STAMP_FUN(void);
+/* For error message, this function is an identification of qemu module */
+void qemu_module_dummy(void);
+
+#define module_init(function, type)                                         \
+static void __attribute__((constructor)) do_qemu_init_ ## function(void) {  \
+    register_dso_module_init(function, type);                               \
+}
+#else
 /* This should not be used directly.  Use block_init etc. instead.  */
 #define module_init(function, type)                                         \
 static void __attribute__((constructor)) do_qemu_init_ ## function(void) {  \
     register_module_init(function, type);                                   \
 }
+#endif
 
 typedef enum {
     MODULE_INIT_BLOCK,
@@ -34,6 +45,7 @@ typedef enum {
 #define type_init(function) module_init(function, MODULE_INIT_QOM)
 
 void register_module_init(void (*fn)(void), module_init_type type);
+void register_dso_module_init(void (*fn)(void), module_init_type type);
 
 void module_call_init(module_init_type type);
 
diff --git a/module-common.c b/module-common.c
new file mode 100644
index 0000000..50c6750
--- /dev/null
+++ b/module-common.c
@@ -0,0 +1,10 @@
+#include "config-host.h"
+#include "qemu/module.h"
+
+void qemu_module_dummy(void)
+{
+}
+
+void DSO_STAMP_FUN(void)
+{
+}
diff --git a/rules.mak b/rules.mak
index 2ff2f16..b0ccfcd 100644
--- a/rules.mak
+++ b/rules.mak
@@ -69,9 +69,9 @@ endif
 %.o: %.dtrace
 	$(call quiet-command,dtrace -o $@ -G -s $<, "  GEN   $(TARGET_DIR)$@")
 
-%$(DSOSUF): QEMU_CFLAGS += -fPIC
+%$(DSOSUF): QEMU_CFLAGS += -fPIC -DBUILD_DSO
 %$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
-%$(DSOSUF): %.mo libqemustub.a
+%$(DSOSUF): %.mo libqemustub.a module-common.o
 	$(call LINK,$^)
 
 .PHONY: modules
@@ -178,7 +178,8 @@ $(foreach o,$(filter %.o,$($1)),
 	$(eval $(patsubst %.o,%.mo,$o)-objs := $o))
 $(foreach o,$(filter %.mo,$($1)),$(eval \
     $o: $($o-objs)))
-$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+$(eval t := $(patsubst %.o,%.mo,$($1)))
+$(foreach o,$t,$(eval modules-m += $o)))
 endef
 
 define unnest-vars
diff --git a/scripts/create_config b/scripts/create_config
index b1adbf5..d7ba61d 100755
--- a/scripts/create_config
+++ b/scripts/create_config
@@ -26,6 +26,17 @@ case $line in
     # save for the next definitions
     prefix=${line#*=}
     ;;
+ moddir=*)
+    eval "moddir=\"${line#*=}\""
+    echo "#define CONFIG_MODDIR \"$moddir\""
+    ;;
+ CONFIG_STAMP=*)
+    echo "#define DSO_STAMP_FUN qemu_stamp_${line#*=}"
+    echo "#define DSO_STAMP_FUN_STR \"qemu_stamp_${line#*=}\""
+    ;;
+ CONFIG_MODULES=*)
+    echo "#define CONFIG_MODULES \"${line#*=}\""
+    ;;
  CONFIG_AUDIO_DRIVERS=*)
     drivers=${line#*=}
     echo "#define CONFIG_AUDIO_DRIVERS \\"
@@ -104,6 +115,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..c4115be 100644
--- a/util/module.c
+++ b/util/module.c
@@ -13,6 +13,7 @@
  * GNU GPL, version 2 or (at your option) any later version.
  */
 
+#include <gmodule.h>
 #include "qemu-common.h"
 #include "qemu/queue.h"
 #include "qemu/module.h"
@@ -21,13 +22,16 @@ typedef struct ModuleEntry
 {
     void (*init)(void);
     QTAILQ_ENTRY(ModuleEntry) node;
+    module_init_type type;
 } ModuleEntry;
 
 typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList;
 
 static ModuleTypeList init_type_list[MODULE_INIT_MAX];
 
-static void init_types(void)
+static ModuleTypeList dso_init_list;
+
+static void init_lists(void)
 {
     static int inited;
     int i;
@@ -40,6 +44,8 @@ static void init_types(void)
         QTAILQ_INIT(&init_type_list[i]);
     }
 
+    QTAILQ_INIT(&dso_init_list);
+
     inited = 1;
 }
 
@@ -48,7 +54,7 @@ static ModuleTypeList *find_type(module_init_type type)
 {
     ModuleTypeList *l;
 
-    init_types();
+    init_lists();
 
     l = &init_type_list[type];
 
@@ -62,20 +68,117 @@ void register_module_init(void (*fn)(void), module_init_type type)
 
     e = g_malloc0(sizeof(*e));
     e->init = fn;
+    e->type = type;
 
     l = find_type(type);
 
     QTAILQ_INSERT_TAIL(l, e, node);
 }
 
+void register_dso_module_init(void (*fn)(void), module_init_type type)
+{
+    ModuleEntry *e;
+
+    init_lists();
+
+    e = g_malloc0(sizeof(*e));
+    e->init = fn;
+    e->type = type;
+
+    QTAILQ_INSERT_TAIL(&dso_init_list, e, node);
+}
+
+static void module_load(module_init_type type);
+
 void module_call_init(module_init_type type)
 {
     ModuleTypeList *l;
     ModuleEntry *e;
 
+    module_load(type);
     l = find_type(type);
 
     QTAILQ_FOREACH(e, l, node) {
         e->init();
     }
 }
+
+#ifdef CONFIG_MODULES
+static void module_load_file(const char *fname)
+{
+    GModule *g_module;
+    void (*sym)(void);
+    const char *dsosuf = HOST_DSOSUF;
+    int len = strlen(fname);
+    int suf_len = strlen(dsosuf);
+    ModuleEntry *e, *next;
+
+    if (len <= suf_len || strcmp(&fname[len - suf_len], dsosuf)) {
+        /* wrong suffix */
+        return;
+    }
+    if (access(fname, F_OK)) {
+        return;
+    }
+
+    assert(QTAILQ_EMPTY(&dso_init_list));
+
+    g_module = g_module_open(fname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+    if (!g_module) {
+        fprintf(stderr, "Failed to load module: %s\n",
+                g_module_error());
+        return;
+    }
+    if (!g_module_symbol(g_module, DSO_STAMP_FUN_STR, (gpointer *)&sym)) {
+        fprintf(stderr, "Failed to initialize module: %s\n",
+                fname);
+        /* Print some info if this is a QEMU module (but from different build),
+         * this will make debugging user problems easier. */
+        if (g_module_symbol(g_module, "qemu_module_dummy", (gpointer *)&sym)) {
+            fprintf(stderr,
+                    "Note: only modules from the same build can be loaded.\n");
+        }
+        g_module_close(g_module);
+    } else {
+        QTAILQ_FOREACH(e, &dso_init_list, node) {
+            register_module_init(e->init, e->type);
+        }
+    }
+
+    QTAILQ_FOREACH_SAFE(e, &dso_init_list, node, next) {
+        QTAILQ_REMOVE(&dso_init_list, e, node);
+        g_free(e);
+    }
+}
+#endif
+
+void module_load(module_init_type type)
+{
+#ifdef CONFIG_MODULES
+    char *fname = NULL;
+    const char **mp;
+    static const char *block_modules[] = {
+        CONFIG_BLOCK_MODULES
+    };
+
+    if (!g_module_supported()) {
+        return;
+    }
+
+    switch (type) {
+    case MODULE_INIT_BLOCK:
+        mp = block_modules;
+        break;
+    /* no other types have dynamic modules for now*/
+    default:
+        return;
+    }
+
+    for ( ; *mp; mp++) {
+        fname = g_strdup_printf("%s/%s%s", CONFIG_MODDIR, *mp, HOST_DSOSUF);
+        module_load_file(fname);
+        g_free(fname);
+    }
+
+#endif
+}
-- 
1.8.3.1

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

* [Qemu-devel] [PATCH v14 6/8] Makefile: install modules with "make install"
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
                   ` (4 preceding siblings ...)
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 5/8] module: implement module loading Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, pbonzini,
	vilanova, rth

Install all the modules to ${MODDIR}.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Makefile b/Makefile
index f940080..3d7cf5a 100644
--- a/Makefile
+++ b/Makefile
@@ -364,6 +364,12 @@ install-datadir install-localstatedir
 ifneq ($(TOOLS),)
 	$(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
 endif
+ifneq ($(CONFIG_MODULES),)
+	$(INSTALL_DIR) "$(DESTDIR)$(moddir)"
+	for s in $(patsubst %.mo,%$(DSOSUF),$(modules-m)); do \
+		$(INSTALL_PROG) $(STRIP_OPT) $$s "$(DESTDIR)$(moddir)/$${s//\//-}"; \
+	done
+endif
 ifneq ($(HELPERS-y),)
 	$(INSTALL_DIR) "$(DESTDIR)$(libexecdir)"
 	$(INSTALL_PROG) $(STRIP_OPT) $(HELPERS-y) "$(DESTDIR)$(libexecdir)"
-- 
1.8.3.1

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

* [Qemu-devel] [PATCH v14 7/8] .gitignore: ignore module related files (dll, so, mo)
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
                   ` (5 preceding siblings ...)
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 6/8] Makefile: install modules with "make install" Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 8/8] block: convert block drivers linked with libs to modules Fam Zheng
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, pbonzini,
	vilanova, rth

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

diff --git a/.gitignore b/.gitignore
index 8e1b73f..ac679ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -63,6 +63,9 @@ fsdev/virtfs-proxy-helper.pod
 *.cp
 *.dvi
 *.exe
+*.dll
+*.so
+*.mo
 *.fn
 *.ky
 *.log
-- 
1.8.3.1

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

* [Qemu-devel] [PATCH v14 8/8] block: convert block drivers linked with libs to modules
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
                   ` (6 preceding siblings ...)
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
@ 2013-10-16  3:26 ` Fam Zheng
  2013-10-16  6:26 ` [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
  2013-10-16 16:20 ` Paolo Bonzini
  9 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  3:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, pbonzini,
	vilanova, rth

The converted block drivers are:

    curl
    iscsi
    rbd
    ssh
    glusterfs

together with object specific flags and libs change of:

    qcow
    linux-aio

No longer adds flags and libs for them to global variables, instead
create config-host.mak variables like FOO_CFLAGS and FOO_LIBS, which is
used as per object cflags and libs.

Signed-off-by: Fam Zheng <famz@redhat.com>

build: Add object specific link flags.

qcow.o and linux-aio.o has their own library dependencies for building,
add them to keep ld happy.

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

diff --git a/block/Makefile.objs b/block/Makefile.objs
index 3bb85b5..4b25902 100644
--- a/block/Makefile.objs
+++ b/block/Makefile.objs
@@ -23,4 +23,15 @@ common-obj-y += commit.o
 common-obj-y += mirror.o
 common-obj-y += backup.o
 
-$(obj)/curl.o: QEMU_CFLAGS+=$(CURL_CFLAGS)
+iscsi.o-cflags     := $(LIBISCSI_CFLAGS)
+iscsi.o-libs       := $(LIBISCSI_LIBS)
+curl.o-cflags      := $(CURL_CFLAGS)
+curl.o-libs        := $(CURL_LIBS)
+rbd.o-cflags       := $(RBD_CFLAGS)
+rbd.o-libs         := $(RBD_LIBS)
+gluster.o-cflags   := $(GLUSTERFS_CFLAGS)
+gluster.o-libs     := $(GLUSTERFS_LIBS)
+ssh.o-cflags       := $(LIBSSH2_CFLAGS)
+ssh.o-libs         := $(LIBSSH2_LIBS)
+qcow.o-libs        := -lz
+linux-aio.o-libs   := -laio
diff --git a/configure b/configure
index 5b09d9d..4592f7f 100755
--- a/configure
+++ b/configure
@@ -2251,8 +2251,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"
@@ -2412,8 +2410,6 @@ EOF
   rbd_libs="-lrbd -lrados"
   if compile_prog "" "$rbd_libs" ; then
     rbd=yes
-    libs_tools="$rbd_libs $libs_tools"
-    libs_softmmu="$rbd_libs $libs_softmmu"
   else
     if test "$rbd" = "yes" ; then
       feature_not_found "rados block device"
@@ -2430,9 +2426,6 @@ if test "$libssh2" != "no" ; then
     libssh2_cflags=`$pkg_config libssh2 --cflags`
     libssh2_libs=`$pkg_config libssh2 --libs`
     libssh2=yes
-    libs_tools="$libssh2_libs $libs_tools"
-    libs_softmmu="$libssh2_libs $libs_softmmu"
-    QEMU_CFLAGS="$QEMU_CFLAGS $libssh2_cflags"
   else
     if test "$libssh2" = "yes" ; then
       error_exit "libssh2 >= $min_libssh2_version required for --enable-libssh2"
@@ -2648,9 +2641,6 @@ if test "$glusterfs" != "no" ; then
     glusterfs="yes"
     glusterfs_cflags=`$pkg_config --cflags glusterfs-api`
     glusterfs_libs=`$pkg_config --libs glusterfs-api`
-    CFLAGS="$CFLAGS $glusterfs_cflags"
-    libs_tools="$glusterfs_libs $libs_tools"
-    libs_softmmu="$glusterfs_libs $libs_softmmu"
     if $pkg_config --atleast-version=5 glusterfs-api; then
       glusterfs_discard="yes"
     fi
@@ -3018,11 +3008,9 @@ EOF
     libiscsi="yes"
     libiscsi_cflags=$($pkg_config --cflags libiscsi)
     libiscsi_libs=$($pkg_config --libs libiscsi)
-    CFLAGS="$CFLAGS $libiscsi_cflags"
-    LIBS="$LIBS $libiscsi_libs"
   elif compile_prog "" "-liscsi" ; then
     libiscsi="yes"
-    LIBS="$LIBS -liscsi"
+    libiscsi_libs="-liscsi"
   else
     if test "$libiscsi" = "yes" ; then
       feature_not_found "libiscsi"
@@ -4010,8 +3998,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
@@ -4100,7 +4089,9 @@ if test "$glx" = "yes" ; then
 fi
 
 if test "$libiscsi" = "yes" ; then
-  echo "CONFIG_LIBISCSI=y" >> $config_host_mak
+  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
+  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
+  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
 fi
 
 if test "$seccomp" = "yes"; then
@@ -4121,7 +4112,9 @@ if test "$qom_cast_debug" = "yes" ; then
   echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
 fi
 if test "$rbd" = "yes" ; then
-  echo "CONFIG_RBD=y" >> $config_host_mak
+  echo "CONFIG_RBD=m" >> $config_host_mak
+  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
+  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
 fi
 
 echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
@@ -4164,7 +4157,9 @@ if test "$getauxval" = "yes" ; then
 fi
 
 if test "$glusterfs" = "yes" ; then
-  echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
+  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
+  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
+  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
 fi
 
 if test "$glusterfs_discard" = "yes" ; then
@@ -4172,7 +4167,9 @@ if test "$glusterfs_discard" = "yes" ; then
 fi
 
 if test "$libssh2" = "yes" ; then
-  echo "CONFIG_LIBSSH2=y" >> $config_host_mak
+  echo "CONFIG_LIBSSH2=m" >> $config_host_mak
+  echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
+  echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
 fi
 
 if test "$virtio_blk_data_plane" = "yes" ; then
-- 
1.8.3.1

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

* Re: [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
                   ` (7 preceding siblings ...)
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 8/8] block: convert block drivers linked with libs to modules Fam Zheng
@ 2013-10-16  6:26 ` Fam Zheng
  2013-10-16  9:01   ` Fam Zheng
  2013-10-16 16:20 ` Paolo Bonzini
  9 siblings, 1 reply; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  6:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, vilanova, alex, pbonzini,
	xiawenc, rth

On Wed, 10/16 11:26, Fam Zheng wrote:
> This series implements feature of shared object building as described in:
> 
> http://wiki.qemu.org/Features/Modules
> 
> The main idea behind modules is to isolate dependencies on third party
> libraries from qemu executables, such as libglusterfs or librbd, so that the
> end users can install core qemu package with fewer dependencies.  And only for
> those who want to use particular modules, need they install qemu-foo
> sub-package, which in turn requires libbar and libbiz packages.
> 
> It's implemented in three steps:
> 
> 1. The first patches fix current build system to correctly handle nested
>    variables and object specific options:
> 
>     [01/08] ui/Makefile.objs: delete unnecessary cocoa.o dependency
>     [02/08] make.rule: fix $(obj) to a real relative path
>     [03/08] rule.mak: allow per object cflags and libs
> 
> 2. The Makefile changes adds necessary options and rules to build DSO objects:
> 
>     [04/08] build-sys: introduce common-obj-m and block-obj-m for DSO
> 
> 3. The next patch adds code to load modules from installed directory:
> 
>     [05/08] module: implement module loading
> 
> A few more changes are following to complete it:
> 
>     [06/08] Makefile: install modules with "make install"
>     [07/08] .gitignore: ignore module related files (dll, so, mo)
> 
> In the end of series, the block drivers are converted:
> 
>     [08/08] block: convert block drivers linked with libs to modules
> 
> v14: Fix alpha-linux-user compiling by:
>      a) Add object specific libs to qcow.o and linux-aio.o.

       Patch 08 for this.

>      b) Only link block-obj-m to softmmu targets.

       Patch 02 for this.

>      (Thanks Paolo)
> 
> v13: Drop --moddir option in configure. (Paolo)
> 
> v12: Rebase to current master, no conflict.
>      Drop "-Wl,--enable-new-tags -Wl,-rpath,'$$ORIGIN'". (Paolo)
> 
> v11:
>     [04] Link DSO with  -Wl,--enable-new-dtags -Wl,-rpath,'$$ORIGIN' (Richard)
>     [05] Reuse module_init_type in module_load, no separate load type enums.
>          Separate list of modules by type. It's simply list of built modules
>          now. No whitelist option in configure.
>          Support multiple module_init() in single module.
> 
> v10:
>     All modules in a single directory (moddir), with module type prefixed:
>         /usr/lib/qemu/block-{curl,iscsi,...}.so
>     The module names for user to list in module whitelist is consequently:
>         block-curl, block-iscsi, ui-*, etc.
>     In Makfile, the installed module filename is simply generated by:
>         $(subst /,-,%.so)
>     Which is also the rule for module names.
> 
>     [05] Add #undef CONFIG_MODULE_WHITELIST in config-host.h.
>          Use static array for whitelist. (Richard)
> 
> Fam Zheng (7):
>   make.rule: fix $(obj) to a real relative path
>   rule.mak: allow per object cflags and libs
>   build-sys: introduce common-obj-m and block-obj-m for DSO
>   module: implement module loading
>   Makefile: install modules with "make install"
>   .gitignore: ignore module related files (dll, so, mo)
>   block: convert block drivers linked with libs to modules
> 
> Peter Maydell (1):
>   ui/Makefile.objs: delete unnecessary cocoa.o dependency
> 
>  .gitignore            |   3 ++
>  Makefile              |  30 +++++++++++++-
>  Makefile.objs         |  19 ++-------
>  Makefile.target       |  24 +++++++++--
>  block/Makefile.objs   |  13 +++++-
>  configure             |  81 ++++++++++++++++++++++++++------------
>  include/qemu/module.h |  12 ++++++
>  module-common.c       |  10 +++++
>  rules.mak             |  80 +++++++++++++++++++++++++++++++------
>  scripts/create_config |  14 +++++++
>  ui/Makefile.objs      |   2 -
>  util/module.c         | 107 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  12 files changed, 330 insertions(+), 65 deletions(-)
>  create mode 100644 module-common.c
> 
> -- 
> 1.8.3.1
> 
> 

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

* Re: [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support
  2013-10-16  6:26 ` [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
@ 2013-10-16  9:01   ` Fam Zheng
  0 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-16  9:01 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, peter.maydell, stefanha, mjt, xiawenc, alex, pbonzini,
	vilanova, rth

On Wed, 10/16 14:26, Fam Zheng wrote:
> On Wed, 10/16 11:26, Fam Zheng wrote:
> > This series implements feature of shared object building as described in:
> > 
> > http://wiki.qemu.org/Features/Modules
> > 
> > The main idea behind modules is to isolate dependencies on third party
> > libraries from qemu executables, such as libglusterfs or librbd, so that the
> > end users can install core qemu package with fewer dependencies.  And only for
> > those who want to use particular modules, need they install qemu-foo
> > sub-package, which in turn requires libbar and libbiz packages.
> > 
> > It's implemented in three steps:
> > 
> > 1. The first patches fix current build system to correctly handle nested
> >    variables and object specific options:
> > 
> >     [01/08] ui/Makefile.objs: delete unnecessary cocoa.o dependency
> >     [02/08] make.rule: fix $(obj) to a real relative path
> >     [03/08] rule.mak: allow per object cflags and libs
> > 
> > 2. The Makefile changes adds necessary options and rules to build DSO objects:
> > 
> >     [04/08] build-sys: introduce common-obj-m and block-obj-m for DSO
> > 
> > 3. The next patch adds code to load modules from installed directory:
> > 
> >     [05/08] module: implement module loading
> > 
> > A few more changes are following to complete it:
> > 
> >     [06/08] Makefile: install modules with "make install"
> >     [07/08] .gitignore: ignore module related files (dll, so, mo)
> > 
> > In the end of series, the block drivers are converted:
> > 
> >     [08/08] block: convert block drivers linked with libs to modules
> > 
> > v14: Fix alpha-linux-user compiling by:
> >      a) Add object specific libs to qcow.o and linux-aio.o.
> 
>        Patch 08 for this.
> 
> >      b) Only link block-obj-m to softmmu targets.

Sorry..

s/block-obj-m/block-obj-y/

Fam

> 
>        Patch 02 for this.
> 
> >      (Thanks Paolo)
> > 
> > v13: Drop --moddir option in configure. (Paolo)
> > 
> > v12: Rebase to current master, no conflict.
> >      Drop "-Wl,--enable-new-tags -Wl,-rpath,'$$ORIGIN'". (Paolo)
> > 
> > v11:
> >     [04] Link DSO with  -Wl,--enable-new-dtags -Wl,-rpath,'$$ORIGIN' (Richard)
> >     [05] Reuse module_init_type in module_load, no separate load type enums.
> >          Separate list of modules by type. It's simply list of built modules
> >          now. No whitelist option in configure.
> >          Support multiple module_init() in single module.
> > 
> > v10:
> >     All modules in a single directory (moddir), with module type prefixed:
> >         /usr/lib/qemu/block-{curl,iscsi,...}.so
> >     The module names for user to list in module whitelist is consequently:
> >         block-curl, block-iscsi, ui-*, etc.
> >     In Makfile, the installed module filename is simply generated by:
> >         $(subst /,-,%.so)
> >     Which is also the rule for module names.
> > 
> >     [05] Add #undef CONFIG_MODULE_WHITELIST in config-host.h.
> >          Use static array for whitelist. (Richard)
> > 
> > Fam Zheng (7):
> >   make.rule: fix $(obj) to a real relative path
> >   rule.mak: allow per object cflags and libs
> >   build-sys: introduce common-obj-m and block-obj-m for DSO
> >   module: implement module loading
> >   Makefile: install modules with "make install"
> >   .gitignore: ignore module related files (dll, so, mo)
> >   block: convert block drivers linked with libs to modules
> > 
> > Peter Maydell (1):
> >   ui/Makefile.objs: delete unnecessary cocoa.o dependency
> > 
> >  .gitignore            |   3 ++
> >  Makefile              |  30 +++++++++++++-
> >  Makefile.objs         |  19 ++-------
> >  Makefile.target       |  24 +++++++++--
> >  block/Makefile.objs   |  13 +++++-
> >  configure             |  81 ++++++++++++++++++++++++++------------
> >  include/qemu/module.h |  12 ++++++
> >  module-common.c       |  10 +++++
> >  rules.mak             |  80 +++++++++++++++++++++++++++++++------
> >  scripts/create_config |  14 +++++++
> >  ui/Makefile.objs      |   2 -
> >  util/module.c         | 107 +++++++++++++++++++++++++++++++++++++++++++++++++-
> >  12 files changed, 330 insertions(+), 65 deletions(-)
> >  create mode 100644 module-common.c
> > 
> > -- 
> > 1.8.3.1
> > 
> > 
> 

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

* Re: [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support
  2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
                   ` (8 preceding siblings ...)
  2013-10-16  6:26 ` [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
@ 2013-10-16 16:20 ` Paolo Bonzini
  2013-10-17  2:35   ` Fam Zheng
  9 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2013-10-16 16:20 UTC (permalink / raw)
  To: Fam Zheng
  Cc: kwolf, peter.maydell, alex, mjt, qemu-devel, vilanova, stefanha,
	xiawenc, rth

Il 16/10/2013 05:26, Fam Zheng ha scritto:
> This series implements feature of shared object building as described in:
> 
> http://wiki.qemu.org/Features/Modules
> 
> The main idea behind modules is to isolate dependencies on third party
> libraries from qemu executables, such as libglusterfs or librbd, so that the
> end users can install core qemu package with fewer dependencies.  And only for
> those who want to use particular modules, need they install qemu-foo
> sub-package, which in turn requires libbar and libbiz packages.

Fam,

I'm not sure I'll be able to do all the required testing before hard
freeze, so I'm leaning towards only submitting patch 1 in my upcoming
pull request (to be sent tomorrow, probably).  The rest will be left for
1.8; I'm sorry.

Paolo

> It's implemented in three steps:
> 
> 1. The first patches fix current build system to correctly handle nested
>    variables and object specific options:
> 
>     [01/08] ui/Makefile.objs: delete unnecessary cocoa.o dependency
>     [02/08] make.rule: fix $(obj) to a real relative path
>     [03/08] rule.mak: allow per object cflags and libs
> 
> 2. The Makefile changes adds necessary options and rules to build DSO objects:
> 
>     [04/08] build-sys: introduce common-obj-m and block-obj-m for DSO
> 
> 3. The next patch adds code to load modules from installed directory:
> 
>     [05/08] module: implement module loading
> 
> A few more changes are following to complete it:
> 
>     [06/08] Makefile: install modules with "make install"
>     [07/08] .gitignore: ignore module related files (dll, so, mo)
> 
> In the end of series, the block drivers are converted:
> 
>     [08/08] block: convert block drivers linked with libs to modules
> 
> v14: Fix alpha-linux-user compiling by:
>      a) Add object specific libs to qcow.o and linux-aio.o.
>      b) Only link block-obj-m to softmmu targets.
>      (Thanks Paolo)
> 
> v13: Drop --moddir option in configure. (Paolo)
> 
> v12: Rebase to current master, no conflict.
>      Drop "-Wl,--enable-new-tags -Wl,-rpath,'$$ORIGIN'". (Paolo)
> 
> v11:
>     [04] Link DSO with  -Wl,--enable-new-dtags -Wl,-rpath,'$$ORIGIN' (Richard)
>     [05] Reuse module_init_type in module_load, no separate load type enums.
>          Separate list of modules by type. It's simply list of built modules
>          now. No whitelist option in configure.
>          Support multiple module_init() in single module.
> 
> v10:
>     All modules in a single directory (moddir), with module type prefixed:
>         /usr/lib/qemu/block-{curl,iscsi,...}.so
>     The module names for user to list in module whitelist is consequently:
>         block-curl, block-iscsi, ui-*, etc.
>     In Makfile, the installed module filename is simply generated by:
>         $(subst /,-,%.so)
>     Which is also the rule for module names.
> 
>     [05] Add #undef CONFIG_MODULE_WHITELIST in config-host.h.
>          Use static array for whitelist. (Richard)
> 
> Fam Zheng (7):
>   make.rule: fix $(obj) to a real relative path
>   rule.mak: allow per object cflags and libs
>   build-sys: introduce common-obj-m and block-obj-m for DSO
>   module: implement module loading
>   Makefile: install modules with "make install"
>   .gitignore: ignore module related files (dll, so, mo)
>   block: convert block drivers linked with libs to modules
> 
> Peter Maydell (1):
>   ui/Makefile.objs: delete unnecessary cocoa.o dependency
> 
>  .gitignore            |   3 ++
>  Makefile              |  30 +++++++++++++-
>  Makefile.objs         |  19 ++-------
>  Makefile.target       |  24 +++++++++--
>  block/Makefile.objs   |  13 +++++-
>  configure             |  81 ++++++++++++++++++++++++++------------
>  include/qemu/module.h |  12 ++++++
>  module-common.c       |  10 +++++
>  rules.mak             |  80 +++++++++++++++++++++++++++++++------
>  scripts/create_config |  14 +++++++
>  ui/Makefile.objs      |   2 -
>  util/module.c         | 107 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  12 files changed, 330 insertions(+), 65 deletions(-)
>  create mode 100644 module-common.c
> 

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

* Re: [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support
  2013-10-16 16:20 ` Paolo Bonzini
@ 2013-10-17  2:35   ` Fam Zheng
  0 siblings, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-17  2:35 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: kwolf, peter.maydell, alex, mjt, qemu-devel, vilanova, stefanha,
	xiawenc, rth

On Wed, 10/16 18:20, Paolo Bonzini wrote:
> Il 16/10/2013 05:26, Fam Zheng ha scritto:
> > This series implements feature of shared object building as described in:
> > 
> > http://wiki.qemu.org/Features/Modules
> > 
> > The main idea behind modules is to isolate dependencies on third party
> > libraries from qemu executables, such as libglusterfs or librbd, so that the
> > end users can install core qemu package with fewer dependencies.  And only for
> > those who want to use particular modules, need they install qemu-foo
> > sub-package, which in turn requires libbar and libbiz packages.
> 
> Fam,
> 
> I'm not sure I'll be able to do all the required testing before hard
> freeze, so I'm leaning towards only submitting patch 1 in my upcoming
> pull request (to be sent tomorrow, probably).  The rest will be left for
> 1.8; I'm sorry.
> 

OK. Not major impact as seen by me.

Fam

> > It's implemented in three steps:
> > 
> > 1. The first patches fix current build system to correctly handle nested
> >    variables and object specific options:
> > 
> >     [01/08] ui/Makefile.objs: delete unnecessary cocoa.o dependency
> >     [02/08] make.rule: fix $(obj) to a real relative path
> >     [03/08] rule.mak: allow per object cflags and libs
> > 
> > 2. The Makefile changes adds necessary options and rules to build DSO objects:
> > 
> >     [04/08] build-sys: introduce common-obj-m and block-obj-m for DSO
> > 
> > 3. The next patch adds code to load modules from installed directory:
> > 
> >     [05/08] module: implement module loading
> > 
> > A few more changes are following to complete it:
> > 
> >     [06/08] Makefile: install modules with "make install"
> >     [07/08] .gitignore: ignore module related files (dll, so, mo)
> > 
> > In the end of series, the block drivers are converted:
> > 
> >     [08/08] block: convert block drivers linked with libs to modules
> > 
> > v14: Fix alpha-linux-user compiling by:
> >      a) Add object specific libs to qcow.o and linux-aio.o.
> >      b) Only link block-obj-m to softmmu targets.
> >      (Thanks Paolo)
> > 
> > v13: Drop --moddir option in configure. (Paolo)
> > 
> > v12: Rebase to current master, no conflict.
> >      Drop "-Wl,--enable-new-tags -Wl,-rpath,'$$ORIGIN'". (Paolo)
> > 
> > v11:
> >     [04] Link DSO with  -Wl,--enable-new-dtags -Wl,-rpath,'$$ORIGIN' (Richard)
> >     [05] Reuse module_init_type in module_load, no separate load type enums.
> >          Separate list of modules by type. It's simply list of built modules
> >          now. No whitelist option in configure.
> >          Support multiple module_init() in single module.
> > 
> > v10:
> >     All modules in a single directory (moddir), with module type prefixed:
> >         /usr/lib/qemu/block-{curl,iscsi,...}.so
> >     The module names for user to list in module whitelist is consequently:
> >         block-curl, block-iscsi, ui-*, etc.
> >     In Makfile, the installed module filename is simply generated by:
> >         $(subst /,-,%.so)
> >     Which is also the rule for module names.
> > 
> >     [05] Add #undef CONFIG_MODULE_WHITELIST in config-host.h.
> >          Use static array for whitelist. (Richard)
> > 
> > Fam Zheng (7):
> >   make.rule: fix $(obj) to a real relative path
> >   rule.mak: allow per object cflags and libs
> >   build-sys: introduce common-obj-m and block-obj-m for DSO
> >   module: implement module loading
> >   Makefile: install modules with "make install"
> >   .gitignore: ignore module related files (dll, so, mo)
> >   block: convert block drivers linked with libs to modules
> > 
> > Peter Maydell (1):
> >   ui/Makefile.objs: delete unnecessary cocoa.o dependency
> > 
> >  .gitignore            |   3 ++
> >  Makefile              |  30 +++++++++++++-
> >  Makefile.objs         |  19 ++-------
> >  Makefile.target       |  24 +++++++++--
> >  block/Makefile.objs   |  13 +++++-
> >  configure             |  81 ++++++++++++++++++++++++++------------
> >  include/qemu/module.h |  12 ++++++
> >  module-common.c       |  10 +++++
> >  rules.mak             |  80 +++++++++++++++++++++++++++++++------
> >  scripts/create_config |  14 +++++++
> >  ui/Makefile.objs      |   2 -
> >  util/module.c         | 107 +++++++++++++++++++++++++++++++++++++++++++++++++-
> >  12 files changed, 330 insertions(+), 65 deletions(-)
> >  create mode 100644 module-common.c
> > 
> 

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

* Re: [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path
  2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path Fam Zheng
@ 2013-10-17 14:57   ` Paolo Bonzini
  2013-10-18  1:59     ` Fam Zheng
  2013-11-12  6:26     ` Fam Zheng
  0 siblings, 2 replies; 16+ messages in thread
From: Paolo Bonzini @ 2013-10-17 14:57 UTC (permalink / raw)
  To: Fam Zheng
  Cc: kwolf, peter.maydell, alex, mjt, qemu-devel, vilanova, stefanha,
	xiawenc, rth

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

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

* Re: [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path
  2013-10-17 14:57   ` Paolo Bonzini
@ 2013-10-18  1:59     ` Fam Zheng
  2013-11-12  6:26     ` Fam Zheng
  1 sibling, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-10-18  1:59 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: kwolf, peter.maydell, stefanha, mjt, qemu-devel, xiawenc, alex,
	vilanova, rth

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

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

* Re: [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path
  2013-10-17 14:57   ` Paolo Bonzini
  2013-10-18  1:59     ` Fam Zheng
@ 2013-11-12  6:26     ` Fam Zheng
  1 sibling, 0 replies; 16+ messages in thread
From: Fam Zheng @ 2013-11-12  6:26 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: kwolf, peter.maydell, stefanha, mjt, qemu-devel, xiawenc, alex,
	vilanova, rth

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

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

end of thread, other threads:[~2013-11-12  6:27 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-16  3:26 [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 2/8] make.rule: fix $(obj) to a real relative path Fam Zheng
2013-10-17 14:57   ` Paolo Bonzini
2013-10-18  1:59     ` Fam Zheng
2013-11-12  6:26     ` Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 3/8] rule.mak: allow per object cflags and libs Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 5/8] module: implement module loading Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 6/8] Makefile: install modules with "make install" Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
2013-10-16  3:26 ` [Qemu-devel] [PATCH v14 8/8] block: convert block drivers linked with libs to modules Fam Zheng
2013-10-16  6:26 ` [Qemu-devel] [PATCH v14 0/8] Shared Library Module Support Fam Zheng
2013-10-16  9:01   ` Fam Zheng
2013-10-16 16:20 ` Paolo Bonzini
2013-10-17  2:35   ` 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).