diff --git a/Makefile b/Makefile index 2a926aaeb0..a380bbfa12 100644 --- a/Makefile +++ b/Makefile @@ -335,9 +335,7 @@ endif ifdef CONFIG_WIN32 @echo 'Windows targets:' $(call print-help,installer,Build NSIS-based installer for QEMU) -ifdef CONFIG_QGA_MSI $(call print-help,msi,Build MSI-based installer for qemu-ga) -endif @echo '' endif $(call print-help,$(MAKE) [targets],(quiet build, default)) diff --git a/configure b/configure index ff099cb8ca..dcc5ea7d63 100755 --- a/configure +++ b/configure @@ -404,7 +404,7 @@ zstd="auto" guest_agent="$default_feature" guest_agent_with_vss="no" guest_agent_ntddscsi="no" -guest_agent_msi="$default_feature" +guest_agent_msi="auto" vss_win32_sdk="$default_feature" win_sdk="no" want_tools="$default_feature" @@ -1334,9 +1334,9 @@ for opt do ;; --disable-guest-agent) guest_agent="no" ;; - --enable-guest-agent-msi) guest_agent_msi="yes" + --enable-guest-agent-msi) guest_agent_msi="enabled" ;; - --disable-guest-agent-msi) guest_agent_msi="no" + --disable-guest-agent-msi) guest_agent_msi="disabled" ;; --with-vss-sdk) vss_win32_sdk="" ;; @@ -5341,62 +5341,19 @@ if [ "$guest_agent" != "no" ]; then fi fi -# Guest agent Window MSI package +# Guest agent Windows MSI package -if test "$guest_agent" != yes; then - if test "$guest_agent_msi" = yes; then - error_exit "MSI guest agent package requires guest agent enabled" - fi - guest_agent_msi=no -elif test "$mingw32" != "yes"; then - if test "$guest_agent_msi" = "yes"; then - error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation" - fi - guest_agent_msi=no -elif ! has wixl; then - if test "$guest_agent_msi" = "yes"; then - error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )" - fi - guest_agent_msi=no -else - # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't - # disabled explicitly - if test "$guest_agent_msi" != "no"; then - guest_agent_msi=yes - fi +if test "$QEMU_GA_MANUFACTURER" = ""; then + QEMU_GA_MANUFACTURER=QEMU +fi +if test "$QEMU_GA_DISTRO" = ""; then + QEMU_GA_DISTRO=Linux +fi +if test "$QEMU_GA_VERSION" = ""; then + QEMU_GA_VERSION=$(cat $source_path/VERSION) fi -if test "$guest_agent_msi" = "yes"; then - if test "$guest_agent_with_vss" = "yes"; then - QEMU_GA_MSI_WITH_VSS="-D InstallVss" - fi - - if test "$QEMU_GA_MANUFACTURER" = ""; then - QEMU_GA_MANUFACTURER=QEMU - fi - - if test "$QEMU_GA_DISTRO" = ""; then - QEMU_GA_DISTRO=Linux - fi - - if test "$QEMU_GA_VERSION" = ""; then - QEMU_GA_VERSION=$(cat $source_path/VERSION) - fi - - QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin" - - case "$cpu" in - x86_64) - QEMU_GA_MSI_ARCH="-a x64 -D Arch=64" - ;; - i386) - QEMU_GA_MSI_ARCH="-D Arch=32" - ;; - *) - error_exit "CPU $cpu not supported for building installation package" - ;; - esac -fi +QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin" # Mac OS X ships with a broken assembler roms= @@ -5495,15 +5452,10 @@ if test "$mingw32" = "yes" ; then if test "$guest_agent_ntddscsi" = "yes" ; then echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak fi - if test "$guest_agent_msi" = "yes"; then - echo "CONFIG_QGA_MSI=y" >> $config_host_mak - echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak - echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak - echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak - echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak - echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak - echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak - fi + echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak + echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak + echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak + echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak else echo "CONFIG_POSIX=y" >> $config_host_mak fi @@ -6420,7 +6372,7 @@ NINJA=$ninja $meson setup \ -Dattr=$attr -Ddefault_devices=$default_devices \ -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \ -Dvhost_user_blk_server=$vhost_user_blk_server \ - -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek \ + -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi \ $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \ $cross_arg \ "$PWD" "$source_path" diff --git a/meson.build b/meson.build index 4f0e459243..430942c8b4 100644 --- a/meson.build +++ b/meson.build @@ -2196,6 +2196,8 @@ endif if 'CONFIG_GUEST_AGENT' in config_host subdir('qga') +elif get_option('guest_agent_msi').enabled() + error('Guest agent MSI requested, but the guest agent is not being built') endif # Don't build qemu-keymap if xkbcommon is not explicitly enabled @@ -2460,9 +2462,11 @@ if targetos == 'windows' if 'WIN_SDK' in config_host summary_info += {'Windows SDK': config_host['WIN_SDK']} endif - summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')} - summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')} - summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')} + if config_host.has_key('CONFIG_GUEST_AGENT') + summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')} + summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')} + summary_info += {'QGA MSI support': wixl.found()} + endif endif summary_info += {'seccomp support': seccomp.found()} summary_info += {'CFI support': get_option('cfi')} diff --git a/meson_options.txt b/meson_options.txt index 7dcd81c06a..95f1079829 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -17,6 +17,8 @@ option('install_blobs', type : 'boolean', value : true, description: 'install provided firmware blobs') option('sparse', type : 'feature', value : 'auto', description: 'sparse checker') +option('guest_agent_msi', type : 'feature', value : 'auto', + description: 'Build MSI package for the QEMU Guest Agent') option('malloc_trim', type : 'feature', value : 'auto', description: 'enable libc malloc_trim() for memory optimization') diff --git a/qga/meson.build b/qga/meson.build index 520af6ce9b..cfb1fbc085 100644 --- a/qga/meson.build +++ b/qga/meson.build @@ -55,33 +55,46 @@ if targetos == 'windows' gen_tlb = [] endif - wixl = find_program('wixl', required: false) + qemu_ga_msi_arch = { + 'x86': ['-D', 'Arch=32'], + 'x86_64': ['-a', 'x64', '-D', 'Arch=64'] + } + wixl = not_found + if cpu in qemu_ga_msi_arch + wixl = find_program('wixl', required: get_option('guest_agent_msi')) + elif get_option('guest_agent_msi').enabled() + error('CPU not supported for building guest agent installation package') + endif + if wixl.found() deps = [gen_tlb, qga] - if 'CONFIG_QGA_VSS' in config_host and 'QEMU_GA_MSI_WITH_VSS' in config_host + qemu_ga_msi_vss = [] + if 'CONFIG_QGA_VSS' in config_host + qemu_ga_msi_vss = ['-D', 'InstallVss'] deps += qga_vss endif - if 'CONFIG_QGA_MSI' in config_host - qga_msi = custom_target('QGA MSI', - input: files('installer/qemu-ga.wxs'), - output: 'qemu-ga-@0@.msi'.format(config_host['ARCH']), - depends: deps, - command: [ - find_program('env'), - 'QEMU_GA_VERSION=' + config_host['QEMU_GA_VERSION'], - 'QEMU_GA_MANUFACTURER=' + config_host['QEMU_GA_MANUFACTURER'], - 'QEMU_GA_DISTRO=' + config_host['QEMU_GA_DISTRO'], - 'BUILD_DIR=' + meson.build_root(), - wixl, '-o', '@OUTPUT0@', '@INPUT0@', - config_host['QEMU_GA_MSI_ARCH'].split(), - config_host['QEMU_GA_MSI_WITH_VSS'].split(), - config_host['QEMU_GA_MSI_MINGW_DLL_PATH'].split(), - ]) - all_qga += [qga_msi] - alias_target('msi', qga_msi) - endif + qga_msi = custom_target('QGA MSI', + input: files('installer/qemu-ga.wxs'), + output: 'qemu-ga-@0@.msi'.format(config_host['ARCH']), + depends: deps, + command: [ + find_program('env'), + 'QEMU_GA_VERSION=' + config_host['QEMU_GA_VERSION'], + 'QEMU_GA_MANUFACTURER=' + config_host['QEMU_GA_MANUFACTURER'], + 'QEMU_GA_DISTRO=' + config_host['QEMU_GA_DISTRO'], + 'BUILD_DIR=' + meson.build_root(), + wixl, '-o', '@OUTPUT0@', '@INPUT0@', + qemu_ga_msi_arch[cpu], + qemu_ga_msi_vss, + '-D', 'Mingw_dlls=' + config_host['QEMU_GA_MSI_MINGW_DLL_PATH'], + ]) + all_qga += [qga_msi] + alias_target('msi', qga_msi) endif else + if get_option('guest_agent_msi').enabled() + error('MSI guest agent package is available only for MinGW Windows cross-compilation') + endif install_subdir('run', install_dir: get_option('localstatedir')) endif