Browse Source

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>
Paolo Bonzini 4 years ago
parent
commit
d7dedf428f
2 changed files with 42 additions and 39 deletions
  1. 1 1
      docs/devel/build-system.rst
  2. 41 38
      meson.build

+ 1 - 1
docs/devel/build-system.rst

@@ -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())

+ 41 - 38
meson.build

@@ -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('''