meson: accept either shared or static libraries if --disable-static

Meson's "static" argument to cc.find_library is a tri-state.  By default
Meson *prefers* a shared library, which basically means using -l to
look for it; instead, "static: false" *requires* a shared library.  Of
course, "static: true" requires a static library, which is all good
for --enable-static builds.

For --disable-static, "static: false" is rarely desirable; it does not
match what the configure script used to do and the test is more complex
(and harder to debug if it fails, which was reported by Peter Lieven
for librbd).

Reported-by: Peter Lieven <pl@kamp.de>
Tested-by: Peter Lieven <pl@kamp.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2021-01-26 11:15:33 +01:00
parent 8db0b20415
commit d7dedf428f
2 changed files with 42 additions and 39 deletions

View File

@ -100,7 +100,7 @@ In meson.build::
# Detect dependency # Detect dependency
sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
method: 'pkg-config', method: 'pkg-config',
static: enable_static) kwargs: static_kwargs)
# Create config-host.h (if applicable) # Create config-host.h (if applicable)
config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())

View File

@ -18,6 +18,9 @@ config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
enable_modules = 'CONFIG_MODULES' in config_host enable_modules = 'CONFIG_MODULES' in config_host
enable_static = 'CONFIG_STATIC' in config_host enable_static = 'CONFIG_STATIC' in config_host
# Allow both shared and static libraries unless --enable-static
static_kwargs = enable_static ? {'static': true} : {}
# Temporary directory used for files created while # Temporary directory used for files created while
# configure runs. Since it is in the build directory # configure runs. Since it is in the build directory
# we can safely blow away any previous version of it # we can safely blow away any previous version of it
@ -311,14 +314,14 @@ endif
pixman = not_found pixman = not_found
if have_system or have_tools if have_system or have_tools
pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
endif endif
pam = not_found pam = not_found
if 'CONFIG_AUTH_PAM' in config_host if 'CONFIG_AUTH_PAM' in config_host
pam = cc.find_library('pam') pam = cc.find_library('pam')
endif endif
libaio = cc.find_library('aio', required: false) libaio = cc.find_library('aio', required: false)
zlib = dependency('zlib', required: true, static: enable_static) zlib = dependency('zlib', required: true, kwargs: static_kwargs)
linux_io_uring = not_found linux_io_uring = not_found
if 'CONFIG_LINUX_IO_URING' in config_host if 'CONFIG_LINUX_IO_URING' in config_host
linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(), linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
@ -333,7 +336,7 @@ libnfs = not_found
if not get_option('libnfs').auto() or have_block if not get_option('libnfs').auto() or have_block
libnfs = dependency('libnfs', version: '>=1.9.3', libnfs = dependency('libnfs', version: '>=1.9.3',
required: get_option('libnfs'), required: get_option('libnfs'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
endif endif
libattr_test = ''' libattr_test = '''
@ -354,7 +357,7 @@ if not get_option('attr').disabled()
else else
libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'], libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
required: get_option('attr'), required: get_option('attr'),
static: enable_static) kwargs: static_kwargs)
if libattr.found() and not \ if libattr.found() and not \
cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR') cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
libattr = not_found libattr = not_found
@ -381,14 +384,14 @@ seccomp = not_found
if not get_option('seccomp').auto() or have_system or have_tools if not get_option('seccomp').auto() or have_system or have_tools
seccomp = dependency('libseccomp', version: '>=2.3.0', seccomp = dependency('libseccomp', version: '>=2.3.0',
required: get_option('seccomp'), required: get_option('seccomp'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
endif endif
libcap_ng = not_found libcap_ng = not_found
if not get_option('cap_ng').auto() or have_system or have_tools if not get_option('cap_ng').auto() or have_system or have_tools
libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'], libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
required: get_option('cap_ng'), required: get_option('cap_ng'),
static: enable_static) kwargs: static_kwargs)
endif endif
if libcap_ng.found() and not cc.links(''' if libcap_ng.found() and not cc.links('''
#include <cap-ng.h> #include <cap-ng.h>
@ -409,7 +412,7 @@ if get_option('xkbcommon').auto() and not have_system and not have_tools
xkbcommon = not_found xkbcommon = not_found
else else
xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
endif endif
vde = not_found vde = not_found
if config_host.has_key('CONFIG_VDE') if config_host.has_key('CONFIG_VDE')
@ -445,13 +448,13 @@ libiscsi = not_found
if not get_option('libiscsi').auto() or have_block if not get_option('libiscsi').auto() or have_block
libiscsi = dependency('libiscsi', version: '>=1.9.0', libiscsi = dependency('libiscsi', version: '>=1.9.0',
required: get_option('libiscsi'), required: get_option('libiscsi'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
endif endif
zstd = not_found zstd = not_found
if not get_option('zstd').auto() or have_block if not get_option('zstd').auto() or have_block
zstd = dependency('libzstd', version: '>=1.4.0', zstd = dependency('libzstd', version: '>=1.4.0',
required: get_option('zstd'), required: get_option('zstd'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
endif endif
gbm = not_found gbm = not_found
if 'CONFIG_GBM' in config_host if 'CONFIG_GBM' in config_host
@ -468,14 +471,14 @@ if not get_option('curl').auto() or have_block
curl = dependency('libcurl', version: '>=7.29.0', curl = dependency('libcurl', version: '>=7.29.0',
method: 'pkg-config', method: 'pkg-config',
required: get_option('curl'), required: get_option('curl'),
static: enable_static) kwargs: static_kwargs)
endif endif
libudev = not_found libudev = not_found
if targetos == 'linux' and (have_system or have_tools) if targetos == 'linux' and (have_system or have_tools)
libudev = dependency('libudev', libudev = dependency('libudev',
method: 'pkg-config', method: 'pkg-config',
required: get_option('libudev'), required: get_option('libudev'),
static: enable_static) kwargs: static_kwargs)
endif endif
mpathlibs = [libudev] mpathlibs = [libudev]
@ -511,17 +514,17 @@ if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
}''' }'''
libmpathpersist = cc.find_library('mpathpersist', libmpathpersist = cc.find_library('mpathpersist',
required: get_option('mpath'), required: get_option('mpath'),
static: enable_static) kwargs: static_kwargs)
if libmpathpersist.found() if libmpathpersist.found()
mpathlibs += libmpathpersist mpathlibs += libmpathpersist
if enable_static if enable_static
mpathlibs += cc.find_library('devmapper', mpathlibs += cc.find_library('devmapper',
required: get_option('mpath'), required: get_option('mpath'),
static: enable_static) kwargs: static_kwargs)
endif endif
mpathlibs += cc.find_library('multipath', mpathlibs += cc.find_library('multipath',
required: get_option('mpath'), required: get_option('mpath'),
static: enable_static) kwargs: static_kwargs)
foreach lib: mpathlibs foreach lib: mpathlibs
if not lib.found() if not lib.found()
mpathlibs = [] mpathlibs = []
@ -571,7 +574,7 @@ if have_system and not get_option('curses').disabled()
curses = dependency(curses_dep, curses = dependency(curses_dep,
required: false, required: false,
method: 'pkg-config', method: 'pkg-config',
static: enable_static) kwargs: static_kwargs)
endif endif
endforeach endforeach
msg = get_option('curses').enabled() ? 'curses library not found' : '' msg = get_option('curses').enabled() ? 'curses library not found' : ''
@ -596,7 +599,7 @@ if have_system and not get_option('curses').disabled()
foreach curses_libname : curses_libname_list foreach curses_libname : curses_libname_list
libcurses = cc.find_library(curses_libname, libcurses = cc.find_library(curses_libname,
required: false, required: false,
static: enable_static) kwargs: static_kwargs)
if libcurses.found() if libcurses.found()
if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses) if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
curses = declare_dependency(compile_args: curses_compile_args, curses = declare_dependency(compile_args: curses_compile_args,
@ -647,7 +650,7 @@ brlapi = not_found
if not get_option('brlapi').auto() or have_system if not get_option('brlapi').auto() or have_system
brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'], brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
required: get_option('brlapi'), required: get_option('brlapi'),
static: enable_static) kwargs: static_kwargs)
if brlapi.found() and not cc.links(''' if brlapi.found() and not cc.links('''
#include <brlapi.h> #include <brlapi.h>
#include <stddef.h> #include <stddef.h>
@ -663,7 +666,7 @@ endif
sdl = not_found sdl = not_found
if not get_option('sdl').auto() or (have_system and not cocoa.found()) if not get_option('sdl').auto() or (have_system and not cocoa.found())
sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static) sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
sdl_image = not_found sdl_image = not_found
endif endif
if sdl.found() if sdl.found()
@ -671,7 +674,7 @@ if sdl.found()
sdl = declare_dependency(compile_args: '-Wno-undef', sdl = declare_dependency(compile_args: '-Wno-undef',
dependencies: sdl) dependencies: sdl)
sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
else else
if get_option('sdl_image').enabled() if get_option('sdl_image').enabled()
error('sdl-image required, but SDL was @0@'.format( error('sdl-image required, but SDL was @0@'.format(
@ -683,10 +686,10 @@ endif
rbd = not_found rbd = not_found
if not get_option('rbd').auto() or have_block if not get_option('rbd').auto() or have_block
librados = cc.find_library('rados', required: get_option('rbd'), librados = cc.find_library('rados', required: get_option('rbd'),
static: enable_static) kwargs: static_kwargs)
librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'], librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
required: get_option('rbd'), required: get_option('rbd'),
static: enable_static) kwargs: static_kwargs)
if librados.found() and librbd.found() and cc.links(''' if librados.found() and librbd.found() and cc.links('''
#include <stdio.h> #include <stdio.h>
#include <rbd/librbd.h> #include <rbd/librbd.h>
@ -705,7 +708,7 @@ glusterfs_iocb_has_stat = false
if not get_option('glusterfs').auto() or have_block if not get_option('glusterfs').auto() or have_block
glusterfs = dependency('glusterfs-api', version: '>=3', glusterfs = dependency('glusterfs-api', version: '>=3',
required: get_option('glusterfs'), required: get_option('glusterfs'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
if glusterfs.found() if glusterfs.found()
glusterfs_ftruncate_has_stat = cc.links(''' glusterfs_ftruncate_has_stat = cc.links('''
#include <glusterfs/api/glfs.h> #include <glusterfs/api/glfs.h>
@ -744,7 +747,7 @@ libbzip2 = not_found
if not get_option('bzip2').auto() or have_block if not get_option('bzip2').auto() or have_block
libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'], libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
required: get_option('bzip2'), required: get_option('bzip2'),
static: enable_static) kwargs: static_kwargs)
if libbzip2.found() and not cc.links(''' if libbzip2.found() and not cc.links('''
#include <bzlib.h> #include <bzlib.h>
int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2) int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
@ -761,7 +764,7 @@ liblzfse = not_found
if not get_option('lzfse').auto() or have_block if not get_option('lzfse').auto() or have_block
liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'], liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
required: get_option('lzfse'), required: get_option('lzfse'),
static: enable_static) kwargs: static_kwargs)
endif endif
if liblzfse.found() and not cc.links(''' if liblzfse.found() and not cc.links('''
#include <lzfse.h> #include <lzfse.h>
@ -798,12 +801,12 @@ if not get_option('gtk').auto() or (have_system and not cocoa.found())
gtk = dependency('gtk+-3.0', version: '>=3.22.0', gtk = dependency('gtk+-3.0', version: '>=3.22.0',
method: 'pkg-config', method: 'pkg-config',
required: get_option('gtk'), required: get_option('gtk'),
static: enable_static) kwargs: static_kwargs)
if gtk.found() if gtk.found()
gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0', gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
method: 'pkg-config', method: 'pkg-config',
required: false, required: false,
static: enable_static) kwargs: static_kwargs)
gtk = declare_dependency(dependencies: [gtk, gtkx11]) gtk = declare_dependency(dependencies: [gtk, gtkx11])
endif endif
endif endif
@ -816,7 +819,7 @@ endif
x11 = not_found x11 = not_found
if gtkx11.found() or 'lm32-softmmu' in target_dirs if gtkx11.found() or 'lm32-softmmu' in target_dirs
x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(), x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
static: enable_static) kwargs: static_kwargs)
endif endif
vnc = not_found vnc = not_found
png = not_found png = not_found
@ -825,12 +828,12 @@ sasl = not_found
if get_option('vnc').enabled() if get_option('vnc').enabled()
vnc = declare_dependency() # dummy dependency vnc = declare_dependency() # dummy dependency
png = dependency('libpng', required: get_option('vnc_png'), png = dependency('libpng', required: get_option('vnc_png'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'), jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'], sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
required: get_option('vnc_sasl'), required: get_option('vnc_sasl'),
static: enable_static) kwargs: static_kwargs)
if sasl.found() if sasl.found()
sasl = declare_dependency(dependencies: sasl, sasl = declare_dependency(dependencies: sasl,
compile_args: '-DSTRUCT_IOVEC_DEFINED') compile_args: '-DSTRUCT_IOVEC_DEFINED')
@ -841,7 +844,7 @@ snappy = not_found
if not get_option('snappy').auto() or have_system if not get_option('snappy').auto() or have_system
snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'], snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
required: get_option('snappy'), required: get_option('snappy'),
static: enable_static) kwargs: static_kwargs)
endif endif
if snappy.found() and not cc.links(''' if snappy.found() and not cc.links('''
#include <snappy-c.h> #include <snappy-c.h>
@ -858,7 +861,7 @@ lzo = not_found
if not get_option('lzo').auto() or have_system if not get_option('lzo').auto() or have_system
lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'], lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
required: get_option('lzo'), required: get_option('lzo'),
static: enable_static) kwargs: static_kwargs)
endif endif
if lzo.found() and not cc.links(''' if lzo.found() and not cc.links('''
#include <lzo/lzo1x.h> #include <lzo/lzo1x.h>
@ -893,7 +896,7 @@ u2f = not_found
if have_system if have_system
u2f = dependency('u2f-emu', required: get_option('u2f'), u2f = dependency('u2f-emu', required: get_option('u2f'),
method: 'pkg-config', method: 'pkg-config',
static: enable_static) kwargs: static_kwargs)
endif endif
usbredir = not_found usbredir = not_found
if 'CONFIG_USB_REDIR' in config_host if 'CONFIG_USB_REDIR' in config_host
@ -920,7 +923,7 @@ if 'CONFIG_TASN1' in config_host
link_args: config_host['TASN1_LIBS'].split()) link_args: config_host['TASN1_LIBS'].split())
endif endif
keyutils = dependency('libkeyutils', required: false, keyutils = dependency('libkeyutils', required: false,
method: 'pkg-config', static: enable_static) method: 'pkg-config', kwargs: static_kwargs)
has_gettid = cc.has_function('gettid') has_gettid = cc.has_function('gettid')
@ -979,7 +982,7 @@ endif
fuse = dependency('fuse3', required: get_option('fuse'), fuse = dependency('fuse3', required: get_option('fuse'),
version: '>=3.1', method: 'pkg-config', version: '>=3.1', method: 'pkg-config',
static: enable_static) kwargs: static_kwargs)
fuse_lseek = not_found fuse_lseek = not_found
if not get_option('fuse_lseek').disabled() if not get_option('fuse_lseek').disabled()
@ -1367,7 +1370,7 @@ capstone_opt = get_option('capstone')
if capstone_opt in ['enabled', 'auto', 'system'] if capstone_opt in ['enabled', 'auto', 'system']
have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile') have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
capstone = dependency('capstone', version: '>=4.0', capstone = dependency('capstone', version: '>=4.0',
static: enable_static, method: 'pkg-config', kwargs: static_kwargs, method: 'pkg-config',
required: capstone_opt == 'system' or required: capstone_opt == 'system' or
capstone_opt == 'enabled' and not have_internal) capstone_opt == 'enabled' and not have_internal)
if capstone.found() if capstone.found()
@ -1477,7 +1480,7 @@ if have_system
slirp_opt = get_option('slirp') slirp_opt = get_option('slirp')
if slirp_opt in ['enabled', 'auto', 'system'] if slirp_opt in ['enabled', 'auto', 'system']
have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build') have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
slirp = dependency('slirp', static: enable_static, slirp = dependency('slirp', kwargs: static_kwargs,
method: 'pkg-config', method: 'pkg-config',
required: slirp_opt == 'system' or required: slirp_opt == 'system' or
slirp_opt == 'enabled' and not have_internal) slirp_opt == 'enabled' and not have_internal)
@ -1556,7 +1559,7 @@ fdt_opt = get_option('fdt')
if have_system if have_system
if fdt_opt in ['enabled', 'auto', 'system'] if fdt_opt in ['enabled', 'auto', 'system']
have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt') have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
fdt = cc.find_library('fdt', static: enable_static, fdt = cc.find_library('fdt', kwargs: static_kwargs,
required: fdt_opt == 'system' or required: fdt_opt == 'system' or
fdt_opt == 'enabled' and not have_internal) fdt_opt == 'enabled' and not have_internal)
if fdt.found() and cc.links(''' if fdt.found() and cc.links('''