qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH V11 4/7] libqblock build system


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH V11 4/7] libqblock build system
Date: Mon, 26 Nov 2012 08:36:30 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121016 Thunderbird/16.0.1

Il 24/11/2012 10:27, 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 if libtool present, out of
> tree building is supported.
> 
> v10:
>   Use $(SRC_PATH) in install rules.
>   Call install libqblock from install target in root Makefile.
>   Make libqblock and check-libqblock is conditional to a configure option and
> libtool now, if libtool is not present it is forced to be disabled.
>   Removed unnest-vars in libqblock Makfile for that it was done in 
> Makefile.objs.
>   Picked out only needed objects files for libqblock, added stub objects in
> libqblock linking.
>   Use libtool to link check-libqblock.
>   Removed -fPIC cc flag replacement in tests/Makefile.
>   Removed seperate directory for libqblock test case.
>   Added target subdir-libqblock.
>   Added targets to .phony.
>   Generate files at root directory instead of ./libqblock.
> 
> v11:
>   Set libqblock initial string to empty instead of “yes� in configure, by 
> default
> it will be set depending on libtool’s state, fail when user set it to yes 
> but
> libtool not present.
>   Removed link flag in check-libqblock linkage, use libtool to search library.
>   Added libqblock-aio.c, which contains code from main-loop.c, iohandler.c
> compatfd.c, removed these three files from compile and link objects.
> 
> Signed-off-by: Wenchao Xia <address@hidden>
> ---
>  .gitignore                    |    2 +
>  Makefile                      |   25 ++++++++++++-
>  configure                     |   39 ++++++++++++++++++++
>  libqblock/Makefile            |   74 +++++++++++++++++++++++++++++++++++++
>  libqblock/libqblock-aio.c     |   81 
> +++++++++++++++++++++++++++++++++++++++++
>  libqblock/libqblock.c         |    6 +++
>  libqblock/libqblock.h         |    1 +
>  libqblock/libqblock.pc.in     |   13 +++++++
>  tests/Makefile                |   29 ++++++++++++++-
>  tests/check-libqblock-qcow2.c |    6 +++
>  10 files changed, 272 insertions(+), 4 deletions(-)
>  create mode 100644 libqblock/Makefile
>  create mode 100644 libqblock/libqblock-aio.c
>  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/check-libqblock-qcow2.c
> 
> diff --git a/.gitignore b/.gitignore
> index bd6ba1c..77c1910 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -93,3 +93,5 @@ cscope.*
>  tags
>  TAGS
>  *~
> +tests/check-libqblock-qcow2
> +tests/test_images
> diff --git a/Makefile b/Makefile
> index b04d862..dd01fe7 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -195,6 +195,27 @@ qemu-img$(EXESUF): qemu-img.o $(tools-obj-y) 
> $(block-obj-y) libqemustub.a
>  qemu-nbd$(EXESUF): qemu-nbd.o $(tools-obj-y) $(block-obj-y) libqemustub.a
>  qemu-io$(EXESUF): qemu-io.o cmd.o $(tools-obj-y) $(block-obj-y) libqemustub.a
>  
> +######################################################################
> +# Support building shared library libqblock
> +.PHONY: install-libqblock subdir-libqblock
> +
> +ifeq ($(CONFIG_LIBQBLOCK), y)
> +subdir-libqblock: $(GENERATED_HEADERS) $(GENERATED_SOURCES)
> +     $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libqblock V="$(V)" 
> TARGET_DIR="$*/" all,)
> +
> +install-libqblock: subdir-libqblock
> +     $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libqblock V="$(V)" 
> TARGET_DIR="$*/" install-libqblock,)
> +else
> +LIBQBLOCK_WARN = "Libqblock was not enabled, skip. Make sure libtool was 
> installed and libqblock was enabled."
> +subdir-libqblock: $(GENERATED_HEADERS) $(GENERATED_SOURCES)
> +     @echo $(LIBQBLOCK_WARN)
> +
> +install-libqblock:
> +     @echo $(LIBQBLOCK_WARN)
> +endif
> +
> +###########################################################################
> +
>  qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o
>  
>  vscclient$(EXESUF): $(libcacard-y) $(oslib-obj-y) $(trace-obj-y) 
> libcacard/vscclient.o libqemustub.a
> @@ -258,7 +279,7 @@ clean:
>       rm -rf qapi-generated
>       rm -rf qga/qapi-generated
>       $(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
> @@ -331,7 +352,7 @@ install-confdir:
>  install-sysconfig: install-datadir install-confdir
>       $(INSTALL_DATA) $(SRC_PATH)/sysconfigs/target/target-x86_64.conf 
> "$(DESTDIR)$(qemu_confdir)"
>  
> -install: all $(if $(BUILD_DOCS),install-doc) install-sysconfig 
> install-datadir
> +install: all $(if $(BUILD_DOCS),install-doc) install-sysconfig 
> install-datadir $(if $(CONFIG_LIBQBLOCK),install-libqblock)
>       $(INSTALL_DIR) "$(DESTDIR)$(bindir)"
>  ifneq ($(TOOLS),)
>       $(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
> diff --git a/configure b/configure
> index 801585c..b0bf912 100755
> --- a/configure
> +++ b/configure
> @@ -223,6 +223,7 @@ libiscsi=""
>  coroutine=""
>  seccomp=""
>  glusterfs=""
> +libqblock=""
>  
>  # parse CC options first
>  for opt do
> @@ -871,6 +872,10 @@ for opt do
>    ;;
>    --enable-glusterfs) glusterfs="yes"
>    ;;
> +  --disable-libqblock) libqblock="no"
> +  ;;
> +  --enable-libqblock) libqblock="yes"
> +  ;;
>    *) echo "ERROR: unknown option $opt"; show_help="yes"
>    ;;
>    esac
> @@ -1119,6 +1124,8 @@ echo "  --with-coroutine=BACKEND coroutine backend. 
> Supported options:"
>  echo "                           gthread, ucontext, sigaltstack, windows"
>  echo "  --enable-glusterfs       enable GlusterFS backend"
>  echo "  --disable-glusterfs      disable GlusterFS backend"
> +echo "  --enable-libqblock       enable dynamic library libqblock"
> +echo "  --disable-libqblock      disable dynamic library libqblock"
>  echo ""
>  echo "NOTE: The object files are built at the place where configure is 
> launched"
>  exit 1
> @@ -2349,6 +2356,28 @@ EOF
>    fi
>  fi
>  
> +##########################################
> +# libqblock probe
> +if test "$libqblock" == "yes" ; then
> +    # if it is set to yes by user, check whether libtool exist
> +    if ! has $libtool; then
> +        echo
> +        echo "ERROR: Libqblock needs libtool, but libtool was not found."
> +        echo "Make sure libtool was installed, or disable libqblock."
> +        echo
> +        exit 1
> +    fi
> +fi
> +
> +if test "$libqblock" == "" ; then
> +    # libqblock depends on libtool, default to yes if libtool exist
> +    if ! has $libtool; then
> +        libqblock="no"
> +    else
> +        libqblock="yes"
> +    fi
> +fi
> +
>  #
>  # Check for xxxat() functions when we are building linux-user
>  # emulator.  This is done because older glibc versions don't
> @@ -3101,6 +3130,9 @@ if test "$want_tools" = "yes" ; then
>    if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
>      tools="qemu-nbd\$(EXESUF) $tools"
>    fi
> +  if test "$libqblock" = "yes" ; then
> +  tools="subdir-libqblock $tools"
> +  fi
>  fi
>  if test "$softmmu" = yes ; then
>    if test "$virtfs" != no ; then
> @@ -3235,6 +3267,7 @@ echo "build guest agent $guest_agent"
>  echo "seccomp support   $seccomp"
>  echo "coroutine backend $coroutine_backend"
>  echo "GlusterFS support $glusterfs"
> +echo "libqblock support $libqblock"
>  
>  if test "$sdl_too_old" = "yes"; then
>  echo "-> Your SDL version is too old - please upgrade to have SDL support"
> @@ -3581,6 +3614,10 @@ if test "$glusterfs" = "yes" ; then
>    echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
>  fi
>  
> +if test "$libqblock" = "yes" ; then
> +  echo "CONFIG_LIBQBLOCK=y" >> $config_host_mak
> +fi
> +
>  # USB host support
>  case "$usb" in
>  linux)
> @@ -4166,12 +4203,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"
>  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"
>  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..0602221
> --- /dev/null
> +++ b/libqblock/Makefile
> @@ -0,0 +1,74 @@
> +###########################################################################
> +# libqblock Makefile
> +##########################################################################
> +-include ../config-host.mak
> +-include $(SRC_PATH)/rules.mak
> +-include $(SRC_PATH)/Makefile.objs
> +
> +#############################################################################
> +# Library settings
> +#############################################################################
> +# src files are in orignial path
> +$(call set-vpath, $(SRC_PATH))
> +# generated files are in ../
> +$(call set-vpath, ../)
> +
> +#library objects
> +libqblock-obj-y= libqblock/libqblock.o libqblock/libqblock-error.o 
> libqblock/libqblock-aio.o
> +
> +extra-obj-y= qemu-timer.o qemu-tool.o
> +
> +#there are symbol conflict in stub-obj-y with iohandler.o, so set new version
> +stub-obj-new-y= stubs/get-fd.o stubs/fdset-get-fd.o stubs/fdset-find-fd.o \
> +             stubs/fdset-remove-fd.o stubs/fdset-add-fd.o
> +
> +
> +QEMU_OBJS= $(libqblock-obj-y) $(block-obj-y) $(oslib-obj-y) 
> $(stub-obj-new-y) \
> +           $(extra-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_includedir= $(includedir)/qblock
> +libqblock_srcpath= $(SRC_PATH)/libqblock
> +libqblock-pub-headers= $(libqblock_srcpath)/libqblock.h \
> +                       $(libqblock_srcpath)/libqblock-types.h \
> +                       $(libqblock_srcpath)/libqblock-error.h
> +
> +#################################################################
> +# Runtime rules
> +#################################################################
> +.PHONY: clean all libqblock.la libqblock.pc install-libqblock
> +
> +clean:
> +     rm -f *.lo *.o *.d *.la *.pc
> +     rm -rf .libs block trace audio fsdev hw net qapi qga qom slirp ui 
> libqblock stubs backends
> +
> +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   $@")
> +
> +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-aio.c b/libqblock/libqblock-aio.c
> new file mode 100644
> index 0000000..605eee8
> --- /dev/null
> +++ b/libqblock/libqblock-aio.c
> @@ -0,0 +1,81 @@
> +/*
> + * QEMU block layer library
> + *
> + * Copyright IBM, Corp. 2012
> + *
> + * Authors:
> + *  Wenchao Xia   <address@hidden>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2 or later.
> + * See the COPYING.LIB file in the top-level directory.
> + *
> + */

Please move this file to patch 6.  I had a big "WTF" wondering how this
could work :) before seeing that you then modified it in patch 6.

> +#include <sys/syscall.h>
> +
> +#include "qemu-common.h"
> +#include "qemu-aio.h"
> +#include "main-loop.h"
> +#include "compatfd.h"
> +
> +void qemu_notify_event(void)
> +{
> +    return;
> +}
> +
> +QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
> +{
> +    return NULL;
> +}
> +
> +void qemu_aio_flush(void)
> +{
> +    return;
> +}
> +
> +bool qemu_aio_wait(void)
> +{
> +    return false;
> +}
> +
> +#ifdef CONFIG_POSIX
> +void qemu_aio_set_fd_handler(int fd,
> +                             IOHandler *io_read,
> +                             IOHandler *io_write,
> +                             AioFlushHandler *io_flush,
> +                             void *opaque)
> +{
> +    return;
> +}
> +#endif
> +
> +void qemu_aio_set_event_notifier(EventNotifier *notifier,
> +                                 EventNotifierHandler *io_read,
> +                                 AioFlushEventNotifierHandler *io_flush)
> +{
> +    return;
> +}
> +
> +bool qemu_signalfd_available(void)
> +{
> +    return false;
> +}
> +
> +typedef struct IOHandlerRecord IOHandlerRecord;
> +
> +int qemu_set_fd_handler2(int fd,
> +                         IOCanReadHandler *fd_read_poll,
> +                         IOHandler *fd_read,
> +                         IOHandler *fd_write,
> +                         void *opaque)
> +{
> +    return 0;
> +}
> +
> +int qemu_set_fd_handler(int fd,
> +                        IOHandler *fd_read,
> +                        IOHandler *fd_write,
> +                        void *opaque)
> +{
> +    return 0;
> +}
> 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..4c18c41
> --- /dev/null
> +++ b/libqblock/libqblock.c
> @@ -0,0 +1,6 @@
> +#include "libqblock.h"
> +
> +int libqb_test(void)
> +{
> +    return 0;
> +}
> diff --git a/libqblock/libqblock.h b/libqblock/libqblock.h
> new file mode 100644
> index 0000000..b0f9daf
> --- /dev/null
> +++ b/libqblock/libqblock.h
> @@ -0,0 +1 @@
> +__attribute__((visibility("default"))) int libqb_test(void);
> 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 ef6c9f2..bc1a94c 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -84,6 +84,21 @@ check-qtest-$(CONFIG_POSIX)=$(foreach TARGET,$(TARGETS), 
> $(check-qtest-$(TARGET)
>  qtest-obj-y = tests/libqtest.o $(oslib-obj-y) libqemustub.a
>  $(check-qtest-y): $(qtest-obj-y)
>  
> +#libqblock build rules
> +check-libqblock-$(CONFIG_LIBQBLOCK) = tests/check-libqblock-qcow2$(EXESUF)
> +
> +$(check-libqblock-y): QEMU_INCLUDES += -I$(SRC_PATH)/tests 
> -I$(SRC_PATH)/$(LIBQBLOCK_DIR)
> +LIBQBLOCK_TEST_DIR = tests/test_images
> +LIBQBLOCK_DIR = libqblock

Please just write libqblock instead of LIBQBLOCK_DIR.

> +LIBQBLOCK_LA = $(LIBQBLOCK_DIR)/libqblock.la
> +
> +LTLINK_CHECK_LIBQBLOCK = $(call quiet-command, $(LIBTOOL) --mode=link 
> --quiet --tag=CC \
> +         $(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) \
> +         -o $@ $(sort $(1)) $(LIBS), "lt LINK $(TARGET_DIR) $@")

Please call this just "LTLINK", and remove the space between
$(TARGET_DIR) and address@hidden

> +
> +$(check-libqblock-y): %$(EXESUF): %.o
> +     $(call LTLINK_CHECK_LIBQBLOCK, $^ $(LIBQBLOCK_LA))
> +
>  .PHONY: check-help
>  check-help:
>       @echo "Regression testing targets:"
> @@ -94,6 +109,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 +142,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
> @@ -143,16 +165,19 @@ check-tests/qemu-iotests-quick.sh: 
> tests/qemu-iotests-quick.sh qemu-img$(EXESUF)
>  
>  # Consolidated targets
>  
> -.PHONY: check-qtest check-unit check
> +.PHONY: check-qtest check-unit check check-libqblock check-clean
>  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-libqblock check-unit check-qtest
>  
>  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 $(check-libqblock-y)
> +     rm -rf $(LIBQBLOCK_TEST_DIR)
>  
>  -include $(wildcard tests/*.d)
> diff --git a/tests/check-libqblock-qcow2.c b/tests/check-libqblock-qcow2.c
> new file mode 100644
> index 0000000..50a4df3
> --- /dev/null
> +++ b/tests/check-libqblock-qcow2.c
> @@ -0,0 +1,6 @@
> +#include "libqblock.h"
> +int main(int argc, char **argv)
> +{
> +    libqb_test();
> +    return 0;
> +}
> 




reply via email to

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