qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V9 5/8] libqblock build system


From: Wenchao Xia
Subject: Re: [Qemu-devel] [PATCH V9 5/8] libqblock build system
Date: Sun, 18 Nov 2012 21:06:19 +0800
User-agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20121026 Thunderbird/16.0.2

于 2012-11-16 19:08, Paolo Bonzini 写道:
Il 16/11/2012 11:12, Wenchao Xia ha scritto:
   Libqblock was placed in new directory ./libqblock, libtool will build
dynamic library there, source files of block layer remains in ./block.
So block related source code will generate 3 sets of binary, first is old
ones used in qemu, second and third are non PIC and PIC ones in ./libqblock.
   GCC compiler flag visibility=hidden was used with special macro, to export
only symbols that was marked as PUBLIC.
   For testing, make check-libqblock will build binaries and execute it, make
clean or make check-clean will delete generated binaries.
   By default this library will be built and tested, out of tree building is
supported.
   Header files added in configure due to install-libqblock from out of tree
build need these them.

Use $(SRC_PATH) instead in the install rules.

  OK.


Signed-off-by: Wenchao Xia <address@hidden>
---
  .gitignore                        |    2 +
  Makefile                          |   12 ++++++-
  configure                         |    4 ++-
  libqblock/Makefile                |   72 +++++++++++++++++++++++++++++++++++++
  libqblock/libqblock.pc.in         |   13 +++++++
  tests/Makefile                    |   29 ++++++++++++++-
  tests/libqblock/libqblock-qcow2.c |    4 ++
  7 files changed, 133 insertions(+), 3 deletions(-)
  create mode 100644 libqblock/Makefile
  create mode 100644 libqblock/libqblock-error.c
  create mode 100644 libqblock/libqblock-error.h
  create mode 100644 libqblock/libqblock-types.h
  create mode 100644 libqblock/libqblock.c
  create mode 100644 libqblock/libqblock.h
  create mode 100644 libqblock/libqblock.pc.in
  create mode 100644 tests/libqblock/libqblock-qcow2.c

diff --git a/.gitignore b/.gitignore
index bd6ba1c..76207fe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -93,3 +93,5 @@ cscope.*
  tags
  TAGS
  *~
+tests/libqblock/check-*
+tests/libqblock/test_images
diff --git a/Makefile b/Makefile
index 2cde430..4b0755d 100644
--- a/Makefile
+++ b/Makefile
@@ -189,6 +189,16 @@ qemu-io$(EXESUF): qemu-io.o cmd.o $(tools-obj-y) 
$(block-obj-y)

  qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o

+######################################################################
+# Support building shared library libqblock
+libqblock.la:
+       $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libqblock V="$(V)" 
TARGET_DIR="$*/" libqblock.la,)
+
+install-libqblock:
+       $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libqblock V="$(V)" 
TARGET_DIR="$*/" install-libqblock,)

Who calls install-libqblock?

  No one now, just provided an install rules similar to libcacard.

+###########################################################################
+
  vscclient$(EXESUF): $(libcacard-y) $(oslib-obj-y) $(trace-obj-y) 
libcacard/vscclient.o
        $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(libcacard_libs) $(LIBS),"  
LINK  $@")

@@ -230,7 +240,7 @@ clean:
        rm -rf qapi-generated
        rm -rf qga/qapi-generated
        MAKEFILES=./tests/Makefile $(MAKE) check-clean
-       for d in $(ALL_SUBDIRS) $(QEMULIBS) libcacard; do \
+       for d in $(ALL_SUBDIRS) $(QEMULIBS) libcacard libqblock; do \
        if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \
        rm -f $$d/qemu-options.def; \
          done
diff --git a/configure b/configure
index a18e267..b1a1722 100755
--- a/configure
+++ b/configure
@@ -3099,7 +3099,7 @@ tools=""
  if test "$want_tools" = "yes" ; then
    tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) $tools"
    if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
-    tools="qemu-nbd\$(EXESUF) $tools"
+    tools="libqblock.la qemu-nbd\$(EXESUF) $tools"

Why make this conditional?  (Rather, it should be conditional on the
presence of libtool).

Also, perhaps a separate --enable/disable-libqblock switch is better.
It simplifies testing, at least.

  OK.

    fi
  fi
  if test "$softmmu" = yes ; then
@@ -4163,12 +4163,14 @@ DIRS="$DIRS pc-bios/optionrom pc-bios/spapr-rtas"
  DIRS="$DIRS roms/seabios roms/vgabios"
  DIRS="$DIRS qapi-generated"
  DIRS="$DIRS libcacard libcacard/libcacard libcacard/trace"
+DIRS="$DIRS libqblock tests/libqblock"
  FILES="Makefile tests/Makefile tests/tcg/Makefile qdict-test-data.txt"
  FILES="$FILES tests/tcg/cris/Makefile tests/tcg/cris/.gdbinit"
  FILES="$FILES tests/tcg/lm32/Makefile libcacard/Makefile"
  FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps"
  FILES="$FILES pc-bios/spapr-rtas/Makefile"
  FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
+FILES="$FILES libqblock/Makefile libqblock/libqblock.h libqblock/libqblock-error.h 
libqblock/libqblock-types.h"

See above.

  will remove.

  for bios_file in \
      $source_path/pc-bios/*.bin \
      $source_path/pc-bios/*.rom \
diff --git a/libqblock/Makefile b/libqblock/Makefile
new file mode 100644
index 0000000..190ffb4
--- /dev/null
+++ b/libqblock/Makefile
@@ -0,0 +1,72 @@
+###########################################################################
+# libqblock Makefile
+# Todo:
+#    1 trace related files is generated in this directory, move
+#  them to the root directory.
+##########################################################################
+-include ../config-host.mak
+-include $(SRC_PATH)/Makefile.objs
+-include $(SRC_PATH)/rules.mak
+
+#############################################################################
+# Library settings
+#############################################################################
+$(call set-vpath, $(SRC_PATH))
+
+#expand the foldered vars,especially ./block
+dummy := $(call unnest-vars)

This should be done by Makefile.objs already.

  OK.

+#library objects
+libqblock-y=libqblock/libqblock.o libqblock/libqblock-error.o
+tools-obj-y =  $(oslib-obj-y) $(trace-obj-y) qemu-tool.o qemu-timer.o \
+       qemu-timer-common.o main-loop.o notify.o \
+       iohandler.o cutils.o iov.o async.o
+tools-obj-$(CONFIG_POSIX) += compatfd.o

Are all of these really needed?  (In fact, after some of the recent
changes none of these should be needed).

  OK, I'll try remove tools-objs.

+
+QEMU_OBJS= $(libqblock-y) $(block-obj-y) $(tools-obj-y)
+QEMU_OBJS_LIB=$(patsubst %.o, %.lo, $(QEMU_OBJS))
+
+QEMU_CFLAGS+= -I$(SRC_PATH) -I$(SRC_PATH)/include -I../
+#adding magic macro define for symbol hiding and exposing
+QEMU_CFLAGS+= -fvisibility=hidden -D LIBQB_BUILD
+
+#dependency libraries
+LIBS+=-lz $(LIBS_TOOLS)
+
+#header files to be installed
+libqblock-pub-headers=libqblock.h libqblock-types.h libqblock-error.h
+libqblock_includedir=$(includedir)/qblock
+libqblock_srcpath=$(SRC_PATH)/libqblock
+
+#################################################################
+# Runtime rules
+#################################################################
+clean:
+       rm -f *.lo *.o *.d *.la libqblock-test trace.c trace.c-timestamp *.pc
+       rm -rf .libs block trace audio fsdev hw net qapi qga qom slirp ui 
libqblock
+
+all: libqblock.la libqblock.pc
+# Dummy command so that make thinks it has done something
+       @true
+
+libqblock.la: $(QEMU_OBJS_LIB)
+       $(call quiet-command,$(LIBTOOL) --mode=link --quiet --tag=CC $(CC) -rpath 
$(libdir) -o $@ $^ $(LIBS),"  lt LINK $@")
+
+libqblock.pc: $(libqblock_srcpath)/libqblock.pc.in
+       $(call quiet-command,sed -e 's|@LIBDIR@|$(libdir)|' \
+               -e 's|@INCLUDEDIR@|$(libqblock_includedir)|' \
+           -e 's|@VERSION@|$(shell cat $(SRC_PATH)/VERSION)|' \
+               -e 's|@PREFIX@|$(prefix)|' \
+               < $(libqblock_srcpath)/libqblock.pc.in > libqblock.pc,\
+       "  GEN   $@")
+
+.PHONY: install-libqblock
+
+install-libqblock: libqblock.la libqblock.pc
+       $(INSTALL_DIR) "$(DESTDIR)$(libdir)"
+       $(INSTALL_DIR) "$(DESTDIR)$(libdir)/pkgconfig"
+       $(INSTALL_DIR) "$(DESTDIR)$(libqblock_includedir)"
+       $(LIBTOOL) --mode=install $(INSTALL_DATA) libqblock.la 
"$(DESTDIR)$(libdir)"
+       $(LIBTOOL) --mode=install $(INSTALL_DATA) libqblock.pc 
"$(DESTDIR)$(libdir)/pkgconfig"
+       $(LIBTOOL) --mode=install $(INSTALL_DATA) $(libqblock-pub-headers) 
"$(DESTDIR)$(libqblock_includedir)"
diff --git a/libqblock/libqblock-error.c b/libqblock/libqblock-error.c
new file mode 100644
index 0000000..e69de29
diff --git a/libqblock/libqblock-error.h b/libqblock/libqblock-error.h
new file mode 100644
index 0000000..e69de29
diff --git a/libqblock/libqblock-types.h b/libqblock/libqblock-types.h
new file mode 100644
index 0000000..e69de29
diff --git a/libqblock/libqblock.c b/libqblock/libqblock.c
new file mode 100644
index 0000000..e69de29
diff --git a/libqblock/libqblock.h b/libqblock/libqblock.h
new file mode 100644
index 0000000..e69de29
diff --git a/libqblock/libqblock.pc.in b/libqblock/libqblock.pc.in
new file mode 100644
index 0000000..d2a7d06
--- /dev/null
+++ b/libqblock/libqblock.pc.in
@@ -0,0 +1,13 @@
address@hidden@
+exec_prefix=${prefix}
address@hidden@
address@hidden@
+
+Name: qblock
+Description: QEMU block layer library
+Version: @VERSION@
+
+Requires:  rt gthread-2.0 glib-2.0 z curl cap-ng uuid
+Libs: -L${libdir} -lqblock
+Libs.private:
+Cflags: -I${includedir}
diff --git a/tests/Makefile b/tests/Makefile
index a286622..ee26ba5 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -84,6 +84,22 @@ check-qtest-$(CONFIG_POSIX)=$(foreach TARGET,$(TARGETS), 
$(check-qtest-$(TARGET)
  qtest-obj-y = tests/libqtest.o $(oslib-obj-y)
  $(check-qtest-y): $(qtest-obj-y)

+#libqblock test rules
+
+LIBQBLOCK_TEST_DIR= tests/libqblock/test_images
+LIBQBLOCK_DIR = libqblock
+LIBQBLOCK_SO = $(LIBQBLOCK_DIR)/.libs/libqblock.so
+LIBQBLOCK_SO_LINK_FLAG= -Wl,-rpath,$(LIBQBLOCK_DIR)/.libs

Not portable.  Please use libtool to link the program:

LTLINK = $(call quiet-command,$(LIBTOOL) --mode=link --quiet --tag=CC
$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(sort $(1)) $(LIBS),"lt
LINK $(TARGET_DIR)$@")

and then

$(check-libqblock-y): %$(EXESUF): %.o
        $(call LTLINK,$^)

ok.

+tests/libqblock/%.o: QEMU_CFLAGS:= $(subst -fPIE,-fPIC, $(QEMU_CFLAGS))
+tests/libqblock/%.o: QEMU_CFLAGS:= $(subst -DPIE,-DPIC, $(QEMU_CFLAGS))

Why?

A hint: if you have to do something that is not done anywhere else in
the tree, do not do it.

  not sure whether PIE objs can be linked with dynamic library, let me
try remove it.

+tests/libqblock/%.o: QEMU_INCLUDES += -I$(SRC_PATH)/tests 
-I$(SRC_PATH)/$(LIBQBLOCK_DIR)
+
+check-libqblock-y = tests/libqblock/check-libqblock-qcow2$(EXESUF)

Please use something like check-libqblock-$(CONFIG_LIBQBLOCK) so that it
works even if libqblock is not compiled in.

OK.

Also, I'm not sure we need a completely separate subdirectory for one
file only.  You can just use

$(check-libqblock-y): QEMU_INCLUDES += ...

Paolo

  A separate directory will allow more test cases come in easily,
I thought to added more test cases before.

+tests/libqblock/check-libqblock-qcow2$(EXESUF): 
tests/libqblock/libqblock-qcow2.o $(LIBQBLOCK_SO)
+       $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(LIBS) 
$(LIBQBLOCK_SO_LINK_FLAG),"  LINK  $@")
+
  .PHONY: check-help
  check-help:
        @echo "Regression testing targets:"
@@ -94,6 +110,7 @@ check-help:
        @echo " make check-unit           Run qobject tests"
        @echo " make check-block          Run block tests"
        @echo " make check-report.html    Generates an HTML test report"
+       @echo " make check-libqblock      Run libqblock tests"
        @echo " make check-clean          Clean the tests"
        @echo
        @echo "Please note that HTML reports do not regenerate if the unit 
tests"
@@ -126,6 +143,12 @@ $(patsubst %, check-report-qtest-%.xml, $(QTEST_TARGETS)): 
check-report-qtest-%.
  check-report-unit.xml: $(check-unit-y)
        $(call quiet-command,gtester -q $(GTESTER_OPTIONS) -o $@ -m=$(SPEED) $^, 
"GTESTER $@")

+# gtester tests with libqblock
+
+.PHONY: $(patsubst %, check-%, $(check-libqblock-y))
+$(patsubst %, check-%, $(check-libqblock-y)): check-%: %
+       $(call quiet-command, LIBQBLOCK_TEST_DIR=$(LIBQBLOCK_TEST_DIR) gtester 
$(GTESTER_OPTIONS) -m=$(SPEED) $*,"GTESTER $*")
+
  # Reports and overall runs

  check-report.xml: $(patsubst %,check-report-qtest-%.xml, $(QTEST_TARGETS)) 
check-report-unit.xml
@@ -147,12 +170,16 @@ check-tests/qemu-iotests-quick.sh: 
tests/qemu-iotests-quick.sh qemu-img$(EXESUF)
  check-qtest: $(patsubst %,check-qtest-%, $(QTEST_TARGETS))
  check-unit: $(patsubst %,check-%, $(check-unit-y))
  check-block: $(patsubst %,check-%, $(check-block-y))
-check: check-unit check-qtest
+check-libqblock: $(patsubst %,check-%, $(check-libqblock-y))
+check: check-unit check-qtest check-libqblock

  check-clean:
        $(MAKE) -C tests/tcg clean
        rm -f $(check-unit-y)
        rm -f $(check-qtest-i386-y) $(check-qtest-x86_64-y) 
$(check-qtest-sparc64-y) $(check-qtest-sparc-y)
        rm -f tests/*.o
+       rm -f tests/libqblock/*.o
+       rm -f $(check-libqblock-y)
+       rm -rf $(LIBQBLOCK_TEST_DIR)

  -include $(wildcard tests/*.d)
diff --git a/tests/libqblock/libqblock-qcow2.c 
b/tests/libqblock/libqblock-qcow2.c
new file mode 100644
index 0000000..c05c0c4
--- /dev/null
+++ b/tests/libqblock/libqblock-qcow2.c
@@ -0,0 +1,4 @@
+int main(int argc, char **argv)
+{
+    return 0;
+}





--
Best Regards

Wenchao Xia




reply via email to

[Prev in Thread] Current Thread [Next in Thread]