* [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 13:41 ` Paolo Bonzini
` (2 more replies)
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs Fam Zheng
` (7 subsequent siblings)
8 siblings, 3 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 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 | 17 +++++++++++++----
configure | 1 +
rules.mak | 16 +++++++++++-----
5 files changed, 41 insertions(+), 25 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..87906ea 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -143,13 +143,22 @@ 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) $(block-obj-y)
-all-obj-y = $(obj-y)
-all-obj-y += $(addprefix ../, $(common-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..9344c27 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,9 +135,16 @@ $(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))))))
$(foreach var,$(nested-vars), $(eval \
-include $(addsuffix *.d, $(sort $(dir $($(var)))))))
+
+$(if $1,$(foreach v,$(nested-vars),$(eval \
+ $v := $(addprefix $1/,$(value $v)))))
+
endef
--
1.8.3.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path Fam Zheng
@ 2013-09-11 13:41 ` Paolo Bonzini
2013-09-12 2:32 ` Fam Zheng
2013-09-11 14:59 ` Daniel P. Berrange
2013-09-11 16:38 ` Peter Maydell
2 siblings, 1 reply; 40+ messages in thread
From: Paolo Bonzini @ 2013-09-11 13:41 UTC (permalink / raw)
To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
Il 11/09/2013 15:34, 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 | 16 +++++++++++++++-
> Makefile.objs | 16 +---------------
> Makefile.target | 17 +++++++++++++----
> configure | 1 +
> rules.mak | 16 +++++++++++-----
> 5 files changed, 41 insertions(+), 25 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..87906ea 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -143,13 +143,22 @@ 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) $(block-obj-y)
>
> -all-obj-y = $(obj-y)
> -all-obj-y += $(addprefix ../, $(common-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..9344c27 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,9 +135,16 @@ $(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))))))
> $(foreach var,$(nested-vars), $(eval \
> -include $(addsuffix *.d, $(sort $(dir $($(var)))))))
> +
> +$(if $1,$(foreach v,$(nested-vars),$(eval \
> + $v := $(addprefix $1/,$(value $v)))))
I think needs to be done immediately after unnest-vars-1.
Otherwise looks good, any simplification to the logic is outside the
scope of this series.
Paolo
> endef
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 13:41 ` Paolo Bonzini
@ 2013-09-12 2:32 ` Fam Zheng
0 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:32 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
On Wed, 09/11 15:41, Paolo Bonzini wrote:
> Il 11/09/2013 15:34, 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 | 16 +++++++++++++++-
> > Makefile.objs | 16 +---------------
> > Makefile.target | 17 +++++++++++++----
> > configure | 1 +
> > rules.mak | 16 +++++++++++-----
> > 5 files changed, 41 insertions(+), 25 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..87906ea 100644
> > --- a/Makefile.target
> > +++ b/Makefile.target
> > @@ -143,13 +143,22 @@ 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) $(block-obj-y)
> >
> > -all-obj-y = $(obj-y)
> > -all-obj-y += $(addprefix ../, $(common-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..9344c27 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,9 +135,16 @@ $(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))))))
> > $(foreach var,$(nested-vars), $(eval \
> > -include $(addsuffix *.d, $(sort $(dir $($(var)))))))
> > +
> > +$(if $1,$(foreach v,$(nested-vars),$(eval \
> > + $v := $(addprefix $1/,$(value $v)))))
>
> I think needs to be done immediately after unnest-vars-1.
>
Yes, will fix.
Fam
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path Fam Zheng
2013-09-11 13:41 ` Paolo Bonzini
@ 2013-09-11 14:59 ` Daniel P. Berrange
2013-09-12 1:57 ` Fam Zheng
2013-09-12 2:22 ` Fam Zheng
2013-09-11 16:38 ` Peter Maydell
2 siblings, 2 replies; 40+ messages in thread
From: Daniel P. Berrange @ 2013-09-11 14:59 UTC (permalink / raw)
To: Fam Zheng
Cc: peter.maydell, mjt, qemu-devel, stefanha, pbonzini, vilanova, rth
On Wed, Sep 11, 2013 at 09:34:01PM +0800, Fam Zheng wrote:
> 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 | 17 +++++++++++++----
> configure | 1 +
> rules.mak | 16 +++++++++++-----
> 5 files changed, 41 insertions(+), 25 deletions(-)
This change appears to break the build of libcacard.so when I tried
the following sequence with current git master
$ git clean -f -x -d
$ ./configure --prefix=$HOME/usr/qemu-git --target-list=x86_64-softmmu
$ make -j 20
....
lt LINK vscclient
./.libs/libcacard.so: undefined reference to `monitor_fdset_get_fd'
./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_add'
./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_remove'
./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_find'
collect2: error: ld returned 1 exit status
I'm also seeing make report circular deps
make: Circular stubs/ <- stubs/ dependency dropped.
make: Circular trace/ <- stubs/ dependency dropped.
make: Circular trace/ <- trace/ dependency dropped.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 14:59 ` Daniel P. Berrange
@ 2013-09-12 1:57 ` Fam Zheng
2013-09-12 2:22 ` Fam Zheng
1 sibling, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 1:57 UTC (permalink / raw)
To: Daniel P. Berrange
Cc: peter.maydell, mjt, qemu-devel, stefanha, pbonzini, vilanova, rth
On Wed, 09/11 15:59, Daniel P. Berrange wrote:
> On Wed, Sep 11, 2013 at 09:34:01PM +0800, Fam Zheng wrote:
> > 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 | 17 +++++++++++++----
> > configure | 1 +
> > rules.mak | 16 +++++++++++-----
> > 5 files changed, 41 insertions(+), 25 deletions(-)
>
> This change appears to break the build of libcacard.so when I tried
> the following sequence with current git master
>
> $ git clean -f -x -d
> $ ./configure --prefix=$HOME/usr/qemu-git --target-list=x86_64-softmmu
> $ make -j 20
> ....
> lt LINK vscclient
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_get_fd'
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_add'
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_remove'
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_find'
> collect2: error: ld returned 1 exit status
>
> I'm also seeing make report circular deps
>
> make: Circular stubs/ <- stubs/ dependency dropped.
> make: Circular trace/ <- stubs/ dependency dropped.
> make: Circular trace/ <- trace/ dependency dropped.
>
>
I haven't seen this problem, can you paste your output of "make --debug=b V=1"?
Fam
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 14:59 ` Daniel P. Berrange
2013-09-12 1:57 ` Fam Zheng
@ 2013-09-12 2:22 ` Fam Zheng
1 sibling, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:22 UTC (permalink / raw)
To: Daniel P. Berrange
Cc: peter.maydell, mjt, qemu-devel, stefanha, pbonzini, vilanova, rth
On Wed, 09/11 15:59, Daniel P. Berrange wrote:
> On Wed, Sep 11, 2013 at 09:34:01PM +0800, Fam Zheng wrote:
> > 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 | 17 +++++++++++++----
> > configure | 1 +
> > rules.mak | 16 +++++++++++-----
> > 5 files changed, 41 insertions(+), 25 deletions(-)
>
> This change appears to break the build of libcacard.so when I tried
> the following sequence with current git master
>
> $ git clean -f -x -d
> $ ./configure --prefix=$HOME/usr/qemu-git --target-list=x86_64-softmmu
> $ make -j 20
> ....
> lt LINK vscclient
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_get_fd'
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_add'
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_remove'
> ./.libs/libcacard.so: undefined reference to `monitor_fdset_dup_fd_find'
> collect2: error: ld returned 1 exit status
>
> I'm also seeing make report circular deps
>
> make: Circular stubs/ <- stubs/ dependency dropped.
> make: Circular trace/ <- stubs/ dependency dropped.
> make: Circular trace/ <- trace/ dependency dropped.
>
>
I fixed it, the order of including libcacard/Makefile and unnest-vars in top
Makefile is reversed. A Good catch, thanks.
Thanks.
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path Fam Zheng
2013-09-11 13:41 ` Paolo Bonzini
2013-09-11 14:59 ` Daniel P. Berrange
@ 2013-09-11 16:38 ` Peter Maydell
2013-09-11 16:40 ` Paolo Bonzini
2 siblings, 1 reply; 40+ messages in thread
From: Peter Maydell @ 2013-09-11 16:38 UTC (permalink / raw)
To: Fam Zheng
Cc: Michael Tokarev, QEMU Developers, Stefan Hajnoczi, Paolo Bonzini,
Lluís Vilanova, Richard Henderson
On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
> 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.
This breaks compilation on MacOSX of the cocoa UI:
make[1]: *** No rule to make target
`/Users/pm215/src/qemu/../ui/cocoa.m', needed by `../ui/cocoa.o'.
Stop.
because the dependency in ui/Makefile.objs:
$(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m
now results in cocoa.o depending on ../ui/cocoa.m
rather than ui/cocoa.m.
I think the right fix for this is just to delete that line
from ui/Makefile.objs, because we have a generic
rule that says "you can build foo.o from foo.m with
an objective-C compiler". That needs to be done
before this series can be applied though.
-- PMM
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 16:38 ` Peter Maydell
@ 2013-09-11 16:40 ` Paolo Bonzini
2013-09-11 16:43 ` Peter Maydell
0 siblings, 1 reply; 40+ messages in thread
From: Paolo Bonzini @ 2013-09-11 16:40 UTC (permalink / raw)
To: Peter Maydell
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Stefan Hajnoczi,
Lluís Vilanova, Richard Henderson
Il 11/09/2013 18:38, Peter Maydell ha scritto:
> On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
>> 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.
>
> This breaks compilation on MacOSX of the cocoa UI:
> make[1]: *** No rule to make target
> `/Users/pm215/src/qemu/../ui/cocoa.m', needed by `../ui/cocoa.o'.
> Stop.
>
> because the dependency in ui/Makefile.objs:
>
> $(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m
>
> now results in cocoa.o depending on ../ui/cocoa.m
> rather than ui/cocoa.m.
>
> I think the right fix for this is just to delete that line
> from ui/Makefile.objs, because we have a generic
> rule that says "you can build foo.o from foo.m with
> an objective-C compiler". That needs to be done
> before this series can be applied though.
Can you test it?
Paolo
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path
2013-09-11 16:40 ` Paolo Bonzini
@ 2013-09-11 16:43 ` Peter Maydell
0 siblings, 0 replies; 40+ messages in thread
From: Peter Maydell @ 2013-09-11 16:43 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Stefan Hajnoczi,
Lluís Vilanova, Richard Henderson
On 11 September 2013 17:40, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 11/09/2013 18:38, Peter Maydell ha scritto:
>> I think the right fix for this is just to delete that line
>> from ui/Makefile.objs, because we have a generic
>> rule that says "you can build foo.o from foo.m with
>> an objective-C compiler". That needs to be done
>> before this series can be applied though.
>
> Can you test it?
Yes, I'm just putting together a patch.
-- PMM
^ permalink raw reply [flat|nested] 40+ messages in thread
* [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 13:43 ` Paolo Bonzini
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO Fam Zheng
` (6 subsequent siblings)
8 siblings, 1 reply; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 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 9344c27..b1d53b5 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] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs Fam Zheng
@ 2013-09-11 13:43 ` Paolo Bonzini
2013-09-12 2:52 ` Fam Zheng
0 siblings, 1 reply; 40+ messages in thread
From: Paolo Bonzini @ 2013-09-11 13:43 UTC (permalink / raw)
To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
Il 11/09/2013 15:34, Fam Zheng ha scritto:
> 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 9344c27..b1d53b5 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/))
>
I'm not sure this will work for targets in the toplevel directory when
obj-base is not empty. This can be fixed later though, as part of a
general revamping of obj-base. Please add a FIXME comment.
Paolo
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs
2013-09-11 13:43 ` Paolo Bonzini
@ 2013-09-12 2:52 ` Fam Zheng
2013-09-12 6:34 ` Paolo Bonzini
0 siblings, 1 reply; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:52 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
On Wed, 09/11 15:43, Paolo Bonzini wrote:
> Il 11/09/2013 15:34, Fam Zheng ha scritto:
> > 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 9344c27..b1d53b5 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/))
> >
>
> I'm not sure this will work for targets in the toplevel directory when
> obj-base is not empty. This can be fixed later though, as part of a
> general revamping of obj-base. Please add a FIXME comment.
>
I'm not sure about the problem, can you give an example, so I can be specific
in the comment?
Thanks,
Fam
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs
2013-09-12 2:52 ` Fam Zheng
@ 2013-09-12 6:34 ` Paolo Bonzini
2013-09-12 7:12 ` Fam Zheng
0 siblings, 1 reply; 40+ messages in thread
From: Paolo Bonzini @ 2013-09-12 6:34 UTC (permalink / raw)
To: famz; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
Il 12/09/2013 04:52, Fam Zheng ha scritto:
>>> > > 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/))
>>> > >
>> >
>> > I'm not sure this will work for targets in the toplevel directory when
>> > obj-base is not empty. This can be fixed later though, as part of a
>> > general revamping of obj-base. Please add a FIXME comment.
>> >
> I'm not sure about the problem, can you give an example, so I can be specific
> in the comment?
Can you try using vl.o-cflags instead of a per-target QEMU_CFLAGS? I
think it won't work, because the toplevel Makefile.objs is included
directly and not through unnest-dir.
Paolo
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs
2013-09-12 6:34 ` Paolo Bonzini
@ 2013-09-12 7:12 ` Fam Zheng
0 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 7:12 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
On Thu, 09/12 08:34, Paolo Bonzini wrote:
> Il 12/09/2013 04:52, Fam Zheng ha scritto:
> >>> > > 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/))
> >>> > >
> >> >
> >> > I'm not sure this will work for targets in the toplevel directory when
> >> > obj-base is not empty. This can be fixed later though, as part of a
> >> > general revamping of obj-base. Please add a FIXME comment.
> >> >
> > I'm not sure about the problem, can you give an example, so I can be specific
> > in the comment?
>
> Can you try using vl.o-cflags instead of a per-target QEMU_CFLAGS? I
> think it won't work, because the toplevel Makefile.objs is included
> directly and not through unnest-dir.
>
I think this case works. Only in subdir %-cflags relies on unnest-vars to
prefix them, toplevel objects don't need this:
In toplevel Makefile.objs,
vl.o-cflags = -DTEST_CFLAGS_FOR_VL_O
Then,
rm vl.o ; make vl.o V=1 | grep TEST_CFLAGS_FOR_VL_O
cc <hidden options> -DTEST_CFLAGS_FOR_VL_O -c -o vl.o vl.c
Fam
^ permalink raw reply [flat|nested] 40+ messages in thread
* [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 20:01 ` Peter Maydell
2013-09-12 2:50 ` Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 4/8] module: implement module loading function Fam Zheng
` (5 subsequent siblings)
8 siblings, 2 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 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 an variable:
foo.mo-objs := bar.o baz.o qux.o
in the same style with foo.o-cflags and foo.o-libs.
Signed-off-by: Fam Zheng <famz@redhat.com>
---
Makefile | 10 ++++++++--
Makefile.objs | 2 ++
configure | 6 ++++++
rules.mak | 45 +++++++++++++++++++++++++++++++++++++--------
4 files changed, 53 insertions(+), 10 deletions(-)
diff --git a/Makefile b/Makefile
index 9e603c6..c50b4b3 100644
--- a/Makefile
+++ b/Makefile
@@ -125,13 +125,15 @@ 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
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,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 b1d53b5..9275d91 100644
--- a/rules.mak
+++ b/rules.mak
@@ -18,6 +18,9 @@ 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)) \
+ $(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)$@")
@@ -26,8 +29,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 +41,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 +61,17 @@ 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,$^)
+
+.PHONY: modules
+modules:
+
+%.mo:
+ $(call quiet-command,touch $@," GEN $(TARGET_DIR)$@")
+
%$(EXESUF): %.o
$(call LINK,$^)
@@ -123,7 +137,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
@@ -147,6 +164,14 @@ $(if $(nested-dirs),
$(call unnest-vars-1))
endef
+define add-modules
+$(foreach o,$(filter %.o,$($1)),$(eval \
+ $(patsubst %.o,%.mo,$o): $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)
@@ -159,5 +184,9 @@ $(foreach var,$(nested-vars), $(eval \
$(if $1,$(foreach v,$(nested-vars),$(eval \
$v := $(addprefix $1/,$(value $v)))))
+$(foreach v,$(filter %-m,$(nested-vars)), \
+ $(call add-modules,$v))
+
+$(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m)))
endef
--
1.8.3.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO Fam Zheng
@ 2013-09-11 20:01 ` Peter Maydell
2013-09-12 2:48 ` Fam Zheng
2013-09-12 2:50 ` Fam Zheng
1 sibling, 1 reply; 40+ messages in thread
From: Peter Maydell @ 2013-09-11 20:01 UTC (permalink / raw)
To: Fam Zheng
Cc: Michael Tokarev, QEMU Developers, Stefan Hajnoczi, Paolo Bonzini,
Lluís Vilanova, Richard Henderson
On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
> 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 an variable:
>
> foo.mo-objs := bar.o baz.o qux.o
>
> in the same style with foo.o-cflags and foo.o-libs.
This spectacularly breaks compilation if you don't have libtool
(which is currently an entirely optional dependency).
Test build/configure command, for x86-64 linux:
rm -rf build/x86 && mkdir build/x86 && (cd build/x86 && LIBTOOL=
../../configure --target-list=arm-softmmu --enable-debug --cc='ccache
gcc' --disable-smartcard-nss) && make -C build/x86 -j4
Fails like this:
LINK qemu-ga
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 0 has invalid symbol index 10
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 1 has invalid symbol index 11
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 4 has invalid symbol index 10
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 5 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 6 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 7 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 8 has invalid symbol index 2
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 9 has invalid symbol index 2
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 10 has invalid symbol index 11
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 11 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 12 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 13 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 14 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 15 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 16 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 17 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 18 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 19 has invalid symbol index 12
/usr/bin/ld.bfd.real:
/usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
relocation 20 has invalid symbol index 20
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/Scrt1.o:
In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [qemu-ga] Error 1
If we make libtool mandatory then (a) we need to make configure
bail out if it can't find it (b) we need to flag it up in the release notes
as a new mandatory dependency.
I'd really prefer it if we could avoid it though; among other things
MacOSX doesn't ship with a GNU libtool.
-- PMM
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO
2013-09-11 20:01 ` Peter Maydell
@ 2013-09-12 2:48 ` Fam Zheng
0 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:48 UTC (permalink / raw)
To: Peter Maydell
Cc: Michael Tokarev, QEMU Developers, Stefan Hajnoczi, Paolo Bonzini,
Lluís Vilanova, Richard Henderson
On Wed, 09/11 21:01, Peter Maydell wrote:
> On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
> > 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 an variable:
> >
> > foo.mo-objs := bar.o baz.o qux.o
> >
> > in the same style with foo.o-cflags and foo.o-libs.
>
> This spectacularly breaks compilation if you don't have libtool
> (which is currently an entirely optional dependency).
>
> Test build/configure command, for x86-64 linux:
>
> rm -rf build/x86 && mkdir build/x86 && (cd build/x86 && LIBTOOL=
> ../../configure --target-list=arm-softmmu --enable-debug --cc='ccache
> gcc' --disable-smartcard-nss) && make -C build/x86 -j4
>
> Fails like this:
>
> LINK qemu-ga
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 0 has invalid symbol index 10
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 1 has invalid symbol index 11
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 2 has invalid symbol index 2
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 3 has invalid symbol index 2
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 4 has invalid symbol index 10
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 5 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 6 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 7 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 8 has invalid symbol index 2
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 9 has invalid symbol index 2
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 10 has invalid symbol index 11
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 11 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 12 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 13 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 14 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 15 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 16 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 17 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 18 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 19 has invalid symbol index 12
> /usr/bin/ld.bfd.real:
> /usr/lib/debug/usr/lib/x86_64-linux-gnu/Scrt1.o(.debug_info):
> relocation 20 has invalid symbol index 20
> /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/Scrt1.o:
> In function `_start':
> (.text+0x20): undefined reference to `main'
> collect2: ld returned 1 exit status
> make: *** [qemu-ga] Error 1
>
>
> If we make libtool mandatory then (a) we need to make configure
> bail out if it can't find it (b) we need to flag it up in the release notes
> as a new mandatory dependency.
>
> I'd really prefer it if we could avoid it though; among other things
> MacOSX doesn't ship with a GNU libtool.
>
It's a bug in patch 03 (missing comma, again), I'll fix it in next revision.
Thanks for testing.
Fam
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO Fam Zheng
2013-09-11 20:01 ` Peter Maydell
@ 2013-09-12 2:50 ` Fam Zheng
1 sibling, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:50 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, mjt, stefanha, pbonzini, vilanova, rth
On Wed, 09/11 21:34, Fam Zheng wrote:
> 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 an variable:
>
> foo.mo-objs := bar.o baz.o qux.o
>
> in the same style with foo.o-cflags and foo.o-libs.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> Makefile | 10 ++++++++--
> Makefile.objs | 2 ++
> configure | 6 ++++++
> rules.mak | 45 +++++++++++++++++++++++++++++++++++++--------
> 4 files changed, 53 insertions(+), 10 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 9e603c6..c50b4b3 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -125,13 +125,15 @@ 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
> 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,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 b1d53b5..9275d91 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -18,6 +18,9 @@ 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)) \
> + $(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)$@")
> @@ -26,8 +29,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) \
Missing comma here: ^
So link is broken without libtool.
> + $(call extract-libs,$1) $(LIBS)," LINK $(TARGET_DIR)$@")
> else
> LIBTOOL += $(if $(V),,--quiet)
> %.lo: %.c
> @@ -38,12 +41,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 +61,17 @@ 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,$^)
> +
> +.PHONY: modules
> +modules:
> +
> +%.mo:
> + $(call quiet-command,touch $@," GEN $(TARGET_DIR)$@")
> +
> %$(EXESUF): %.o
> $(call LINK,$^)
>
> @@ -123,7 +137,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
> @@ -147,6 +164,14 @@ $(if $(nested-dirs),
> $(call unnest-vars-1))
> endef
>
> +define add-modules
> +$(foreach o,$(filter %.o,$($1)),$(eval \
> + $(patsubst %.o,%.mo,$o): $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)
> @@ -159,5 +184,9 @@ $(foreach var,$(nested-vars), $(eval \
>
> $(if $1,$(foreach v,$(nested-vars),$(eval \
> $v := $(addprefix $1/,$(value $v)))))
> +$(foreach v,$(filter %-m,$(nested-vars)), \
> + $(call add-modules,$v))
> +
> +$(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m)))
>
> endef
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
` (2 preceding siblings ...)
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 15:48 ` Daniel P. Berrange
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 5/8] configure: introduce --enable-modules Fam Zheng
` (4 subsequent siblings)
8 siblings, 1 reply; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 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 | 28 ++++++++++++++++++---------
include/qemu/module.h | 9 +++++++++
linux-user/main.c | 3 +++
scripts/create_config | 7 +++++++
util/module.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
vl.c | 2 ++
8 files changed, 97 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..a80f143 100755
--- a/configure
+++ b/configure
@@ -198,6 +198,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"
@@ -673,6 +674,8 @@ for opt do
;;
--libdir=*) libdir="$optarg"
;;
+ --moddir=*) moddir="$optarg"
+ ;;
--libexecdir=*) libexecdir="$optarg"
;;
--includedir=*) includedir="$optarg"
@@ -1049,6 +1052,7 @@ echo " --datadir=PATH install firmware in PATH$confsuffix"
echo " --docdir=PATH install documentation in PATH$confsuffix"
echo " --bindir=PATH install binaries in PATH"
echo " --libdir=PATH install libraries in PATH"
+echo " --moddir=PATH install modules 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]"
@@ -2252,15 +2256,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
@@ -3553,6 +3561,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`"
@@ -3675,6 +3684,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
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..381564e 100755
--- a/scripts/create_config
+++ b/scripts/create_config
@@ -26,6 +26,10 @@ case $line in
# save for the next definitions
prefix=${line#*=}
;;
+ moddir=*)
+ eval "moddir=\"${line#*=}\""
+ echo "#define CONFIG_MODDIR \"$moddir\""
+ ;;
CONFIG_AUDIO_DRIVERS=*)
drivers=${line#*=}
echo "#define CONFIG_AUDIO_DRIVERS \\"
@@ -104,6 +108,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..4d0374a 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_MODDIR "/block/";
+ break;
+ case MODULE_LOAD_UI:
+ path = CONFIG_MODDIR "/ui/";
+ break;
+ case MODULE_LOAD_NET:
+ path = CONFIG_MODDIR "/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] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 4/8] module: implement module loading function Fam Zheng
@ 2013-09-11 15:48 ` Daniel P. Berrange
2013-09-11 18:33 ` Alex Bligh
2013-09-11 18:46 ` Richard Henderson
0 siblings, 2 replies; 40+ messages in thread
From: Daniel P. Berrange @ 2013-09-11 15:48 UTC (permalink / raw)
To: Fam Zheng
Cc: peter.maydell, mjt, qemu-devel, stefanha, pbonzini, vilanova, rth
On Wed, Sep 11, 2013 at 09:34:04PM +0800, Fam Zheng wrote:
> 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 | 28 ++++++++++++++++++---------
> include/qemu/module.h | 9 +++++++++
> linux-user/main.c | 3 +++
> scripts/create_config | 7 +++++++
> util/module.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
> vl.c | 2 ++
> 8 files changed, 97 insertions(+), 9 deletions(-)
After this change is applied, if you don't pass --enable-modules to
confoigure, then QEMU spams stdout at startup
Failed to open dir /home/berrange/usr/qemu-git/lib/qemu/ui/
Failed to open dir /home/berrange/usr/qemu-git/lib/qemu/net/
Failed to open dir /home/berrange/usr/qemu-git/lib/qemu/block/
If I do enable modules, QEMU still complains about the ui/ & net/
directories not existing.
> + dp = opendir(path);
> + if (!dp) {
> + fprintf(stderr, "Failed to open dir %s\n", path);
> + return;
> + }
> + for (ep = readdir(dp); ep; ep = readdir(dp)) {
By dynamically loading all modules found in the directory, with
not validity checks this opens the doorway for 3rd party vendors
to drop-in closed source modules to QEMU binaries.
Anthony's spec (http://wiki.qemu.org/Features/Modules) had said
"What this is not
A mechanism to support third party extensions to QEMU or
out of tree drivers/features
A stable interface
A GPL barrier
This system should not be (ab)used to allow 3rd-party modules
to be loaded into qemu, especially to "work around" GPL restrictions.
In order to ensure this, the modules system should be built in a way
to allow loading only modules which were built together with qemu,
by adding, for example, hashes of current build to the main exported
symbols."
We know the precise list of valid modules when building QEMU,
so IMHO, this should just explicitly load each known module
name, and *not* readdir. Also it should do something along the
lines suggested their of poisoning exported symbols with a
build hash to guarantee the modules loaded match the original
binary and that the symbols change on every rebuild.
The latter is important even ignoring the 3rd party module
question, since it ensures developers/users don't accidently
run with mis-match QEMU and module builds, which could lead
to some very hard to diagnose bugs / behaviour.
> + 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);
> + }
> + }
> +}
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-11 15:48 ` Daniel P. Berrange
@ 2013-09-11 18:33 ` Alex Bligh
2013-09-11 18:46 ` Richard Henderson
1 sibling, 0 replies; 40+ messages in thread
From: Alex Bligh @ 2013-09-11 18:33 UTC (permalink / raw)
To: Daniel P. Berrange, Fam Zheng
Cc: peter.maydell, Alex Bligh, mjt, qemu-devel, stefanha, pbonzini,
vilanova, rth
--On 11 September 2013 16:48:41 +0100 "Daniel P. Berrange"
<berrange@redhat.com> wrote:
> We know the precise list of valid modules when building QEMU,
> so IMHO, this should just explicitly load each known module
> name, and *not* readdir. Also it should do something along the
> lines suggested their of poisoning exported symbols with a
> build hash to guarantee the modules loaded match the original
> binary and that the symbols change on every rebuild.
>
> The latter is important even ignoring the 3rd party module
> question, since it ensures developers/users don't accidently
> run with mis-match QEMU and module builds, which could lead
> to some very hard to diagnose bugs / behaviour.
+1
Though in the interest of not having to recompile everything
for one minor change a .c file in qemu whilst developing,
perhaps we could just hash exported symbols and include that
hash, rather than ensuring the symbols change on (literally)
every rebuild. Else every dev will build with modules turned
off!
--
Alex Bligh
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-11 15:48 ` Daniel P. Berrange
2013-09-11 18:33 ` Alex Bligh
@ 2013-09-11 18:46 ` Richard Henderson
2013-09-12 3:02 ` Fam Zheng
1 sibling, 1 reply; 40+ messages in thread
From: Richard Henderson @ 2013-09-11 18:46 UTC (permalink / raw)
To: Daniel P. Berrange
Cc: peter.maydell, Fam Zheng, mjt, qemu-devel, stefanha, pbonzini,
vilanova
On 09/11/2013 08:48 AM, Daniel P. Berrange wrote:
> We know the precise list of valid modules when building QEMU,
> so IMHO, this should just explicitly load each known module
> name, and *not* readdir. Also it should do something along the
> lines suggested their of poisoning exported symbols with a
> build hash to guarantee the modules loaded match the original
> binary and that the symbols change on every rebuild.
We need not mangle the symbols, which could be complicated to
actually implement, and irritating to work around within gdb.
We could instead just add the build-id as a variable within
the module. Read and compare the build-id after loading the
module; unload and reject on mismatch.
r~
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-11 18:46 ` Richard Henderson
@ 2013-09-12 3:02 ` Fam Zheng
2013-09-12 5:36 ` Michael Tokarev
0 siblings, 1 reply; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 3:02 UTC (permalink / raw)
To: Richard Henderson
Cc: peter.maydell, mjt, qemu-devel, stefanha, pbonzini, vilanova
On Wed, 09/11 11:46, Richard Henderson wrote:
> On 09/11/2013 08:48 AM, Daniel P. Berrange wrote:
> > We know the precise list of valid modules when building QEMU,
> > so IMHO, this should just explicitly load each known module
> > name, and *not* readdir. Also it should do something along the
> > lines suggested their of poisoning exported symbols with a
> > build hash to guarantee the modules loaded match the original
> > binary and that the symbols change on every rebuild.
>
> We need not mangle the symbols, which could be complicated to
> actually implement, and irritating to work around within gdb.
>
Agree with this, some id or hash check should be enough.
> We could instead just add the build-id as a variable within
> the module. Read and compare the build-id after loading the
> module; unload and reject on mismatch.
>
>
> r~
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-12 3:02 ` Fam Zheng
@ 2013-09-12 5:36 ` Michael Tokarev
2013-09-12 9:13 ` Daniel P. Berrange
2013-09-12 11:59 ` Eric Blake
0 siblings, 2 replies; 40+ messages in thread
From: Michael Tokarev @ 2013-09-12 5:36 UTC (permalink / raw)
To: famz
Cc: peter.maydell, qemu-devel, stefanha, pbonzini, vilanova,
Richard Henderson
12.09.2013 07:02, Fam Zheng wrote.
> On Wed, 09/11 11:46, Richard Henderson wrote:
>> On 09/11/2013 08:48 AM, Daniel P. Berrange wrote:
>>> We know the precise list of valid modules when building QEMU,
>>> so IMHO, this should just explicitly load each known module
>>> name, and *not* readdir. Also it should do something along the
>>> lines suggested their of poisoning exported symbols with a
>>> build hash to guarantee the modules loaded match the original
>>> binary and that the symbols change on every rebuild.
>>
>> We need not mangle the symbols, which could be complicated to
>> actually implement, and irritating to work around within gdb.
>>
> Agree with this, some id or hash check should be enough.
A solution which I proposed at the very beginning -- to export
a "hashed" init function from modules, and call it from the
main executable. Like, instead of, say, qemu_module_init(),
call qemu_module_init_0xdeadbeaf(), where 0xdeadbeaf is a
hash of some build-dependent value. This should be enough
to keep it going.
Ofcourse, if a module lacks this function, it should not be
loaded.
Thanks,
/mjt
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-12 5:36 ` Michael Tokarev
@ 2013-09-12 9:13 ` Daniel P. Berrange
2013-09-12 11:59 ` Eric Blake
1 sibling, 0 replies; 40+ messages in thread
From: Daniel P. Berrange @ 2013-09-12 9:13 UTC (permalink / raw)
To: Michael Tokarev
Cc: peter.maydell, famz, qemu-devel, stefanha, pbonzini, vilanova,
Richard Henderson
On Thu, Sep 12, 2013 at 09:36:43AM +0400, Michael Tokarev wrote:
> 12.09.2013 07:02, Fam Zheng wrote.
> >On Wed, 09/11 11:46, Richard Henderson wrote:
> >>On 09/11/2013 08:48 AM, Daniel P. Berrange wrote:
> >>>We know the precise list of valid modules when building QEMU,
> >>>so IMHO, this should just explicitly load each known module
> >>>name, and *not* readdir. Also it should do something along the
> >>>lines suggested their of poisoning exported symbols with a
> >>>build hash to guarantee the modules loaded match the original
> >>>binary and that the symbols change on every rebuild.
> >>
> >>We need not mangle the symbols, which could be complicated to
> >>actually implement, and irritating to work around within gdb.
> >>
> >Agree with this, some id or hash check should be enough.
>
> A solution which I proposed at the very beginning -- to export
> a "hashed" init function from modules, and call it from the
> main executable. Like, instead of, say, qemu_module_init(),
> call qemu_module_init_0xdeadbeaf(), where 0xdeadbeaf is a
> hash of some build-dependent value. This should be enough
> to keep it going.
>
> Ofcourse, if a module lacks this function, it should not be
> loaded.
Yep, that would be a reasonable way todo this. THe current
patches use attribute(constructor) so QEMU doesn't actually
call any explicit init function after dlopen()ing. That could
easily be changed though.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-12 5:36 ` Michael Tokarev
2013-09-12 9:13 ` Daniel P. Berrange
@ 2013-09-12 11:59 ` Eric Blake
2013-09-12 12:44 ` Daniel P. Berrange
1 sibling, 1 reply; 40+ messages in thread
From: Eric Blake @ 2013-09-12 11:59 UTC (permalink / raw)
To: Michael Tokarev
Cc: peter.maydell, famz, qemu-devel, stefanha, pbonzini, vilanova,
Richard Henderson
[-- Attachment #1: Type: text/plain, Size: 817 bytes --]
On 09/11/2013 11:36 PM, Michael Tokarev wrote:
>
> A solution which I proposed at the very beginning -- to export
> a "hashed" init function from modules, and call it from the
> main executable. Like, instead of, say, qemu_module_init(),
> call qemu_module_init_0xdeadbeaf(), where 0xdeadbeaf is a
> hash of some build-dependent value. This should be enough
> to keep it going.
And of course, since we store sources in git, you already have such a
hash value at your disposal:
$CC -DBUILD_HASH=$(git rev-parse HEAD) ...
coupled with
glue(qemu_module_init_, BUILD_HASH)
where the only trick is to figure out how to bake in a hash when
building from a released tarball rather than git.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 621 bytes --]
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
2013-09-12 11:59 ` Eric Blake
@ 2013-09-12 12:44 ` Daniel P. Berrange
0 siblings, 0 replies; 40+ messages in thread
From: Daniel P. Berrange @ 2013-09-12 12:44 UTC (permalink / raw)
To: Eric Blake
Cc: peter.maydell, famz, Michael Tokarev, qemu-devel, stefanha,
pbonzini, vilanova, Richard Henderson
On Thu, Sep 12, 2013 at 05:59:30AM -0600, Eric Blake wrote:
> On 09/11/2013 11:36 PM, Michael Tokarev wrote:
> >
> > A solution which I proposed at the very beginning -- to export
> > a "hashed" init function from modules, and call it from the
> > main executable. Like, instead of, say, qemu_module_init(),
> > call qemu_module_init_0xdeadbeaf(), where 0xdeadbeaf is a
> > hash of some build-dependent value. This should be enough
> > to keep it going.
>
> And of course, since we store sources in git, you already have such a
> hash value at your disposal:
> $CC -DBUILD_HASH=$(git rev-parse HEAD) ...
> coupled with
> glue(qemu_module_init_, BUILD_HASH)
> where the only trick is to figure out how to bake in a hash when
> building from a released tarball rather than git.
IMHO we want this to change any time you do './configure', so I would
not tie this to git hash - we don't want all users of particular
release tar.gz to have the same hash regardless of configure options.
We want a situation where any time a distro builds an RPM or equiv,
a new hash is used. So to me generating it in 'configure' seems like
a reasonable place.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 40+ messages in thread
* [Qemu-devel] [PATCH v6 5/8] configure: introduce --enable-modules
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
` (3 preceding siblings ...)
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 4/8] module: implement module loading function Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 13:46 ` Paolo Bonzini
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 6/8] Makefile: install modules with "make install" Fam Zheng
` (3 subsequent siblings)
8 siblings, 1 reply; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 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.target | 6 +++++-
configure | 8 ++++++++
rules.mak | 6 +++++-
3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/Makefile.target b/Makefile.target
index 87906ea..7fb9e4d 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 a80f143..275b1a0 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"
@@ -651,6 +652,8 @@ for opt do
;;
--disable-debug-info)
;;
+ --enable-modules) modules="yes"
+ ;;
--cpu=*)
;;
--target-list=*) target_list="$optarg"
@@ -1056,6 +1059,7 @@ echo " --moddir=PATH install modules 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)"
@@ -3585,6 +3589,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"
@@ -3703,6 +3708,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.
diff --git a/rules.mak b/rules.mak
index 9275d91..22492a9 100644
--- a/rules.mak
+++ b/rules.mak
@@ -187,6 +187,10 @@ $(if $1,$(foreach v,$(nested-vars),$(eval \
$(foreach v,$(filter %-m,$(nested-vars)), \
$(call add-modules,$v))
-$(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m)))
+$(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] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 5/8] configure: introduce --enable-modules
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 5/8] configure: introduce --enable-modules Fam Zheng
@ 2013-09-11 13:46 ` Paolo Bonzini
2013-09-12 2:06 ` Fam Zheng
0 siblings, 1 reply; 40+ messages in thread
From: Paolo Bonzini @ 2013-09-11 13:46 UTC (permalink / raw)
To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
Il 11/09/2013 15:34, Fam Zheng ha scritto:
> 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.target | 6 +++++-
> configure | 8 ++++++++
> rules.mak | 6 +++++-
> 3 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/Makefile.target b/Makefile.target
> index 87906ea..7fb9e4d 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)
>
This would have to be in patch 3; in fact, it probably makes sense to
squash the two together.
Paolo
> # Now restore obj-y
> obj-y := $(obj-y-save)
> diff --git a/configure b/configure
> index a80f143..275b1a0 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"
> @@ -651,6 +652,8 @@ for opt do
> ;;
> --disable-debug-info)
> ;;
> + --enable-modules) modules="yes"
> + ;;
> --cpu=*)
> ;;
> --target-list=*) target_list="$optarg"
> @@ -1056,6 +1059,7 @@ echo " --moddir=PATH install modules 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)"
> @@ -3585,6 +3589,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"
> @@ -3703,6 +3708,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.
> diff --git a/rules.mak b/rules.mak
> index 9275d91..22492a9 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -187,6 +187,10 @@ $(if $1,$(foreach v,$(nested-vars),$(eval \
> $(foreach v,$(filter %-m,$(nested-vars)), \
> $(call add-modules,$v))
>
> -$(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m)))
> +$(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
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 5/8] configure: introduce --enable-modules
2013-09-11 13:46 ` Paolo Bonzini
@ 2013-09-12 2:06 ` Fam Zheng
0 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:06 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
On Wed, 09/11 15:46, Paolo Bonzini wrote:
> Il 11/09/2013 15:34, Fam Zheng ha scritto:
> > 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.target | 6 +++++-
> > configure | 8 ++++++++
> > rules.mak | 6 +++++-
> > 3 files changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/Makefile.target b/Makefile.target
> > index 87906ea..7fb9e4d 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)
> >
>
> This would have to be in patch 3; in fact, it probably makes sense to
> squash the two together.
>
OK, will do it.
> > # Now restore obj-y
> > obj-y := $(obj-y-save)
> > diff --git a/configure b/configure
> > index a80f143..275b1a0 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"
> > @@ -651,6 +652,8 @@ for opt do
> > ;;
> > --disable-debug-info)
> > ;;
> > + --enable-modules) modules="yes"
> > + ;;
> > --cpu=*)
> > ;;
> > --target-list=*) target_list="$optarg"
> > @@ -1056,6 +1059,7 @@ echo " --moddir=PATH install modules 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)"
> > @@ -3585,6 +3589,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"
> > @@ -3703,6 +3708,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.
> > diff --git a/rules.mak b/rules.mak
> > index 9275d91..22492a9 100644
> > --- a/rules.mak
> > +++ b/rules.mak
> > @@ -187,6 +187,10 @@ $(if $1,$(foreach v,$(nested-vars),$(eval \
> > $(foreach v,$(filter %-m,$(nested-vars)), \
> > $(call add-modules,$v))
> >
> > -$(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m)))
> > +$(if $(CONFIG_MODULES), \
> > + $(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))) \
Missing comma here: ^
Objects won't be static linked without --enable-modules.
Fam
> > + $(foreach v,$(filter %-m,$(nested-vars)), \
> > + $(eval $(patsubst %-m,%-y,$v) += $($v)) \
> > + $(eval $v := )))
> >
> > endef
> >
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* [Qemu-devel] [PATCH v6 6/8] Makefile: install modules with "make install"
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
` (4 preceding siblings ...)
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 5/8] configure: introduce --enable-modules Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 13:50 ` Paolo Bonzini
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
` (2 subsequent siblings)
8 siblings, 1 reply; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth
Install all the subdirs for modules under configure option "moddir".
Signed-off-by: Fam Zheng <famz@redhat.com>
---
Makefile | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Makefile b/Makefile
index c50b4b3..ca84d32 100644
--- a/Makefile
+++ b/Makefile
@@ -360,6 +360,12 @@ install-datadir install-localstatedir
ifneq ($(TOOLS),)
$(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
endif
+ifneq ($(CONFIG_MODULES),)
+ for s in $(patsubst %.mo,%.so,$(modules-m)); do \
+ $(INSTALL_DIR) "$(DESTDIR)$(moddir)/$$(dirname $$s)"; \
+ $(INSTALL_PROG) $(STRIP_OPT) $$s "$(DESTDIR)$(moddir)/$$(dirname $$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] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 6/8] Makefile: install modules with "make install"
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 6/8] Makefile: install modules with "make install" Fam Zheng
@ 2013-09-11 13:50 ` Paolo Bonzini
2013-09-12 2:00 ` Fam Zheng
0 siblings, 1 reply; 40+ messages in thread
From: Paolo Bonzini @ 2013-09-11 13:50 UTC (permalink / raw)
To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
Il 11/09/2013 15:34, Fam Zheng ha scritto:
> Install all the subdirs for modules under configure option "moddir".
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> Makefile | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/Makefile b/Makefile
> index c50b4b3..ca84d32 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -360,6 +360,12 @@ install-datadir install-localstatedir
> ifneq ($(TOOLS),)
> $(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
> endif
> +ifneq ($(CONFIG_MODULES),)
Perhaps modules-m instead of CONFIG_MODULES would be more clearer given
the "for" line immediately below.
> + for s in $(patsubst %.mo,%.so,$(modules-m)); do \
DSOSUF here.
> + $(INSTALL_DIR) "$(DESTDIR)$(moddir)/$$(dirname $$s)"; \
> + $(INSTALL_PROG) $(STRIP_OPT) $$s "$(DESTDIR)$(moddir)/$$(dirname $$s)"; \
Paolo
> + done
> +endif
> ifneq ($(HELPERS-y),)
> $(INSTALL_DIR) "$(DESTDIR)$(libexecdir)"
> $(INSTALL_PROG) $(STRIP_OPT) $(HELPERS-y) "$(DESTDIR)$(libexecdir)"
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 6/8] Makefile: install modules with "make install"
2013-09-11 13:50 ` Paolo Bonzini
@ 2013-09-12 2:00 ` Fam Zheng
0 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:00 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: peter.maydell, mjt, qemu-devel, stefanha, vilanova, rth
On Wed, 09/11 15:50, Paolo Bonzini wrote:
> Il 11/09/2013 15:34, Fam Zheng ha scritto:
> > Install all the subdirs for modules under configure option "moddir".
> >
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> > Makefile | 6 ++++++
> > 1 file changed, 6 insertions(+)
> >
> > diff --git a/Makefile b/Makefile
> > index c50b4b3..ca84d32 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -360,6 +360,12 @@ install-datadir install-localstatedir
> > ifneq ($(TOOLS),)
> > $(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
> > endif
> > +ifneq ($(CONFIG_MODULES),)
>
> Perhaps modules-m instead of CONFIG_MODULES would be more clearer given
> the "for" line immediately below.
modules-m has things even configured without --enable-modules, I think we don't install .so here.
>
> > + for s in $(patsubst %.mo,%.so,$(modules-m)); do \
>
> DSOSUF here.
OK.
Fam
>
> > + $(INSTALL_DIR) "$(DESTDIR)$(moddir)/$$(dirname $$s)"; \
> > + $(INSTALL_PROG) $(STRIP_OPT) $$s "$(DESTDIR)$(moddir)/$$(dirname $$s)"; \
>
> Paolo
>
> > + done
> > +endif
> > ifneq ($(HELPERS-y),)
> > $(INSTALL_DIR) "$(DESTDIR)$(libexecdir)"
> > $(INSTALL_PROG) $(STRIP_OPT) $(HELPERS-y) "$(DESTDIR)$(libexecdir)"
> >
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* [Qemu-devel] [PATCH v6 7/8] .gitignore: ignore module related files (dll, so, mo)
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
` (5 preceding siblings ...)
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 6/8] Makefile: install modules with "make install" Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 8/8] block: convert block drivers linked with libs to modules Fam Zheng
2013-09-11 16:26 ` [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Peter Maydell
8 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, 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 d2c5c2f..4d0ac09 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] 40+ messages in thread
* [Qemu-devel] [PATCH v6 8/8] block: convert block drivers linked with libs to modules
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
` (6 preceding siblings ...)
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
@ 2013-09-11 13:34 ` Fam Zheng
2013-09-11 15:41 ` Daniel P. Berrange
2013-09-11 16:26 ` [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Peter Maydell
8 siblings, 1 reply; 40+ messages in thread
From: Fam Zheng @ 2013-09-11 13:34 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, stefanha, pbonzini, vilanova, rth
The converted block drivers are:
curl
iscsi
rbd
ssh
glusterfs
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>
---
block/Makefile.objs | 11 ++++++++++-
configure | 33 +++++++++++++++------------------
2 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/block/Makefile.objs b/block/Makefile.objs
index 3bb85b5..f98d379 100644
--- a/block/Makefile.objs
+++ b/block/Makefile.objs
@@ -23,4 +23,13 @@ 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)
diff --git a/configure b/configure
index 275b1a0..2f02b3d 100755
--- a/configure
+++ b/configure
@@ -2221,8 +2221,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"
@@ -2382,8 +2380,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"
@@ -2400,9 +2396,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"
@@ -2618,9 +2611,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
@@ -2988,11 +2978,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"
@@ -3907,8 +3895,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
@@ -3997,7 +3986,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
@@ -4018,7 +4009,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
@@ -4056,7 +4049,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
@@ -4064,7 +4059,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] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 8/8] block: convert block drivers linked with libs to modules
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 8/8] block: convert block drivers linked with libs to modules Fam Zheng
@ 2013-09-11 15:41 ` Daniel P. Berrange
2013-09-12 2:07 ` Fam Zheng
0 siblings, 1 reply; 40+ messages in thread
From: Daniel P. Berrange @ 2013-09-11 15:41 UTC (permalink / raw)
To: Fam Zheng
Cc: peter.maydell, mjt, qemu-devel, stefanha, pbonzini, vilanova, rth
On Wed, Sep 11, 2013 at 09:34:08PM +0800, Fam Zheng wrote:
> The converted block drivers are:
>
> curl
> iscsi
> rbd
> ssh
> glusterfs
>
> 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>
> ---
> block/Makefile.objs | 11 ++++++++++-
> configure | 33 +++++++++++++++------------------
> 2 files changed, 25 insertions(+), 19 deletions(-)
After this is applied, I can no longer use http:/// URIs with the
curl driver, if I do not build with '--enable-modules' passed to
configure.
$ ~/usr/qemu-git/bin/qemu-system-x86_64 -cdrom http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso
qemu-system-x86_64: -cdrom http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso: Unknown protocol
qemu-system-x86_64: -cdrom http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso: could not open disk image http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso: No such file or directory
So it seems driver registration is broken in some way when modules aren't
enabled at compile time.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 8/8] block: convert block drivers linked with libs to modules
2013-09-11 15:41 ` Daniel P. Berrange
@ 2013-09-12 2:07 ` Fam Zheng
0 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 2:07 UTC (permalink / raw)
To: Daniel P. Berrange
Cc: peter.maydell, mjt, qemu-devel, stefanha, pbonzini, vilanova, rth
On Wed, 09/11 16:41, Daniel P. Berrange wrote:
> On Wed, Sep 11, 2013 at 09:34:08PM +0800, Fam Zheng wrote:
> > The converted block drivers are:
> >
> > curl
> > iscsi
> > rbd
> > ssh
> > glusterfs
> >
> > 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>
> > ---
> > block/Makefile.objs | 11 ++++++++++-
> > configure | 33 +++++++++++++++------------------
> > 2 files changed, 25 insertions(+), 19 deletions(-)
>
> After this is applied, I can no longer use http:/// URIs with the
> curl driver, if I do not build with '--enable-modules' passed to
> configure.
>
> $ ~/usr/qemu-git/bin/qemu-system-x86_64 -cdrom http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso
> qemu-system-x86_64: -cdrom http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso: Unknown protocol
> qemu-system-x86_64: -cdrom http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso: could not open disk image http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux//releases/19/Fedora/x86_64/os/images/boot.iso: No such file or directory
>
>
> So it seems driver registration is broken in some way when modules aren't
> enabled at compile time.
>
Yes, patch 05 is broken (see my reply there). Thanks for pointing out.
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
` (7 preceding siblings ...)
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 8/8] block: convert block drivers linked with libs to modules Fam Zheng
@ 2013-09-11 16:26 ` Peter Maydell
2013-09-12 3:08 ` Fam Zheng
8 siblings, 1 reply; 40+ messages in thread
From: Peter Maydell @ 2013-09-11 16:26 UTC (permalink / raw)
To: Fam Zheng
Cc: Michael Tokarev, QEMU Developers, Stefan Hajnoczi, Paolo Bonzini,
Lluís Vilanova, Richard Henderson
On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
> This series implements feature of shared object building as described in:
>
> http://wiki.qemu.org/Features/Modules
> v6: Dropping RFC.
...which I guess makes it a reasonable time to mention that
this doesn't build on MacOSX/clang:
cc -m64 -DOS_OBJECT_USE_OBJC=0 -arch x86_64 -D_GNU_SOURCE
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes
-Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes
-fno-strict-aliasing -Wno-initializer-overrides -Wendif-labels
-Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security
-Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-definition
-Wtype-limits -fstack-protector-all -I/sw/include
-I/sw/include/libpng15 -I/opt/X11/include/pixman-1
-I/Users/pm215/src/qemu/dtc/libfdt -I/Users/pm215/src/qemu/tests -I
qga/qapi-generated -I/sw/include/glib-2.0 -I/sw/lib/glib-2.0/include
-I/sw/include/glib-2.0 -I/sw/lib/glib-2.0/include -g -m64 -framework
CoreFoundation -framework IOKit -arch x86_64 -g -o qemu-ga
-L/sw/lib -lgmodule-2.0 -lglib-2.0 -lintl -L/sw/lib -lgthread-2.0
-lglib-2.0 -lintl
Undefined symbols for architecture x86_64:
"_main", referenced from:
-u command line option
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
...which looks like we're trying to link qemu-ga but not specifying
any object files at all, with the result that the linker complains that
we haven't provided a main() function.
-- PMM
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support
2013-09-11 16:26 ` [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Peter Maydell
@ 2013-09-12 3:08 ` Fam Zheng
0 siblings, 0 replies; 40+ messages in thread
From: Fam Zheng @ 2013-09-12 3:08 UTC (permalink / raw)
To: Peter Maydell
Cc: Michael Tokarev, QEMU Developers, Stefan Hajnoczi, Paolo Bonzini,
Lluís Vilanova, Richard Henderson
On Wed, 09/11 17:26, Peter Maydell wrote:
> On 11 September 2013 14:34, Fam Zheng <famz@redhat.com> wrote:
> > This series implements feature of shared object building as described in:
> >
> > http://wiki.qemu.org/Features/Modules
>
> > v6: Dropping RFC.
>
> ...which I guess makes it a reasonable time to mention that
> this doesn't build on MacOSX/clang:
>
> cc -m64 -DOS_OBJECT_USE_OBJC=0 -arch x86_64 -D_GNU_SOURCE
> -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes
> -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes
> -fno-strict-aliasing -Wno-initializer-overrides -Wendif-labels
> -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security
> -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-definition
> -Wtype-limits -fstack-protector-all -I/sw/include
> -I/sw/include/libpng15 -I/opt/X11/include/pixman-1
> -I/Users/pm215/src/qemu/dtc/libfdt -I/Users/pm215/src/qemu/tests -I
> qga/qapi-generated -I/sw/include/glib-2.0 -I/sw/lib/glib-2.0/include
> -I/sw/include/glib-2.0 -I/sw/lib/glib-2.0/include -g -m64 -framework
> CoreFoundation -framework IOKit -arch x86_64 -g -o qemu-ga
> -L/sw/lib -lgmodule-2.0 -lglib-2.0 -lintl -L/sw/lib -lgthread-2.0
> -lglib-2.0 -lintl
> Undefined symbols for architecture x86_64:
> "_main", referenced from:
> -u command line option
> ld: symbol(s) not found for architecture x86_64
> clang: error: linker command failed with exit code 1 (use -v to see invocation)
>
> ...which looks like we're trying to link qemu-ga but not specifying
> any object files at all, with the result that the linker complains that
> we haven't provided a main() function.
>
Yes, the same bug with patch 03 without libtool, fixed here. Thanks.
Fam
^ permalink raw reply [flat|nested] 40+ messages in thread