[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v12 4/8] build-sys: introduce common-obj-m and block
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v12 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO |
Date: |
Thu, 10 Oct 2013 19:26:12 +0800 |
Add necessary rules and flags for shared object generation.
$(common-obj-m) will include $(block-obj-m), like $(common-obj-y) does
for $(block-obj-y). The new rules introduced here are:
0) For all %.so compiling:
QEMU_CFLAGS += -fPIC
1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so.
2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern
matching in Makefile. It's linked to "-shared" with all its dependencies
(multiple *.o) as input. Which means the list of depended objects must
be specified in each sub-Makefile.objs:
foo.mo-objs := bar.o baz.o qux.o
in the same style with foo.o-cflags and foo.o-libs. The objects here
will be prefixed with "$(obj)/" if it's a subdirectory Makefile.objs.
Also introduce --enable-modules in configure, the option will enable
support of shared object build. Otherwise objects are static linked to
executables.
Signed-off-by: Fam Zheng <address@hidden>
---
Makefile | 9 +++++++--
Makefile.objs | 2 ++
Makefile.target | 6 +++++-
configure | 14 ++++++++++++++
rules.mak | 54 +++++++++++++++++++++++++++++++++++++++++++++---------
5 files changed, 73 insertions(+), 12 deletions(-)
diff --git a/Makefile b/Makefile
index 44eb55e..a8488d6 100644
--- a/Makefile
+++ b/Makefile
@@ -122,7 +122,9 @@ dummy := $(call unnest-vars,, \
util-obj-y \
qga-obj-y \
block-obj-y \
- common-obj-y)
+ block-obj-m \
+ common-obj-y \
+ common-obj-m)
ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/tests/Makefile
@@ -131,7 +133,7 @@ ifeq ($(CONFIG_SMARTCARD_NSS),y)
include $(SRC_PATH)/libcacard/Makefile
endif
-all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
+all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules
vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
@@ -249,6 +251,9 @@ clean:
rm -f qemu-options.def
find . -name '*.[oda]' -type f -exec rm -f {} +
find . -name '*.l[oa]' -type f -exec rm -f {} +
+ find . -name '*.so' -type f -exec rm -f {} +
+ find . -name '*.mo' -type f -exec rm -f {} +
+ find . -name '*.dll' -type f -exec rm -f {} +
rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.*
*.pod *~ */*~
rm -f fsdev/*.pod
rm -rf .libs */.libs
diff --git a/Makefile.objs b/Makefile.objs
index 91235a6..072d2e5 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -19,6 +19,8 @@ block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o
qemu-coroutine-io.o
block-obj-y += qemu-coroutine-sleep.o
block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
+block-obj-m = block/
+
ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
# Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
# only pull in the actual virtio-9p device if we also enabled virtio.
diff --git a/Makefile.target b/Makefile.target
index 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 f66adb7..7b8771a 100755
--- a/configure
+++ b/configure
@@ -190,6 +190,9 @@ mingw32="no"
gcov="no"
gcov_tool="gcov"
EXESUF=""
+DSOSUF=".so"
+LDFLAGS_SHARED="-shared"
+modules="no"
prefix="/usr/local"
mandir="\${prefix}/share/man"
datadir="\${prefix}/share"
@@ -496,6 +499,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"
@@ -591,6 +595,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"
@@ -655,6 +660,8 @@ for opt do
;;
--disable-debug-info)
;;
+ --enable-modules) modules="yes"
+ ;;
--cpu=*)
;;
--target-list=*) target_list="$optarg"
@@ -1080,6 +1087,7 @@ echo " --libdir=PATH install libraries in
PATH"
echo " --sysconfdir=PATH install config in PATH$confsuffix"
echo " --localstatedir=PATH install local state in PATH (set at runtime
on win32)"
echo " --with-confsuffix=SUFFIX suffix for QEMU data inside datadir and
sysconfdir [$confsuffix]"
+echo " --enable-modules enable modules support"
echo " --enable-debug-tcg enable TCG debugging"
echo " --disable-debug-tcg disable TCG debugging (default)"
echo " --enable-debug-info enable debugging information (default)"
@@ -3677,6 +3685,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"
@@ -3795,6 +3804,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
aarch64 | arm | i386 | x86_64 | x32 | ppc*)
# The TCG interpreter currently does not support ld/st optimization.
@@ -4275,6 +4287,8 @@ echo "LIBTOOLFLAGS=$LIBTOOLFLAGS" >> $config_host_mak
echo "LIBS+=$LIBS" >> $config_host_mak
echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
echo "EXESUF=$EXESUF" >> $config_host_mak
+echo "DSOSUF=$DSOSUF" >> $config_host_mak
+echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
echo "POD2MAN=$POD2MAN" >> $config_host_mak
echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
diff --git a/rules.mak b/rules.mak
index e732261..2ff2f16 100644
--- a/rules.mak
+++ b/rules.mak
@@ -21,7 +21,11 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
# Same as -I$(SRC_PATH) -I., but for the nested source/object directories
QEMU_INCLUDES += -I$(<D) -I$(@D)
-extract-libs = $(strip $(foreach o,$1,$($o-libs)))
+extract-libs = $(strip $(sort $(foreach o,$1,$($o-libs)) \
+ $(foreach o,$(call expand-objs,$1),$($o-libs))))
+expand-objs = $(strip $(sort $(filter %.o,$1)) \
+ $(foreach o,$(filter %.mo,$1),$($o-objs)) \
+ $(filter-out %.o %.mo,$1))
%.o: %.c
$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS)
$(QEMU_DGFLAGS) $(CFLAGS) $(address@hidden) -c -o $@ $<," CC
$(TARGET_DIR)$@")
@@ -30,8 +34,8 @@ extract-libs = $(strip $(foreach o,$1,$($o-libs)))
ifeq ($(LIBTOOL),)
LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
- $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
- $(call extract-libs,$^) $(LIBS)," LINK $(TARGET_DIR)$@")
+ $(call expand-objs,$1) $(version-obj-y) \
+ $(call extract-libs,$1) $(LIBS)," LINK $(TARGET_DIR)$@")
else
LIBTOOL += $(if $(V),,--quiet)
%.lo: %.c
@@ -42,12 +46,12 @@ LIBTOOL += $(if $(V),,--quiet)
$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC dtrace -o $@ -G
-s $<, " lt GEN $(TARGET_DIR)$@")
LINK = $(call quiet-command,\
- $(if $(filter %.lo %.la,$^),$(LIBTOOL) --mode=link --tag=CC \
+ $(if $(filter %.lo %.la,$1),$(LIBTOOL) --mode=link --tag=CC \
)$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
- $(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
- $(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
- $(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
- $(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ",
" LINK ")"$(TARGET_DIR)$@")
+ $(call expand-objs,$1) \
+ $(if $(filter %.lo %.la,$1),$(version-lobj-y),$(version-obj-y)) \
+ $(if $(filter %.lo %.la,$1),$(LIBTOOLFLAGS)) \
+ $(call extract-libs,$1) $(LIBS),$(if $(filter %.lo %.la,$1),"lt LINK ",
" LINK ")"$(TARGET_DIR)$@")
endif
%.asm: %.S
@@ -65,6 +69,17 @@ endif
%.o: %.dtrace
$(call quiet-command,dtrace -o $@ -G -s $<, " GEN $(TARGET_DIR)$@")
+%$(DSOSUF): QEMU_CFLAGS += -fPIC
+%$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
+%$(DSOSUF): %.mo libqemustub.a
+ $(call LINK,$^)
+
+.PHONY: modules
+modules:
+
+%.mo:
+ $(call quiet-command,touch $@," GEN $(TARGET_DIR)$@")
+
%$(EXESUF): %.o
$(call LINK,$^)
@@ -130,7 +145,10 @@ $(foreach v,$($1), \
$(eval $v-cflags := )) \
$(if $($v-libs), \
$(eval $2$v-libs := $($v-libs)) \
- $(eval $v-libs := )))
+ $(eval $v-libs := )) \
+ $(if $($v-objs), \
+ $(eval $2$v-objs := $(addprefix $2,$($v-objs))) \
+ $(eval $v-objs := )))
endef
define unnest-dir
@@ -154,6 +172,15 @@ $(if $(nested-dirs),
$(call unnest-vars-1))
endef
+define add-modules
+$(foreach o,$(filter %.o,$($1)),
+ $(eval $(patsubst %.o,%.mo,$o): $o) \
+ $(eval $(patsubst %.o,%.mo,$o)-objs := $o))
+$(foreach o,$(filter %.mo,$($1)),$(eval \
+ $o: $($o-objs)))
+$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+endef
+
define unnest-vars
$(eval obj := $1)
$(eval nested-vars := $2)
@@ -165,4 +192,13 @@ $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out
%/, $($(var)))))
$(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
$(foreach var,$(nested-vars), $(eval \
-include $(addsuffix *.d, $(sort $(dir $($(var)))))))
+$(foreach v,$(filter %-m,$(nested-vars)), \
+ $(call add-modules,$v))
+
+$(if $(CONFIG_MODULES), \
+ $(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))), \
+ $(foreach v,$(filter %-m,$(nested-vars)), \
+ $(eval $(patsubst %-m,%-y,$v) += $($v)) \
+ $(eval $v := )))
+
endef
--
1.8.3.1
- [Qemu-devel] [PATCH v12 0/8] Shared Library Module Support, Fam Zheng, 2013/10/10
- [Qemu-devel] [PATCH v12 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency, Fam Zheng, 2013/10/10
- [Qemu-devel] [PATCH v12 2/8] make.rule: fix $(obj) to a real relative path, Fam Zheng, 2013/10/10
- [Qemu-devel] [PATCH v12 3/8] rule.mak: allow per object cflags and libs, Fam Zheng, 2013/10/10
- [Qemu-devel] [PATCH v12 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO,
Fam Zheng <=
- [Qemu-devel] [PATCH v12 6/8] Makefile: install modules with "make install", Fam Zheng, 2013/10/10
- [Qemu-devel] [PATCH v12 5/8] module: implement module loading, Fam Zheng, 2013/10/10
[Qemu-devel] [PATCH v12 7/8] .gitignore: ignore module related files (dll, so, mo), Fam Zheng, 2013/10/10
[Qemu-devel] [PATCH v12 8/8] block: convert block drivers linked with libs to modules, Fam Zheng, 2013/10/10
Re: [Qemu-devel] [PATCH v12 0/8] Shared Library Module Support, Paolo Bonzini, 2013/10/10