Message ID | 20130715162045.16676.64219.stgit@outback |
---|---|
State | New |
Headers | show |
Quoting Tomoki Sekiyama (2013-07-15 11:20:45) > To enable VSS support in qemu-ga for Windows, header files included in > VSS SDK are required. > The VSS support is enabled by the configure option like below: > ./configure --with-vss-sdk="/path/to/VSS SDK" > > If the path is omitted, it tries to search the headers from default paths > and VSS support is enabled only if the SDK is found. > VSS support is disabled if --without-vss-sdk or --with-vss-sdk=no is > specified. > > VSS SDK is available from: > http://www.microsoft.com/en-us/download/details.aspx?id=23490 > > To cross-compile using mingw, you need to setup the SDK on Windows > environments to extract headers. You can also extract the SDK headers on > POSIX environments using scripts/extract-vss-headers and msitools. > > In addition, --with-win-sdk="/path/to/Windows SDK" option is also added to > specify path to Windows SDK, which may be used for native-compile of .tlb > file of qemu-ga VSS provider. However, this is usually unnecessary because > pre-compiled .tlb file is included. > > Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com> > Reviewed-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com> > --- > .gitignore | 1 + > Makefile | 1 + > configure | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 71 insertions(+) > > diff --git a/.gitignore b/.gitignore > index 0fe114d..02d15f0 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -79,6 +79,7 @@ fsdev/virtfs-proxy-helper.pod > *.la > *.pc > .libs > +.sdk > *.swp > *.orig > .pc > diff --git a/Makefile b/Makefile > index c06bfab..ec35a15 100644 > --- a/Makefile > +++ b/Makefile > @@ -273,6 +273,7 @@ distclean: clean > for d in $(TARGET_DIRS); do \ > rm -rf $$d || exit 1 ; \ > done > + rm -Rf .sdk > if test -f pixman/config.log; then make -C pixman distclean; fi > if test -f dtc/version_gen.h; then make $(DTC_MAKE_ARGS) clean; fi > > diff --git a/configure b/configure > index 6923b65..8e1147f 100755 > --- a/configure > +++ b/configure > @@ -232,6 +232,8 @@ usb_redir="" > glx="" > zlib="yes" > guest_agent="yes" > +guest_agent_with_vss="no" > +vss_win32_sdk="" > want_tools="yes" > libiscsi="" > coroutine="" > @@ -926,6 +928,14 @@ for opt do > ;; > --disable-guest-agent) guest_agent="no" > ;; > + --with-vss-sdk) vss_win32_sdk="" > + ;; > + --with-vss-sdk=*) vss_win32_sdk="$optarg" > + ;; > + --without-vss-sdk) vss_win32_sdk="no" > + ;; > + --with-win-sdk=*) win_sdk="$optarg" > + ;; > --enable-tools) want_tools="yes" > ;; > --disable-tools) want_tools="no" > @@ -1158,6 +1168,8 @@ echo " --disable-usb-redir disable usb network redirection support" > echo " --enable-usb-redir enable usb network redirection support" > echo " --disable-guest-agent disable building of the QEMU Guest Agent" > echo " --enable-guest-agent enable building of the QEMU Guest Agent" > +echo " --with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent" > +echo " --with-win-sdk=SDK-path path to Windows Platform SDK (to build VSS .tlb)" > echo " --disable-seccomp disable seccomp support" > echo " --enable-seccomp enables seccomp support" > echo " --with-coroutine=BACKEND coroutine backend. Supported options:" > @@ -3072,6 +3084,57 @@ if test "$usb_redir" != "no" ; then > fi > > ########################################## > +# check if we have VSS SDK headers for win > + > +if test "$mingw32" = "yes" -a "$guest_agent" = "yes" -a "$vss_win32_sdk" != "no" ; then > + case "$vss_win32_sdk" in > + "") vss_win32_include="-I$source_path" ;; > + *\ *) # The SDK is installed in "Program Files" by default, but we cannot > + # handle path with spaces. So we symlink the headers into ".sdk/vss". > + vss_win32_include="-I$source_path/.sdk/vss" > + symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc" > + ;; > + *) vss_win32_include="-I$vss_win32_sdk" > + esac > + cat > $TMPC << EOF > +#define __MIDL_user_allocate_free_DEFINED__ > +#include <inc/win2003/vss.h> > +int main(void) { return VSS_CTX_BACKUP; } > +EOF > + if compile_prog "$vss_win32_include" "" ; then > + guest_agent_with_vss="yes" > + QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include" > + libs_qga="-lole32 -loleaut32 -lshlwapi -luuid -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga" > + else > + if test "$vss_win32_sdk" != "" ; then > + echo "ERROR: Please download and install Microsoft VSS SDK:" > + echo "ERROR: http://www.microsoft.com/en-us/download/details.aspx?id=23490" > + echo "ERROR: On POSIX-systems, you can extract the SDK headers by:" > + echo "ERROR: scripts/extract-vsssdk-headers setup.exe" > + echo "ERROR: The headers are extracted in the directory \`inc'." > + feature_not_found "VSS support" > + fi > + guest_agent_with_vss="no" > + fi > +fi > + > +########################################## > +# lookup Windows platform SDK (if not specified) > +# The SDK is needed only to build .tlb (type library) file of guest agent > +# VSS provider from the source. It is usually unnecessary because the > +# pre-compiled .tlb file is included. > + > +if test "$mingw32" = "yes" -a "$guest_agent" = "yes" -a "$guest_agent_with_vss" = "yes" ; then > + if test -z "$win_sdk"; then > + programfiles="$PROGRAMFILES" > + test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432" > + if test -n "$programfiles"; then > + win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null > + fi > + fi > +fi > + > +########################################## > > ########################################## > # check if we have fdatasync > @@ -3503,6 +3566,7 @@ echo "Manual directory `eval echo $mandir`" > echo "ELF interp prefix $interp_prefix" > else > echo "local state directory queried at runtime" > +echo "Windows SDK $win_sdk" > fi > echo "Source path $source_path" > echo "C compiler $cc" > @@ -3589,6 +3653,7 @@ echo "usb net redir $usb_redir" > echo "GLX support $glx" > echo "libiscsi support $libiscsi" > echo "build guest agent $guest_agent" > +echo "QGA VSS support $guest_agent_with_vss" > echo "seccomp support $seccomp" > echo "coroutine backend $coroutine" > echo "GlusterFS support $glusterfs" > @@ -3663,6 +3728,10 @@ if test "$mingw32" = "yes" ; then > version_micro=0 > echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak > echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak > + if test "$guest_agent_with_vss" = "yes" ; then > + echo "CONFIG_QGA_VSS=y" >> $config_host_mak > + echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak > + fi > else > echo "CONFIG_POSIX=y" >> $config_host_mak > fi
diff --git a/.gitignore b/.gitignore index 0fe114d..02d15f0 100644 --- a/.gitignore +++ b/.gitignore @@ -79,6 +79,7 @@ fsdev/virtfs-proxy-helper.pod *.la *.pc .libs +.sdk *.swp *.orig .pc diff --git a/Makefile b/Makefile index c06bfab..ec35a15 100644 --- a/Makefile +++ b/Makefile @@ -273,6 +273,7 @@ distclean: clean for d in $(TARGET_DIRS); do \ rm -rf $$d || exit 1 ; \ done + rm -Rf .sdk if test -f pixman/config.log; then make -C pixman distclean; fi if test -f dtc/version_gen.h; then make $(DTC_MAKE_ARGS) clean; fi diff --git a/configure b/configure index 6923b65..8e1147f 100755 --- a/configure +++ b/configure @@ -232,6 +232,8 @@ usb_redir="" glx="" zlib="yes" guest_agent="yes" +guest_agent_with_vss="no" +vss_win32_sdk="" want_tools="yes" libiscsi="" coroutine="" @@ -926,6 +928,14 @@ for opt do ;; --disable-guest-agent) guest_agent="no" ;; + --with-vss-sdk) vss_win32_sdk="" + ;; + --with-vss-sdk=*) vss_win32_sdk="$optarg" + ;; + --without-vss-sdk) vss_win32_sdk="no" + ;; + --with-win-sdk=*) win_sdk="$optarg" + ;; --enable-tools) want_tools="yes" ;; --disable-tools) want_tools="no" @@ -1158,6 +1168,8 @@ echo " --disable-usb-redir disable usb network redirection support" echo " --enable-usb-redir enable usb network redirection support" echo " --disable-guest-agent disable building of the QEMU Guest Agent" echo " --enable-guest-agent enable building of the QEMU Guest Agent" +echo " --with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent" +echo " --with-win-sdk=SDK-path path to Windows Platform SDK (to build VSS .tlb)" echo " --disable-seccomp disable seccomp support" echo " --enable-seccomp enables seccomp support" echo " --with-coroutine=BACKEND coroutine backend. Supported options:" @@ -3072,6 +3084,57 @@ if test "$usb_redir" != "no" ; then fi ########################################## +# check if we have VSS SDK headers for win + +if test "$mingw32" = "yes" -a "$guest_agent" = "yes" -a "$vss_win32_sdk" != "no" ; then + case "$vss_win32_sdk" in + "") vss_win32_include="-I$source_path" ;; + *\ *) # The SDK is installed in "Program Files" by default, but we cannot + # handle path with spaces. So we symlink the headers into ".sdk/vss". + vss_win32_include="-I$source_path/.sdk/vss" + symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc" + ;; + *) vss_win32_include="-I$vss_win32_sdk" + esac + cat > $TMPC << EOF +#define __MIDL_user_allocate_free_DEFINED__ +#include <inc/win2003/vss.h> +int main(void) { return VSS_CTX_BACKUP; } +EOF + if compile_prog "$vss_win32_include" "" ; then + guest_agent_with_vss="yes" + QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include" + libs_qga="-lole32 -loleaut32 -lshlwapi -luuid -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga" + else + if test "$vss_win32_sdk" != "" ; then + echo "ERROR: Please download and install Microsoft VSS SDK:" + echo "ERROR: http://www.microsoft.com/en-us/download/details.aspx?id=23490" + echo "ERROR: On POSIX-systems, you can extract the SDK headers by:" + echo "ERROR: scripts/extract-vsssdk-headers setup.exe" + echo "ERROR: The headers are extracted in the directory \`inc'." + feature_not_found "VSS support" + fi + guest_agent_with_vss="no" + fi +fi + +########################################## +# lookup Windows platform SDK (if not specified) +# The SDK is needed only to build .tlb (type library) file of guest agent +# VSS provider from the source. It is usually unnecessary because the +# pre-compiled .tlb file is included. + +if test "$mingw32" = "yes" -a "$guest_agent" = "yes" -a "$guest_agent_with_vss" = "yes" ; then + if test -z "$win_sdk"; then + programfiles="$PROGRAMFILES" + test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432" + if test -n "$programfiles"; then + win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null + fi + fi +fi + +########################################## ########################################## # check if we have fdatasync @@ -3503,6 +3566,7 @@ echo "Manual directory `eval echo $mandir`" echo "ELF interp prefix $interp_prefix" else echo "local state directory queried at runtime" +echo "Windows SDK $win_sdk" fi echo "Source path $source_path" echo "C compiler $cc" @@ -3589,6 +3653,7 @@ echo "usb net redir $usb_redir" echo "GLX support $glx" echo "libiscsi support $libiscsi" echo "build guest agent $guest_agent" +echo "QGA VSS support $guest_agent_with_vss" echo "seccomp support $seccomp" echo "coroutine backend $coroutine" echo "GlusterFS support $glusterfs" @@ -3663,6 +3728,10 @@ if test "$mingw32" = "yes" ; then version_micro=0 echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak + if test "$guest_agent_with_vss" = "yes" ; then + echo "CONFIG_QGA_VSS=y" >> $config_host_mak + echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak + fi else echo "CONFIG_POSIX=y" >> $config_host_mak fi