Files
yabridge/meson.build
T
Robbert van der Helm b1eaaa0638 Fix ABI compatibility with 32-bit VST3 plugins #80
This would cause 32-bit VST3 plugins to crash in mysterious ways. What
ended up being the issue is that the plugins expected doubles to be
8-byte aligned in structs, while GCC doesn't do that by default in x86
code for legacy ABI compatibility reasons. Figuring out what exactly was
the issue took months, but luckily the fix was to just add an
`-malign-double`!
2021-04-12 22:35:09 +02:00

582 lines
23 KiB
Meson

project(
'yabridge',
'cpp',
version : '3.0.2',
default_options : [
'warning_level=3',
'cpp_std=c++2a',
# Even though Meson will complain that this option does not exist, without
# this Meson will not apply the above option to native targets
'build.cpp_std=c++2a',
],
)
# Meson does not let us set a default cross compiler, which makes sense, but it
# also means that it's easy to forget. This will cause the setup process to
# abort if no cross compiler has been set up.
winelib_check = '''#ifndef __WINE__
#error 1
#endif'''
if not meson.get_compiler('cpp').compiles(winelib_check)
error('You need to set up a cross compiler, check the README for compilation instructions.')
endif
# Depending on the `with-bitbridge` flag we'll enable building secondary 32-bit
# host applications that can act as a bit bridge for using 32-bit Windows
# plugins in 64-bit Linux VST hosts. The plugin will determine which host
# application to use based on the `.dll` file it's trying to load. This setup is
# necessary until Meson provides a way to have multiple cross-builds for a
# single build directory: https://github.com/mesonbuild/meson/issues/5125
individual_host_name_64bit = 'yabridge-host'
individual_host_name_32bit = 'yabridge-host-32'
group_host_name_64bit = 'yabridge-group'
group_host_name_32bit = 'yabridge-group-32'
compiler_options = [
'-fvisibility=hidden',
'-fvisibility-inlines-hidden',
# Disable the use of concepts in Boost.Asio until Boost 1.73 gets released
# https://github.com/boostorg/asio/issues/312
'-DBOOST_ASIO_DISABLE_CONCEPTS',
]
# NOTE: GCC doesn't 8-byte align doubles in structs on x86 for ABI-compatibilty
# reasons, but MSVC++ does. We need to force this same alignment to be
# ABI-compatible with 32-bit binaries created with MSVC++ on Windows.
wine_32bit_compiler_options = ['-m32', '-malign-double']
wine_64bit_compiler_options = ['-m64']
with_bitbridge = get_option('with-bitbridge')
with_static_boost = get_option('with-static-boost')
with_winedbg = get_option('with-winedbg')
with_vst3 = get_option('with-vst3')
if with_bitbridge
compiler_options += '-DWITH_BITBRIDGE'
endif
# This provides an easy way to start the Wine VST host using winedbg since it
# can be quite a pain to set up
if with_winedbg
compiler_options += '-DWITH_WINEDBG'
endif
if with_vst3
compiler_options += '-DWITH_VST3'
endif
# Wine versions after Wine 5.6 and before 6.0 require a `__cdecl` calling
# convention to be specified on the `main()` functions or else `argc` and `argv`
# will point to the wrong memory. Similarly, with other versions of Wine this
# should _not_ be specified for the same reason. We'll try to figure out the
# current Wine version and add this calling convention based on that.
#
# https://bugs.winehq.org/show_bug.cgi?id=49138
wine_version = run_command('sh', '-c', '''wine --version | grep --only-matching -E '[0-9]+\.[0-9.]+' | head -n1''')
if wine_version.returncode() == 0 and \
wine_version.stdout().version_compare('>=5.7') and \
wine_version.stdout().version_compare('<6.0')
compiler_options += '-DWINE_USE_CDECL'
endif
# Wine versions below 5.7 will segfault in `CoCreateGuid` which gets called
# during static initialization. I'm not exactly sure why this is happening, but
# to prevent this from causing more headaches and confusion in the future we
# should just immediately error out when building yabridge's VST3 support with
# these older Wine versions.
if wine_version.returncode() == 0 and \
wine_version.stdout().version_compare('<5.7') and \
with_vst3
error('Because of a bug in Wine < 5.7\n' +
'you cannot build yabridge with VST3 support using these older Wine versions.\n' +
'Use the \'-Dwith-vst3=false\' build option to disable VST3 support.\n\n' +
'https://github.com/robbert-vdh/yabridge/issues/63#issuecomment-757369645')
endif
# Generate header files for configuration variables such as the current git tag
# and the name of the host binary
subdir('src/common/config')
vst2_plugin_sources = [
'src/common/communication/common.cpp',
'src/common/communication/vst2.cpp',
'src/common/serialization/vst2.cpp',
'src/common/configuration.cpp',
'src/common/logging/common.cpp',
'src/common/logging/vst2.cpp',
'src/common/plugins.cpp',
'src/common/utils.cpp',
'src/plugin/bridges/vst2.cpp',
'src/plugin/host-process.cpp',
'src/plugin/utils.cpp',
'src/plugin/vst2-plugin.cpp',
version_header,
]
vst3_plugin_sources = [
'src/common/communication/common.cpp',
'src/common/logging/common.cpp',
'src/common/logging/vst3.cpp',
'src/common/serialization/vst3/component-handler/component-handler.cpp',
'src/common/serialization/vst3/component-handler/component-handler-2.cpp',
'src/common/serialization/vst3/component-handler/component-handler-3.cpp',
'src/common/serialization/vst3/component-handler/component-handler-bus-activation.cpp',
'src/common/serialization/vst3/component-handler/progress.cpp',
'src/common/serialization/vst3/component-handler/unit-handler.cpp',
'src/common/serialization/vst3/component-handler/unit-handler-2.cpp',
'src/common/serialization/vst3/context-menu/context-menu.cpp',
'src/common/serialization/vst3/host-context/host-application.cpp',
'src/common/serialization/vst3/host-context/plug-interface-support.cpp',
'src/common/serialization/vst3/plug-view/parameter-finder.cpp',
'src/common/serialization/vst3/plug-view/plug-view.cpp',
'src/common/serialization/vst3/plug-view/plug-view-content-scale-support.cpp',
'src/common/serialization/vst3/plug-frame/plug-frame.cpp',
'src/common/serialization/vst3/plugin/audio-presentation-latency.cpp',
'src/common/serialization/vst3/plugin/audio-processor.cpp',
'src/common/serialization/vst3/plugin/automation-state.cpp',
'src/common/serialization/vst3/plugin/component.cpp',
'src/common/serialization/vst3/plugin/connection-point.cpp',
'src/common/serialization/vst3/plugin/edit-controller.cpp',
'src/common/serialization/vst3/plugin/edit-controller-2.cpp',
'src/common/serialization/vst3/plugin/edit-controller-host-editing.cpp',
'src/common/serialization/vst3/plugin/info-listener.cpp',
'src/common/serialization/vst3/plugin/keyswitch-controller.cpp',
'src/common/serialization/vst3/plugin/midi-learn.cpp',
'src/common/serialization/vst3/plugin/midi-mapping.cpp',
'src/common/serialization/vst3/plugin/note-expression-controller.cpp',
'src/common/serialization/vst3/plugin/note-expression-physical-ui-mapping.cpp',
'src/common/serialization/vst3/plugin/parameter-function-name.cpp',
'src/common/serialization/vst3/plugin/plugin-base.cpp',
'src/common/serialization/vst3/plugin/prefetchable-support.cpp',
'src/common/serialization/vst3/plugin/process-context-requirements.cpp',
'src/common/serialization/vst3/plugin/program-list-data.cpp',
'src/common/serialization/vst3/plugin/unit-data.cpp',
'src/common/serialization/vst3/plugin/unit-info.cpp',
'src/common/serialization/vst3/plugin/xml-representation-controller.cpp',
'src/common/serialization/vst3/plugin-factory/plugin-factory.cpp',
'src/common/serialization/vst3/attribute-list.cpp',
'src/common/serialization/vst3/base.cpp',
'src/common/serialization/vst3/bstream.cpp',
'src/common/serialization/vst3/component-handler-proxy.cpp',
'src/common/serialization/vst3/connection-point-proxy.cpp',
'src/common/serialization/vst3/context-menu-proxy.cpp',
'src/common/serialization/vst3/context-menu-target.cpp',
'src/common/serialization/vst3/event-list.cpp',
'src/common/serialization/vst3/host-context-proxy.cpp',
'src/common/serialization/vst3/message.cpp',
'src/common/serialization/vst3/param-value-queue.cpp',
'src/common/serialization/vst3/parameter-changes.cpp',
'src/common/serialization/vst3/physical-ui-map-list.cpp',
'src/common/serialization/vst3/plug-frame-proxy.cpp',
'src/common/serialization/vst3/plug-view-proxy.cpp',
'src/common/serialization/vst3/plugin-proxy.cpp',
'src/common/serialization/vst3/plugin-factory-proxy.cpp',
'src/common/serialization/vst3/process-data.cpp',
'src/common/configuration.cpp',
'src/common/plugins.cpp',
'src/common/utils.cpp',
'src/plugin/bridges/vst3.cpp',
'src/plugin/bridges/vst3-impls/context-menu-target.cpp',
'src/plugin/bridges/vst3-impls/plugin-factory-proxy.cpp',
'src/plugin/bridges/vst3-impls/plug-view-proxy.cpp',
'src/plugin/bridges/vst3-impls/plugin-proxy.cpp',
'src/plugin/host-process.cpp',
'src/plugin/utils.cpp',
'src/plugin/vst3-plugin.cpp',
version_header,
]
host_sources = [
'src/common/communication/vst2.cpp',
'src/common/serialization/vst2.cpp',
'src/common/configuration.cpp',
'src/common/logging/common.cpp',
'src/common/logging/vst2.cpp',
'src/common/plugins.cpp',
'src/common/utils.cpp',
'src/wine-host/bridges/common.cpp',
'src/wine-host/bridges/vst2.cpp',
'src/wine-host/editor.cpp',
'src/wine-host/editor.cpp',
'src/wine-host/utils.cpp',
version_header,
]
if with_vst3
host_sources += [
'src/common/logging/vst3.cpp',
'src/common/serialization/vst3/component-handler/component-handler.cpp',
'src/common/serialization/vst3/component-handler/component-handler-2.cpp',
'src/common/serialization/vst3/component-handler/component-handler-3.cpp',
'src/common/serialization/vst3/component-handler/component-handler-bus-activation.cpp',
'src/common/serialization/vst3/component-handler/progress.cpp',
'src/common/serialization/vst3/component-handler/unit-handler.cpp',
'src/common/serialization/vst3/component-handler/unit-handler-2.cpp',
'src/common/serialization/vst3/context-menu/context-menu.cpp',
'src/common/serialization/vst3/host-context/host-application.cpp',
'src/common/serialization/vst3/host-context/plug-interface-support.cpp',
'src/common/serialization/vst3/plug-view/parameter-finder.cpp',
'src/common/serialization/vst3/plug-view/plug-view.cpp',
'src/common/serialization/vst3/plug-view/plug-view-content-scale-support.cpp',
'src/common/serialization/vst3/plug-frame/plug-frame.cpp',
'src/common/serialization/vst3/plugin/audio-presentation-latency.cpp',
'src/common/serialization/vst3/plugin/audio-processor.cpp',
'src/common/serialization/vst3/plugin/automation-state.cpp',
'src/common/serialization/vst3/plugin/component.cpp',
'src/common/serialization/vst3/plugin/connection-point.cpp',
'src/common/serialization/vst3/plugin/edit-controller.cpp',
'src/common/serialization/vst3/plugin/edit-controller-2.cpp',
'src/common/serialization/vst3/plugin/edit-controller-host-editing.cpp',
'src/common/serialization/vst3/plugin/info-listener.cpp',
'src/common/serialization/vst3/plugin/keyswitch-controller.cpp',
'src/common/serialization/vst3/plugin/midi-learn.cpp',
'src/common/serialization/vst3/plugin/midi-mapping.cpp',
'src/common/serialization/vst3/plugin/note-expression-controller.cpp',
'src/common/serialization/vst3/plugin/note-expression-physical-ui-mapping.cpp',
'src/common/serialization/vst3/plugin/parameter-function-name.cpp',
'src/common/serialization/vst3/plugin/plugin-base.cpp',
'src/common/serialization/vst3/plugin/prefetchable-support.cpp',
'src/common/serialization/vst3/plugin/process-context-requirements.cpp',
'src/common/serialization/vst3/plugin/program-list-data.cpp',
'src/common/serialization/vst3/plugin/unit-data.cpp',
'src/common/serialization/vst3/plugin/unit-info.cpp',
'src/common/serialization/vst3/plugin/xml-representation-controller.cpp',
'src/common/serialization/vst3/plugin-factory/plugin-factory.cpp',
'src/common/serialization/vst3/attribute-list.cpp',
'src/common/serialization/vst3/base.cpp',
'src/common/serialization/vst3/bstream.cpp',
'src/common/serialization/vst3/component-handler-proxy.cpp',
'src/common/serialization/vst3/connection-point-proxy.cpp',
'src/common/serialization/vst3/context-menu-proxy.cpp',
'src/common/serialization/vst3/context-menu-target.cpp',
'src/common/serialization/vst3/event-list.cpp',
'src/common/serialization/vst3/host-context-proxy.cpp',
'src/common/serialization/vst3/message.cpp',
'src/common/serialization/vst3/param-value-queue.cpp',
'src/common/serialization/vst3/parameter-changes.cpp',
'src/common/serialization/vst3/physical-ui-map-list.cpp',
'src/common/serialization/vst3/plug-frame-proxy.cpp',
'src/common/serialization/vst3/plug-view-proxy.cpp',
'src/common/serialization/vst3/plugin-proxy.cpp',
'src/common/serialization/vst3/plugin-factory-proxy.cpp',
'src/common/serialization/vst3/process-data.cpp',
'src/wine-host/bridges/vst3-impls/component-handler-proxy.cpp',
'src/wine-host/bridges/vst3-impls/connection-point-proxy.cpp',
'src/wine-host/bridges/vst3-impls/context-menu-proxy.cpp',
'src/wine-host/bridges/vst3-impls/host-context-proxy.cpp',
'src/wine-host/bridges/vst3-impls/plug-frame-proxy.cpp',
'src/wine-host/bridges/vst3.cpp',
]
endif
individual_host_sources = host_sources + ['src/wine-host/individual-host.cpp']
group_host_sources = host_sources + [
'src/wine-host/bridges/group.cpp',
'src/wine-host/group-host.cpp',
]
# Statically link against Boost.Filesystem, otherwise it would become impossible
# to distribute a prebuilt version of yabridge
boost_dep = dependency('boost', version : '>=1.66', static : with_static_boost)
boost_filesystem_dep = dependency(
'boost',
version : '>=1.66',
modules : ['filesystem'],
static : with_static_boost,
)
# TODO: Meson doesn't have a way to define version ranges, does it? Like
# `^>=5.2.0`, `>=5.2.0 && <6.0.0` or `5.2.*`.
bitsery_dep = dependency('bitsery', version : '>=5.2.0', fallback : ['bitsery', 'bitsery_dep'])
function2_dep = dependency('function2', version : '>=4.1.0', fallback : ['function2', 'function2_dep'])
threads_dep = dependency('threads')
tomlplusplus_dep = dependency('tomlplusplus', version : '>=2.1.0', fallback : ['tomlplusplus', 'tomlplusplus_dep'])
# The built in threads dependency does not know how to handle winegcc
wine_threads_dep = declare_dependency(link_args : '-lpthread')
xcb_dep = dependency('xcb')
wine_ole32_dep = declare_dependency(link_args : '-lole32')
# The SDK includes a comment pragma that would link to this on MSVC
wine_shell32_dep = declare_dependency(link_args : '-lshell32')
wine_uuid_dep = declare_dependency(link_args : '-luuid')
include_dir = include_directories('src/include')
if with_vst3
# Meson does not allow mixing native and non native dependencies from
# subprojects. The only workaround is to only define the necessary variables
# there, and to then assemble the dependencies here ourselves.
vst3 = subproject('vst3', version : '3.7.2')
vst3_compiler_options = vst3.get_variable('compiler_options')
vst3_include_dir = vst3.get_variable('include_dir')
# We'll create a dependency for the plugin SDK for our native VST3 plugin
vst3_base_native = static_library(
'base_native',
vst3.get_variable('base_sources'),
cpp_args : vst3_compiler_options + ['-Wno-cpp'],
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : true,
)
vst3_pluginterfaces_native = static_library(
'pluginterfaces_native',
vst3.get_variable('pluginterfaces_sources'),
cpp_args : vst3_compiler_options,
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : true,
)
vst3_sdk_native = static_library(
'sdk_native',
vst3.get_variable('sdk_common_sources') + vst3.get_variable('sdk_sources'),
link_with : [vst3_base_native, vst3_pluginterfaces_native],
cpp_args : vst3_compiler_options + ['-Wno-multichar'],
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : true,
)
vst3_sdk_native_dep = declare_dependency(
link_with : vst3_sdk_native,
include_directories : vst3_include_dir,
compile_args : vst3_compiler_options,
)
# And another dependency for the host SDK for our Wine host applications
# We need to do some minor hacking to get this to compile with winegcc. Most
# notably some attributes are named differently, and the SDK uses 'Windows.h'
# instead of 'windows.h' like how the file is actually called.
# message(vst3_include_dir)
vst3_sdk_base_dir = vst3.get_variable('sdk_base_dir')
patch_result = run_command('tools/patch-vst3-sdk.sh', vst3_sdk_base_dir)
if patch_result.returncode() == 0
message(patch_result.stdout())
else
error('Error while trying to patch the VST3 SDK:\n' + patch_result.stderr())
endif
vst3_wine_compiler_options = [
# Some stuff from `windows.h` results in conflicting definitions
'-DNOMINMAX',
'-DWINE_NOWINSOCK',
]
vst3_base_wine_64bit = static_library(
'vst3_base_wine_64bit',
vst3.get_variable('base_sources'),
cpp_args : vst3_compiler_options + vst3_wine_compiler_options + wine_64bit_compiler_options + [ '-Wno-cpp'],
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : false,
)
vst3_pluginterfaces_wine_64bit = static_library(
'vst3_pluginterfaces_wine_64bit',
vst3.get_variable('pluginterfaces_sources'),
cpp_args : vst3_compiler_options + vst3_wine_compiler_options + wine_64bit_compiler_options,
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : false,
)
vst3_sdk_hosting_wine_64bit = static_library(
'vst3_sdk_hosting_wine_64bit',
vst3.get_variable('sdk_common_sources') + vst3.get_variable('sdk_hosting_sources'),
link_with : [vst3_base_wine_64bit, vst3_pluginterfaces_wine_64bit],
cpp_args : vst3_compiler_options + vst3_wine_compiler_options + wine_64bit_compiler_options + ['-Wno-multichar'],
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : false,
)
vst3_sdk_hosting_wine_64bit_dep = declare_dependency(
link_with : vst3_sdk_hosting_wine_64bit,
include_directories : vst3_include_dir,
# This does mean that we now have a lot of defines in our code, but the
# alternative would be patching every location in the SDK where they include
# `windows.h`
compile_args : vst3_compiler_options + vst3_wine_compiler_options,
)
# And another time for the 32-bit version
if with_bitbridge
vst3_base_wine_32bit = static_library(
'vst3_base_wine_32bit',
vst3.get_variable('base_sources'),
cpp_args : vst3_compiler_options + vst3_wine_compiler_options + wine_32bit_compiler_options + ['-Wno-cpp'],
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : false,
)
vst3_pluginterfaces_wine_32bit = static_library(
'vst3_pluginterfaces_wine_32bit',
vst3.get_variable('pluginterfaces_sources'),
cpp_args : vst3_compiler_options + vst3_wine_compiler_options + wine_32bit_compiler_options,
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : false,
)
vst3_sdk_hosting_wine_32bit = static_library(
'vst3_sdk_hosting_wine_32bit',
vst3.get_variable('sdk_common_sources') + vst3.get_variable('sdk_hosting_sources'),
link_with : [vst3_base_wine_32bit, vst3_pluginterfaces_wine_32bit],
cpp_args : vst3_compiler_options + vst3_wine_compiler_options + wine_32bit_compiler_options + ['-Wno-multichar'],
include_directories : vst3_include_dir,
override_options : ['warning_level=0'],
native : false,
)
vst3_sdk_hosting_wine_32bit_dep = declare_dependency(
link_with : vst3_sdk_hosting_wine_32bit,
include_directories : vst3_include_dir,
# This does mean that we now have a lot of defines in our code, but the
# alternative would be patching every location in the SDK where they include
# `windows.h`
compile_args : vst3_compiler_options + vst3_wine_compiler_options,
)
endif
endif
# The application consists of a plugin (`libyabridge-{vst2,vst3}.so`) that calls
# a Winelib application (`yabridge-{host,group}{,-32}.exe`) that can host
# Windows VST plugins. More information about the way these two components work
# together can be found in `docs/architecture.md`.
shared_library(
'yabridge-vst2',
vst2_plugin_sources,
native : true,
include_directories : include_dir,
dependencies : [
boost_dep,
boost_filesystem_dep,
bitsery_dep,
threads_dep,
tomlplusplus_dep,
],
cpp_args : compiler_options,
link_args : ['-ldl']
)
if with_vst3
# This is the VST3 equivalent of `libyabridge-vst2.so`. The Wine host
# applications can handle both VST2 and VST3 plugins.
shared_library(
'yabridge-vst3',
vst3_plugin_sources,
native : true,
include_directories : include_dir,
dependencies : [
boost_dep,
boost_filesystem_dep,
bitsery_dep,
function2_dep,
threads_dep,
tomlplusplus_dep,
vst3_sdk_native_dep,
],
cpp_args : compiler_options,
link_args : ['-ldl'],
)
endif
host_64bit_deps = [
boost_dep,
boost_filesystem_dep,
bitsery_dep,
function2_dep,
tomlplusplus_dep,
wine_threads_dep,
xcb_dep,
]
if with_vst3
host_64bit_deps += [
vst3_sdk_hosting_wine_64bit_dep,
wine_ole32_dep,
wine_shell32_dep,
wine_uuid_dep,
]
endif
if with_bitbridge
message('Bitbridge enabled, configuring a 32-bit host application')
# I honestly have no idea what the correct way is to have `dependency()` or
# `compiler.find_dependency()` search for 32-bit versions of libraries when
# cross-compiling. Meson also doesn't seem to respect the default linker
# search path set by the system in `find_library()`. If anyone does know how
# to properly do this, please let me know!
winegcc = meson.get_compiler('cpp', native : false)
boost_filesystem_32bit_dep = winegcc.find_library(
'boost_filesystem',
static : with_static_boost,
dirs : [
# Used by Arch based distros
'/usr/local/lib32',
'/usr/lib32',
# Used by Debian based distros
'/usr/local/lib/i386-linux-gnu',
'/usr/lib/i386-linux-gnu',
# Used by Red Hat based distros, could cause issues though since Meson
# cannot differentiate between the 32-bit version and the regular 64-bit
# version that would normally be in /lib
'/usr/local/lib',
'/usr/lib',
]
)
xcb_32bit_dep = winegcc.find_library('xcb')
host_32bit_deps = [
boost_dep,
boost_filesystem_32bit_dep,
bitsery_dep,
function2_dep,
tomlplusplus_dep,
wine_threads_dep,
xcb_32bit_dep,
]
if with_vst3
host_32bit_deps += [
vst3_sdk_hosting_wine_32bit_dep,
wine_ole32_dep,
wine_shell32_dep,
wine_uuid_dep,
]
endif
endif
executable(
individual_host_name_64bit,
individual_host_sources,
native : false,
include_directories : include_dir,
dependencies : host_64bit_deps,
cpp_args : compiler_options + wine_64bit_compiler_options,
link_args : ['-m64'],
)
executable(
group_host_name_64bit,
group_host_sources,
native : false,
include_directories : include_dir,
dependencies : host_64bit_deps,
cpp_args : compiler_options + wine_64bit_compiler_options,
link_args : ['-m64'],
)
if with_bitbridge
executable(
individual_host_name_32bit,
individual_host_sources,
native : false,
include_directories : include_dir,
dependencies : host_32bit_deps,
cpp_args : compiler_options + wine_32bit_compiler_options,
link_args : ['-m32'],
)
executable(
group_host_name_32bit,
group_host_sources,
native : false,
include_directories : include_dir,
dependencies : host_32bit_deps,
cpp_args : compiler_options + wine_32bit_compiler_options,
link_args : ['-m32'],
)
endif