[Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO

2013-09-10 Thread Fam Zheng
Add necessary rules and flags for shared object generation.
$(common-obj-m) will include $(block-obj-m), like $(common-obj-y) does
for $(block-obj-y). The new rules introduced here are:

0) For all %.so compiling:

QEMU_CFLAGS += -fPIC

1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so.

2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern
matching in Makefile. It's linked to -shared with all its dependencies
(multiple *.o) as input. Which means the list of depended objects must
be ruled out in each sub-Makefile.objs with:

$(obj)/foo.mo : $(addprefix $(obj)/, bar.o baz.o qux.o)

With target and dependencies both prefixed with $(obj)/.

Signed-off-by: Fam Zheng f...@redhat.com
---
 Makefile  | 20 +++-
 Makefile.objs |  2 ++
 configure |  6 ++
 rules.mak | 26 +++---
 4 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/Makefile b/Makefile
index 9e603c6..3685bbd 100644
--- a/Makefile
+++ b/Makefile
@@ -125,7 +125,9 @@ dummy := $(call unnest-vars,, \
 util-obj-y \
 qga-obj-y \
 block-obj-y \
-common-obj-y)
+block-obj-m \
+common-obj-y \
+common-obj-m)
 
 ifneq ($(wildcard config-host.mak),)
 include $(SRC_PATH)/tests/Makefile
@@ -133,6 +135,18 @@ endif
 
 all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
 
+define add-modules
+$(foreach o,$(filter %.o,$($1)),$(eval \
+   $(patsubst %.o,%.mo,$o): $o))
+$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+endef
+
+dummy := $(call add-modules,block-obj-m)
+dummy := $(call add-modules,common-obj-m)
+
+modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))
+all: modules
+
 vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
 
 vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
@@ -249,6 +263,10 @@ clean:
rm -f qemu-options.def
find . -name '*.[oda]' -type f -exec rm -f {} +
find . -name '*.l[oa]' -type f -exec rm -f {} +
+   find . -name '*.so' -type f -exec rm -f {} +
+   find . -name '*.mo' -type f -exec rm -f {} +
+   find . -name '*.dll' -type f -exec rm -f {} +
+
rm -f $(TOOLS) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
rm -Rf .libs
rm -f qemu-img-cmds.h
diff --git a/Makefile.objs b/Makefile.objs
index 4f7a364..023166b 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -19,6 +19,8 @@ block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o 
qemu-coroutine-io.o
 block-obj-y += qemu-coroutine-sleep.o
 block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
 
+block-obj-m = block/
+
 ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
 # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
 # only pull in the actual virtio-9p device if we also enabled virtio.
diff --git a/configure b/configure
index cc3cd4d..c6d4a62 100755
--- a/configure
+++ b/configure
@@ -190,6 +190,8 @@ mingw32=no
 gcov=no
 gcov_tool=gcov
 EXESUF=
+DSOSUF=.so
+LDFLAGS_SHARED=-shared
 prefix=/usr/local
 mandir=\${prefix}/share/man
 datadir=\${prefix}/share
@@ -485,6 +487,7 @@ OpenBSD)
 Darwin)
   bsd=yes
   darwin=yes
+  LDFLAGS_SHARED=-bundle
   if [ $cpu = x86_64 ] ; then
 QEMU_CFLAGS=-arch x86_64 $QEMU_CFLAGS
 LDFLAGS=-arch x86_64 $LDFLAGS
@@ -584,6 +587,7 @@ fi
 
 if test $mingw32 = yes ; then
   EXESUF=.exe
+  DSOSUF=.dll
   QEMU_CFLAGS=-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS
   # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
   QEMU_CFLAGS=-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS
@@ -4175,6 +4179,8 @@ echo LIBTOOLFLAGS=$LIBTOOLFLAGS  $config_host_mak
 echo LIBS+=$LIBS  $config_host_mak
 echo LIBS_TOOLS+=$libs_tools  $config_host_mak
 echo EXESUF=$EXESUF  $config_host_mak
+echo DSOSUF=$DSOSUF  $config_host_mak
+echo LDFLAGS_SHARED=$LDFLAGS_SHARED  $config_host_mak
 echo LIBS_QGA+=$libs_qga  $config_host_mak
 echo POD2MAN=$POD2MAN  $config_host_mak
 echo TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS  $config_host_mak
diff --git a/rules.mak b/rules.mak
index 6342d60..2be7901 100644
--- a/rules.mak
+++ b/rules.mak
@@ -18,6 +18,10 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
 QEMU_INCLUDES += -I$(D) -I$(@D)
 
 extract-libs = $(strip $(foreach o,$1,$($o-libs)))
+expand-objs = $(strip $(sort $(filter %.o,$1)) \
+ $(if $(realpath $(filter %.mo,$1)), \
+   $(shell cat $(realpath $(filter %.mo,$1 \
+ $(filter-out %.o %.mo,$1))
 
 %.o: %.c
$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) 
$(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $,  CC$(TARGET_DIR)$@)
@@ -26,8 +30,8 @@ extract-libs = $(strip $(foreach o,$1,$($o-libs)))
 
 ifeq ($(LIBTOOL),)
 LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
-   $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
-   $(call extract-libs,$^) $(LIBS),  LINK  $(TARGET_DIR)$@)
+   $(call expand-objs $1) 

Re: [Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO

2013-09-10 Thread Paolo Bonzini
Il 10/09/2013 15:16, Fam Zheng ha scritto:
 Add necessary rules and flags for shared object generation.
 $(common-obj-m) will include $(block-obj-m), like $(common-obj-y) does
 for $(block-obj-y). The new rules introduced here are:
 
 0) For all %.so compiling:
 
 QEMU_CFLAGS += -fPIC
 
 1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so.
 
 2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern
 matching in Makefile. It's linked to -shared with all its dependencies
 (multiple *.o) as input. Which means the list of depended objects must
 be ruled out in each sub-Makefile.objs with:
 
 $(obj)/foo.mo : $(addprefix $(obj)/, bar.o baz.o qux.o)
 
 With target and dependencies both prefixed with $(obj)/.

Just curious why you abandoned the foo.mo-objs idea.  But anyway it can
be implemented on top, together with dirs.

 Signed-off-by: Fam Zheng f...@redhat.com
 ---
  Makefile  | 20 +++-
  Makefile.objs |  2 ++
  configure |  6 ++
  rules.mak | 26 +++---
  4 files changed, 46 insertions(+), 8 deletions(-)
 
 diff --git a/Makefile b/Makefile
 index 9e603c6..3685bbd 100644
 --- a/Makefile
 +++ b/Makefile
 @@ -125,7 +125,9 @@ dummy := $(call unnest-vars,, \
  util-obj-y \
  qga-obj-y \
  block-obj-y \
 -common-obj-y)
 +block-obj-m \
 +common-obj-y \
 +common-obj-m)

Do block-obj-m and common-obj-m need to be expanded in Makefile.target too?

Perhaps unnest-vars should automatically handle both -y and -m variants;
possibly even call add-modules.  Even though it would be unused in
Makefile.target, it would keep all the logic in one place in rules.mak.

  ifneq ($(wildcard config-host.mak),)
  include $(SRC_PATH)/tests/Makefile
 @@ -133,6 +135,18 @@ endif
  
  all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
  
 +define add-modules
 +$(foreach o,$(filter %.o,$($1)),$(eval \
 + $(patsubst %.o,%.mo,$o): $o))
 +$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
 +endef
 +
 +dummy := $(call add-modules,block-obj-m)
 +dummy := $(call add-modules,common-obj-m)
 +
 +modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))
 +all: modules
 +
  vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
  
  vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
 @@ -249,6 +263,10 @@ clean:
   rm -f qemu-options.def
   find . -name '*.[oda]' -type f -exec rm -f {} +
   find . -name '*.l[oa]' -type f -exec rm -f {} +
 + find . -name '*.so' -type f -exec rm -f {} +
 + find . -name '*.mo' -type f -exec rm -f {} +
 + find . -name '*.dll' -type f -exec rm -f {} +
 +
   rm -f $(TOOLS) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
   rm -Rf .libs
   rm -f qemu-img-cmds.h
 diff --git a/Makefile.objs b/Makefile.objs
 index 4f7a364..023166b 100644
 --- a/Makefile.objs
 +++ b/Makefile.objs
 @@ -19,6 +19,8 @@ block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o 
 qemu-coroutine-io.o
  block-obj-y += qemu-coroutine-sleep.o
  block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
  
 +block-obj-m = block/
 +
  ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
  # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
  # only pull in the actual virtio-9p device if we also enabled virtio.
 diff --git a/configure b/configure
 index cc3cd4d..c6d4a62 100755
 --- a/configure
 +++ b/configure
 @@ -190,6 +190,8 @@ mingw32=no
  gcov=no
  gcov_tool=gcov
  EXESUF=
 +DSOSUF=.so
 +LDFLAGS_SHARED=-shared
  prefix=/usr/local
  mandir=\${prefix}/share/man
  datadir=\${prefix}/share
 @@ -485,6 +487,7 @@ OpenBSD)
  Darwin)
bsd=yes
darwin=yes
 +  LDFLAGS_SHARED=-bundle
if [ $cpu = x86_64 ] ; then
  QEMU_CFLAGS=-arch x86_64 $QEMU_CFLAGS
  LDFLAGS=-arch x86_64 $LDFLAGS
 @@ -584,6 +587,7 @@ fi
  
  if test $mingw32 = yes ; then
EXESUF=.exe
 +  DSOSUF=.dll
QEMU_CFLAGS=-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS
# enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
QEMU_CFLAGS=-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS
 @@ -4175,6 +4179,8 @@ echo LIBTOOLFLAGS=$LIBTOOLFLAGS  $config_host_mak
  echo LIBS+=$LIBS  $config_host_mak
  echo LIBS_TOOLS+=$libs_tools  $config_host_mak
  echo EXESUF=$EXESUF  $config_host_mak
 +echo DSOSUF=$DSOSUF  $config_host_mak
 +echo LDFLAGS_SHARED=$LDFLAGS_SHARED  $config_host_mak
  echo LIBS_QGA+=$libs_qga  $config_host_mak
  echo POD2MAN=$POD2MAN  $config_host_mak
  echo TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS  $config_host_mak
 diff --git a/rules.mak b/rules.mak
 index 6342d60..2be7901 100644
 --- a/rules.mak
 +++ b/rules.mak
 @@ -18,6 +18,10 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
  QEMU_INCLUDES += -I$(D) -I$(@D)
  
  extract-libs = $(strip $(foreach o,$1,$($o-libs)))
 +expand-objs = $(strip $(sort $(filter %.o,$1)) \
 +   $(if $(realpath $(filter %.mo,$1)), \
 + $(shell cat $(realpath $(filter %.mo,$1 \

Why 

Re: [Qemu-devel] [RFC PATCH v4 3/6] Makefile: introduce common-obj-m and block-obj-m for DSO

2013-09-10 Thread Fam Zheng
On Tue, 09/10 15:44, Paolo Bonzini wrote:
 Il 10/09/2013 15:16, Fam Zheng ha scritto:
  Add necessary rules and flags for shared object generation.
  $(common-obj-m) will include $(block-obj-m), like $(common-obj-y) does
  for $(block-obj-y). The new rules introduced here are:
  
  0) For all %.so compiling:
  
  QEMU_CFLAGS += -fPIC
  
  1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so.
  
  2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern
  matching in Makefile. It's linked to -shared with all its dependencies
  (multiple *.o) as input. Which means the list of depended objects must
  be ruled out in each sub-Makefile.objs with:
  
  $(obj)/foo.mo : $(addprefix $(obj)/, bar.o baz.o qux.o)
  
  With target and dependencies both prefixed with $(obj)/.
 
 Just curious why you abandoned the foo.mo-objs idea.  But anyway it can
 be implemented on top, together with dirs.
 

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

  Signed-off-by: Fam Zheng f...@redhat.com
  ---
   Makefile  | 20 +++-
   Makefile.objs |  2 ++
   configure |  6 ++
   rules.mak | 26 +++---
   4 files changed, 46 insertions(+), 8 deletions(-)
  
  diff --git a/Makefile b/Makefile
  index 9e603c6..3685bbd 100644
  --- a/Makefile
  +++ b/Makefile
  @@ -125,7 +125,9 @@ dummy := $(call unnest-vars,, \
   util-obj-y \
   qga-obj-y \
   block-obj-y \
  -common-obj-y)
  +block-obj-m \
  +common-obj-y \
  +common-obj-m)
 
 Do block-obj-m and common-obj-m need to be expanded in Makefile.target too?
 

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

 Perhaps unnest-vars should automatically handle both -y and -m variants;
 possibly even call add-modules.  Even though it would be unused in
 Makefile.target, it would keep all the logic in one place in rules.mak.
 

Good idea. I'll do it.

   ifneq ($(wildcard config-host.mak),)
   include $(SRC_PATH)/tests/Makefile
  @@ -133,6 +135,18 @@ endif
   
   all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
   
  +define add-modules
  +$(foreach o,$(filter %.o,$($1)),$(eval \
  +   $(patsubst %.o,%.mo,$o): $o))
  +$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
  +endef
  +
  +dummy := $(call add-modules,block-obj-m)
  +dummy := $(call add-modules,common-obj-m)
  +
  +modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))
  +all: modules
  +
   vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
   
   vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
  @@ -249,6 +263,10 @@ clean:
  rm -f qemu-options.def
  find . -name '*.[oda]' -type f -exec rm -f {} +
  find . -name '*.l[oa]' -type f -exec rm -f {} +
  +   find . -name '*.so' -type f -exec rm -f {} +
  +   find . -name '*.mo' -type f -exec rm -f {} +
  +   find . -name '*.dll' -type f -exec rm -f {} +
  +
  rm -f $(TOOLS) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
  rm -Rf .libs
  rm -f qemu-img-cmds.h
  diff --git a/Makefile.objs b/Makefile.objs
  index 4f7a364..023166b 100644
  --- a/Makefile.objs
  +++ b/Makefile.objs
  @@ -19,6 +19,8 @@ block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o 
  qemu-coroutine-io.o
   block-obj-y += qemu-coroutine-sleep.o
   block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
   
  +block-obj-m = block/
  +
   ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
   # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
   # only pull in the actual virtio-9p device if we also enabled virtio.
  diff --git a/configure b/configure
  index cc3cd4d..c6d4a62 100755
  --- a/configure
  +++ b/configure
  @@ -190,6 +190,8 @@ mingw32=no
   gcov=no
   gcov_tool=gcov
   EXESUF=
  +DSOSUF=.so
  +LDFLAGS_SHARED=-shared
   prefix=/usr/local
   mandir=\${prefix}/share/man
   datadir=\${prefix}/share
  @@ -485,6 +487,7 @@ OpenBSD)
   Darwin)
 bsd=yes
 darwin=yes
  +  LDFLAGS_SHARED=-bundle
 if [ $cpu = x86_64 ] ; then
   QEMU_CFLAGS=-arch x86_64 $QEMU_CFLAGS
   LDFLAGS=-arch x86_64 $LDFLAGS
  @@ -584,6 +587,7 @@ fi
   
   if test $mingw32 = yes ; then
 EXESUF=.exe
  +  DSOSUF=.dll
 QEMU_CFLAGS=-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS
 # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
 QEMU_CFLAGS=-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS
  @@ -4175,6 +4179,8 @@ echo LIBTOOLFLAGS=$LIBTOOLFLAGS  $config_host_mak
   echo LIBS+=$LIBS  $config_host_mak
   echo LIBS_TOOLS+=$libs_tools  $config_host_mak
   echo EXESUF=$EXESUF  $config_host_mak
  +echo DSOSUF=$DSOSUF  $config_host_mak
  +echo LDFLAGS_SHARED=$LDFLAGS_SHARED  $config_host_mak
   echo LIBS_QGA+=$libs_qga  $config_host_mak
   echo POD2MAN=$POD2MAN  $config_host_mak
   echo TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS  $config_host_mak
  diff --git