2020-08-03 09:50:49 +03:00
project (
2020-08-19 00:57:39 +03:00
'libvirt' , 'c' ,
2023-04-01 10:52:31 +03:00
version : '9.3.0' ,
2020-08-19 00:57:39 +03:00
license : 'LGPLv2+' ,
2022-10-07 10:31:25 +03:00
meson_version : '>= 0.56.0' ,
2020-08-19 00:57:39 +03:00
default_options : [
'buildtype=debugoptimized' ,
'b_pie=true' ,
'c_std=gnu99' ,
'warning_level=2' ,
] ,
2020-08-03 09:50:49 +03:00
)
# figure out if we are building from git
2022-01-22 22:30:11 +03:00
git = run_command ( 'test' , '-d' , '.git' , check : false ) . returncode ( ) == 0
2020-08-03 09:50:49 +03:00
if git and not get_option ( 'no_git' )
2022-01-22 22:30:11 +03:00
run_command ( 'git' , 'submodule' , 'update' , '--init' , check : true )
2020-08-03 09:50:49 +03:00
endif
# prepare build configuration data
conf = configuration_data ( )
conf . set ( '_GNU_SOURCE' , 1 )
2022-10-07 10:31:32 +03:00
conf . set_quoted ( 'abs_top_builddir' , meson . project_build_root ( ) )
2022-10-07 10:37:43 +03:00
conf . set_quoted ( 'abs_top_srcdir' , meson . project_source_root ( ) )
2020-08-03 09:50:49 +03:00
conf . set_quoted ( 'PACKAGE' , meson . project_name ( ) )
conf . set_quoted ( 'PACKAGE_NAME' , meson . project_name ( ) )
conf . set_quoted ( 'PACKAGE_VERSION' , meson . project_version ( ) )
conf . set_quoted ( 'VERSION' , meson . project_version ( ) )
2020-06-17 00:47:04 +03:00
if host_machine . system ( ) == 'windows'
# For AI_ADDRCONFIG
conf . set ( '_WIN32_WINNT' , '0x0600' ) # Win Vista / Server 2008
conf . set ( 'WINVER' , '0x0600' ) # Win Vista / Server 2008
endif
2020-08-03 09:50:49 +03:00
# set various paths
if get_option ( 'system' )
prefix = '/usr'
libdir = prefix / 'lib64'
2022-01-22 22:30:11 +03:00
if run_command ( 'test' , '-d' , libdir , check : false ) . returncode ( ) != 0
2020-08-03 09:50:49 +03:00
libdir = prefix / 'lib'
endif
localstatedir = '/var'
sysconfdir = '/etc'
else
prefix = get_option ( 'prefix' )
libdir = prefix / get_option ( 'libdir' )
localstatedir = prefix / get_option ( 'localstatedir' )
sysconfdir = prefix / get_option ( 'sysconfdir' )
endif
# if --prefix is /usr, don't use /usr/var for localstatedir or /usr/etc for
# sysconfdir as this makes a lot of things break in testing situations
if prefix == '/usr'
if localstatedir == '/usr/var'
localstatedir = '/var'
endif
if sysconfdir == '/usr/etc'
sysconfdir = '/etc'
endif
endif
runstatedir = get_option ( 'runstatedir' )
if runstatedir == ''
runstatedir = localstatedir / 'run'
endif
bindir = prefix / get_option ( 'bindir' )
datadir = prefix / get_option ( 'datadir' )
includedir = prefix / get_option ( 'includedir' )
infodir = prefix / get_option ( 'infodir' )
libexecdir = prefix / get_option ( 'libexecdir' )
localedir = prefix / get_option ( 'localedir' )
mandir = prefix / get_option ( 'mandir' )
sbindir = prefix / get_option ( 'sbindir' )
sharedstatedir = prefix / get_option ( 'sharedstatedir' )
2021-02-26 22:11:06 +03:00
docdir = get_option ( 'docdir' )
if docdir == ''
docdir = datadir / 'doc' / meson . project_name ( )
endif
2020-08-03 09:50:49 +03:00
confdir = sysconfdir / meson . project_name ( )
pkgdatadir = datadir / meson . project_name ( )
2020-06-18 16:25:15 +03:00
# generate configmake.h header
configmake_conf = configuration_data ( )
configmake_conf . set_quoted ( 'BINDIR' , bindir )
configmake_conf . set_quoted ( 'DATADIR' , datadir )
configmake_conf . set_quoted ( 'LIBDIR' , libdir )
configmake_conf . set_quoted ( 'LIBEXECDIR' , libexecdir )
configmake_conf . set_quoted ( 'LOCALEDIR' , localedir )
configmake_conf . set_quoted ( 'LOCALSTATEDIR' , localstatedir )
configmake_conf . set_quoted ( 'MANDIR' , mandir )
configmake_conf . set_quoted ( 'PKGDATADIR' , pkgdatadir )
configmake_conf . set_quoted ( 'PREFIX' , prefix )
configmake_conf . set_quoted ( 'RUNSTATEDIR' , runstatedir )
configmake_conf . set_quoted ( 'SBINDIR' , sbindir )
configmake_conf . set_quoted ( 'SYSCONFDIR' , sysconfdir )
configure_file (
input : 'configmake.h.in' ,
2020-08-25 19:30:57 +03:00
output : '@BASENAME@' ,
2020-06-18 16:25:15 +03:00
configuration : configmake_conf ,
)
2020-07-28 18:22:42 +03:00
# packager options
packager = get_option ( 'packager' )
packager_version = get_option ( 'packager_version' )
if packager != ''
conf . set_quoted ( 'PACKAGER' , packager )
endif
if packager_version != ''
conf . set_quoted ( 'PACKAGER_VERSION' , packager_version )
endif
2020-07-24 17:07:05 +03:00
# test options
if get_option ( 'expensive_tests' ) . auto ( )
use_expensive_tests = not git
else
use_expensive_tests = get_option ( 'expensive_tests' ) . enabled ( )
endif
2020-04-30 15:56:21 +03:00
coverage_flags = [ ]
if get_option ( 'test_coverage' )
coverage_flags = [
'-fprofile-arcs' ,
'-ftest-coverage' ,
]
endif
2020-07-24 17:07:05 +03:00
2020-08-19 12:15:35 +03:00
# Add RPATH information when building for a non-standard prefix, or
# when explicitly requested to do so
if prefix == '/usr' and not get_option ( 'rpath' ) . enabled ( )
libvirt_rpath = ''
else
libvirt_rpath = libdir
endif
2020-08-03 09:50:49 +03:00
# figure out libvirt version strings
arr_version = meson . project_version ( ) . split ( '.' )
libvirt_version_number = 1000000 * arr_version [ 0 ] . to_int ( ) + 1000 * arr_version [ 1 ] . to_int ( ) + arr_version [ 2 ] . to_int ( )
conf . set ( 'LIBVIRT_VERSION_NUMBER' , libvirt_version_number )
# In libtool terminology we need to figure out:
#
# CURRENT
# The most recent interface number that this library implements.
#
# REVISION
# The implementation number of the CURRENT interface.
#
# AGE
# The difference between the newest and oldest interfaces that this
# library implements.
#
# In other words, the library implements all the interface numbers
# in the range from number `CURRENT - AGE' to `CURRENT'.
#
# Libtool assigns the soname version from `CURRENT - AGE', and we
# don't want that to ever change in libvirt. ie it must always be
# zero, to produce libvirt.so.0.
#
# We would, however, like the libvirt version number reflected
# in the so version'd symlinks, and this is based on AGE.REVISION
# eg libvirt.so.0.AGE.REVISION
#
# The following examples show what libtool will do
#
# Input: 0.9.14 -> libvirt.so.0.9.14
# Input: 1.0.0 -> libvirt.so.0.1000.0
# Input: 2.5.8 -> libvirt.so.0.2005.8
#
# Assuming we do ever want to break soname version, this can
# toggled. But seriously, don't ever touch this.
libvirt_so_version = 0
libvirt_age = 1000 * arr_version [ 0 ] . to_int ( ) + arr_version [ 1 ] . to_int ( )
libvirt_revision = arr_version [ 2 ] . to_int ( )
libvirt_lib_version = '@0@.@1@.@2@' . format ( libvirt_so_version , libvirt_age , libvirt_revision )
2020-04-30 15:50:46 +03:00
# check compile flags
cc = meson . get_compiler ( 'c' )
2020-07-24 17:35:03 +03:00
cc_flags = [ ]
2020-04-30 15:50:46 +03:00
2020-07-24 17:35:03 +03:00
git_werror = get_option ( 'git_werror' )
2021-04-08 13:50:30 +03:00
if ( git_werror . enabled ( ) or git_werror . auto ( ) ) and git and not get_option ( 'werror' )
2020-07-24 17:35:03 +03:00
cc_flags + = [ '-Werror' ]
endif
2021-04-08 13:23:03 +03:00
# gcc --help=warnings outputs
ptrdiff_max = cc . sizeof ( 'ptrdiff_t' , prefix : '#include <stddef.h>' )
size_max = cc . sizeof ( 'size_t' , prefix : '#include <stdint.h>' )
# Compute max safe object size by checking ptrdiff_t and size_t sizes.
# Ideally we would get PTRDIFF_MAX and SIZE_MAX values but it would
# give us (2147483647L) and we would have to remove the () and the suffix
# in order to convert it to numbers to be able to pick the smaller one.
alloc_max = run_command (
'python3' , '-c' ,
'print(min(2**(@0@ * 8 - 1) - 1, 2**(@1@ * 8) - 1))' . format ( ptrdiff_max , size_max ) ,
2022-01-22 22:30:11 +03:00
check : true ,
2021-04-08 13:23:03 +03:00
)
2021-05-06 18:08:32 +03:00
# sanitizer instrumentation may enlarge stack frames
2022-09-09 17:49:14 +03:00
stack_frame_size = get_option ( 'b_sanitize' ) == 'none' ? 4096 : 32768
2021-05-06 18:08:32 +03:00
meson: disable bogus warnings from sanitizers on Fedora
When building with sanitizers on Fedora we get a wierd error
message
In file included from /usr/include/string.h:519,
from ../src/internal.h:28,
from ../src/util/virsocket.h:21,
from ../src/util/virsocketaddr.h:21,
from ../src/util/virnetdevip.h:21,
from ../src/util/virnetdevip.c:21:
In function ‘memcpy’,
inlined from ‘virNetDevGetifaddrsAddress’ at ../src/util/virnetdevip.c:702:13,
inlined from ‘virNetDevIPAddrGet’ at ../src/util/virnetdevip.c:754:16:
/usr/include/bits/string_fortified.h:29:10: error: ‘__builtin_memcpy’ offset [2, 27] from the object at ‘addr’ is out of the bounds of referenced subobject ‘ss_family’ with type ‘short unsigned int’ at offset 0 [-Werror=array-bounds]
29 | return __builtin___memcpy_chk (__dest, __src, __len,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
30 | __glibc_objsize0 (__dest));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/bits/socket.h:175,
from /usr/include/sys/socket.h:33,
from ../src/util/virsocket.h:66,
from ../src/util/virsocketaddr.h:21,
from ../src/util/virnetdevip.h:21,
from ../src/util/virnetdevip.c:21:
../src/util/virnetdevip.c: In function ‘virNetDevIPAddrGet’:
/usr/include/bits/socket.h:193:5: note: subobject ‘ss_family’ declared here
193 | __SOCKADDR_COMMON (ss_); /* Address family, etc. */
| ^~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
The code is correct, and this only happens when building at -O2.
The docs for -Warray-bounds say that a value of "2" is known to
be liable to generate false positives. Rather than downgrade the
check everywhere, we do it selectively for sanitizers.
Reviewed-by: Tim Wiederhake <twiederh@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2021-07-19 21:16:59 +03:00
# array_bounds=2 check triggers false positive on some GCC
# versions when using sanitizers. Seen on Fedora 34 with
# GCC 11.1.1
array_bounds = get_option ( 'b_sanitize' ) == 'none' ? 2 : 1
2020-07-24 17:35:03 +03:00
cc_flags + = [
2021-04-08 13:23:03 +03:00
'-fasynchronous-unwind-tables' ,
'-fexceptions' ,
'-fipa-pure-const' ,
2020-04-30 15:50:46 +03:00
'-fno-common' ,
'-Wabsolute-value' ,
'-Waddress' ,
'-Waddress-of-packed-member' ,
'-Waggressive-loop-optimizations' ,
2021-04-08 13:23:03 +03:00
'-Walloc-size-larger-than=@0@' . format ( alloc_max . stdout ( ) . strip ( ) ) ,
2021-05-27 13:45:54 +03:00
'-Walloca' ,
meson: disable bogus warnings from sanitizers on Fedora
When building with sanitizers on Fedora we get a wierd error
message
In file included from /usr/include/string.h:519,
from ../src/internal.h:28,
from ../src/util/virsocket.h:21,
from ../src/util/virsocketaddr.h:21,
from ../src/util/virnetdevip.h:21,
from ../src/util/virnetdevip.c:21:
In function ‘memcpy’,
inlined from ‘virNetDevGetifaddrsAddress’ at ../src/util/virnetdevip.c:702:13,
inlined from ‘virNetDevIPAddrGet’ at ../src/util/virnetdevip.c:754:16:
/usr/include/bits/string_fortified.h:29:10: error: ‘__builtin_memcpy’ offset [2, 27] from the object at ‘addr’ is out of the bounds of referenced subobject ‘ss_family’ with type ‘short unsigned int’ at offset 0 [-Werror=array-bounds]
29 | return __builtin___memcpy_chk (__dest, __src, __len,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
30 | __glibc_objsize0 (__dest));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/bits/socket.h:175,
from /usr/include/sys/socket.h:33,
from ../src/util/virsocket.h:66,
from ../src/util/virsocketaddr.h:21,
from ../src/util/virnetdevip.h:21,
from ../src/util/virnetdevip.c:21:
../src/util/virnetdevip.c: In function ‘virNetDevIPAddrGet’:
/usr/include/bits/socket.h:193:5: note: subobject ‘ss_family’ declared here
193 | __SOCKADDR_COMMON (ss_); /* Address family, etc. */
| ^~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
The code is correct, and this only happens when building at -O2.
The docs for -Warray-bounds say that a value of "2" is known to
be liable to generate false positives. Rather than downgrade the
check everywhere, we do it selectively for sanitizers.
Reviewed-by: Tim Wiederhake <twiederh@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2021-07-19 21:16:59 +03:00
'-Warray-bounds=@0@' . format ( array_bounds ) ,
2021-04-08 13:23:03 +03:00
'-Wattribute-alias=2' ,
2020-04-30 15:50:46 +03:00
'-Wattribute-warning' ,
'-Wattributes' ,
'-Wbool-compare' ,
'-Wbool-operation' ,
'-Wbuiltin-declaration-mismatch' ,
'-Wbuiltin-macro-redefined' ,
'-Wcannot-profile' ,
'-Wcast-align' ,
'-Wcast-align=strict' ,
2021-04-08 13:23:03 +03:00
# We do "bad" function casts all the time for event callbacks
'-Wno-cast-function-type' ,
2020-04-30 15:50:46 +03:00
'-Wchar-subscripts' ,
'-Wclobbered' ,
'-Wcomment' ,
'-Wcomments' ,
'-Wcoverage-mismatch' ,
'-Wcpp' ,
'-Wdangling-else' ,
'-Wdate-time' ,
2020-07-27 23:49:55 +03:00
'-Wdeclaration-after-statement' ,
2020-04-30 15:50:46 +03:00
'-Wdeprecated-declarations' ,
'-Wdesignated-init' ,
'-Wdiscarded-array-qualifiers' ,
'-Wdiscarded-qualifiers' ,
'-Wdiv-by-zero' ,
'-Wduplicated-cond' ,
'-Wduplicate-decl-specifier' ,
'-Wempty-body' ,
'-Wendif-labels' ,
'-Wexpansion-to-defined' ,
'-Wformat-contains-nul' ,
'-Wformat-extra-args' ,
2021-04-08 13:23:03 +03:00
# -Wformat=2 implies -Wformat-nonliteral so we need to manually exclude it
'-Wno-format-nonliteral' ,
'-Wformat-overflow=2' ,
2020-04-30 15:50:46 +03:00
'-Wformat-security' ,
2021-04-08 13:23:03 +03:00
# -Wformat enables this by default, and we should keep it,
# but need to rewrite various areas of code first
'-Wno-format-truncation' ,
2020-04-30 15:50:46 +03:00
'-Wformat-y2k' ,
'-Wformat-zero-length' ,
'-Wframe-address' ,
2021-05-06 18:08:32 +03:00
'-Wframe-larger-than=@0@' . format ( stack_frame_size ) ,
2020-04-30 15:50:46 +03:00
'-Wfree-nonheap-object' ,
'-Whsa' ,
'-Wif-not-aligned' ,
'-Wignored-attributes' ,
'-Wignored-qualifiers' ,
'-Wimplicit' ,
2021-04-08 13:23:03 +03:00
'-Wimplicit-fallthrough=5' ,
2020-04-30 15:50:46 +03:00
'-Wimplicit-function-declaration' ,
'-Wimplicit-int' ,
'-Wincompatible-pointer-types' ,
'-Winit-self' ,
'-Winline' ,
'-Wint-conversion' ,
'-Wint-in-bool-context' ,
'-Wint-to-pointer-cast' ,
'-Winvalid-memory-model' ,
'-Winvalid-pch' ,
2021-04-08 13:23:03 +03:00
'-Wjump-misses-init' ,
2020-04-30 15:50:46 +03:00
'-Wlogical-not-parentheses' ,
'-Wlogical-op' ,
'-Wmain' ,
'-Wmaybe-uninitialized' ,
'-Wmemset-elt-size' ,
'-Wmemset-transposed-args' ,
'-Wmisleading-indentation' ,
'-Wmissing-attributes' ,
'-Wmissing-braces' ,
'-Wmissing-declarations' ,
'-Wmissing-field-initializers' ,
'-Wmissing-include-dirs' ,
'-Wmissing-parameter-type' ,
'-Wmissing-profile' ,
'-Wmissing-prototypes' ,
'-Wmultichar' ,
'-Wmultistatement-macros' ,
'-Wnarrowing' ,
'-Wnested-externs' ,
'-Wnonnull' ,
'-Wnonnull-compare' ,
2021-04-08 13:23:03 +03:00
'-Wnormalized=nfc' ,
2020-04-30 15:50:46 +03:00
'-Wnull-dereference' ,
'-Wodr' ,
'-Wold-style-declaration' ,
'-Wold-style-definition' ,
'-Wopenmp-simd' ,
'-Woverflow' ,
'-Woverride-init' ,
'-Wpacked-bitfield-compat' ,
'-Wpacked-not-aligned' ,
'-Wparentheses' ,
'-Wpointer-arith' ,
'-Wpointer-compare' ,
'-Wpointer-sign' ,
'-Wpointer-to-int-cast' ,
'-Wpragmas' ,
'-Wpsabi' ,
'-Wrestrict' ,
'-Wreturn-local-addr' ,
'-Wreturn-type' ,
'-Wscalar-storage-order' ,
'-Wsequence-point' ,
'-Wshadow' ,
'-Wshift-count-negative' ,
'-Wshift-count-overflow' ,
'-Wshift-negative-value' ,
2021-04-08 13:23:03 +03:00
'-Wshift-overflow=2' ,
# So we have -W enabled, and then have to explicitly turn off...
'-Wno-sign-compare' ,
2020-04-30 15:50:46 +03:00
'-Wsizeof-array-argument' ,
'-Wsizeof-pointer-div' ,
'-Wsizeof-pointer-memaccess' ,
'-Wstrict-aliasing' ,
'-Wstrict-prototypes' ,
2021-04-08 13:23:03 +03:00
'-Wstringop-overflow=2' ,
2020-04-30 15:50:46 +03:00
'-Wstringop-truncation' ,
'-Wsuggest-attribute=cold' ,
2021-04-08 13:23:03 +03:00
'-Wno-suggest-attribute=const' ,
2020-04-30 15:50:46 +03:00
'-Wsuggest-attribute=format' ,
'-Wsuggest-attribute=noreturn' ,
2021-04-08 13:23:03 +03:00
'-Wno-suggest-attribute=pure' ,
2020-04-30 15:50:46 +03:00
'-Wsuggest-final-methods' ,
'-Wsuggest-final-types' ,
'-Wswitch' ,
'-Wswitch-bool' ,
2021-04-08 13:23:03 +03:00
'-Wswitch-enum' ,
2020-04-30 15:50:46 +03:00
'-Wswitch-unreachable' ,
'-Wsync-nand' ,
'-Wtautological-compare' ,
'-Wtrampolines' ,
'-Wtrigraphs' ,
'-Wtype-limits' ,
2021-04-08 13:23:03 +03:00
# Clang incorrectly complains about dup typedefs win gnu99 mode
# so use this Clang-specific arg to keep it quiet
'-Wno-typedef-redefinition' ,
2020-04-30 15:50:46 +03:00
'-Wuninitialized' ,
'-Wunknown-pragmas' ,
'-Wunused' ,
'-Wunused-but-set-parameter' ,
'-Wunused-but-set-variable' ,
2021-04-08 13:23:03 +03:00
'-Wunused-const-variable=2' ,
2020-04-30 15:50:46 +03:00
'-Wunused-function' ,
'-Wunused-label' ,
'-Wunused-local-typedefs' ,
'-Wunused-parameter' ,
'-Wunused-result' ,
'-Wunused-value' ,
'-Wunused-variable' ,
'-Wvarargs' ,
'-Wvariadic-macros' ,
'-Wvector-operation-performance' ,
'-Wvla' ,
'-Wvolatile-register-var' ,
'-Wwrite-strings' ,
]
meson: stop CLang doing inter-procedural analysis
The virNumaNodeIsAvailable function is stubbed out when building
without libnuma, such that it just returns a constant value. When
CLang is optimizing, it does inter-procedural analysis across
function calls. When it sees that the call to virNumaNodeIsAvailable
returns a fixed constant, it elides the conditional check for errors
in the callers such as virNumaNodesetIsAvailable.
This is a valid optimization as the C standard declares that there
must only be one implementation of each function in a binary. This
is normally the case, but ELF allows for function overrides when
linking or at runtime with LD_PRELOAD, which is technically outside
the mandated C language behaviour.
So while CLang's optimization works fine at runtime, it breaks in our
test suite which aims to mock the virNumaNodeIsAvailable function so
that it has specific semantics regardless of whether libnuma is built
or not. The return value check optimization though means our mock
override won't have the right effect. The mock will be invoked, but
its return value is not used.
Potentially the same problem could be exhibited with GCC if certain
combinations of optimizations are enabled, though thus far we've
not seen it.
To be robust on both CLang and GCC we need to make it more explicit
that we want to be able to replace functions and thus optimization
of calls must be limited. Currently we rely on 'noinline' which
does successfully prevent inlining of the function, but it cannot
stop the eliding of checks based on the constant return value.
Thus we need a bigger hammer.
There are a couple of options to disable this optimization:
* Annotate a symbol as 'weak'. This is tells the compiler
that the symbol is intended to be overridable at linktime
or runtime, and thus it will avoid doing inter-procedural
analysis for optimizations. This was tried previously but
have to be reverted as it had unintended consequences
when linking .a files into our final .so, resulting in all
the weak symbol impls being lost. See commit
407a281a8e2b6c5078ba1148535663ea64fd9314
* Annotate a symbol with 'noipa'. This tells the compiler
to avoid inter-procedural analysis for calls to just this
function. This would be ideal match for our scenario, but
unfortunately it is only implemented for GCC currently:
https://reviews.llvm.org/D101011
* The '-fsemantic-interposition' argument tells the optimizer
that any functions may be replaced with alternative
implementations that have different semantics. It thus
blocks any optimizations across function calls. This is
quite a harsh block on the optimizer, but it appears to be
the only one that is viable with CLang.
Out of those choices option (3) is the only viable option for
CLang. We don't want todo it for GCC though as it is such a
big hammer. Probably we should apply (2) for GCC, should we
experiance a problem in future.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2023-03-16 15:50:56 +03:00
if cc . get_id ( ) == 'clang'
# Stop CLang from doing inter-procedural analysis of calls
# between functions in the same compilation unit. Such an
# optimization has been know to break the test suite by
# making assumptions that a return value is a constant.
# This makes it impossible to mock certain functions with
# replacement definitions via LD_PRELOAD that have different
# semantics.
#
# This is a bit of a big hammer, but alternatives don't work:
#
# - 'weak' attribute - weak symbols get dropped from
# when the .a libs are combined into the .so
# see commit 407a281a8e2b6c5078ba1148535663ea64fd9314
#
# - 'noipa' attribute - only available with GCC currently
# https://reviews.llvm.org/D101011
cc_flags + = [ '-fsemantic-interposition' ]
endif
2021-04-07 20:20:49 +03:00
supported_cc_flags = [ ]
if get_option ( 'warning_level' ) == '2'
supported_cc_flags = cc . get_supported_arguments ( cc_flags )
# on aarch64 error: -fstack-protector not supported for this target
if host_machine . cpu_family ( ) != 'aarch64'
if host_machine . system ( ) in [ 'linux' , 'freebsd' , 'windows' ]
# we prefer -fstack-protector-strong but fallback to -fstack-protector-all
fstack_cflags = cc . first_supported_argument ( [
'-fstack-protector-strong' ,
'-fstack-protector-all' ,
] )
supported_cc_flags + = fstack_cflags
# When building with mingw using -fstack-protector requires libssp library
# which is included by using -fstack-protector with linker.
if fstack_cflags . length ( ) == 1 and host_machine . system ( ) == 'windows'
add_project_link_arguments ( fstack_cflags , language : 'c' )
endif
2020-07-24 17:35:03 +03:00
endif
endif
2021-04-07 20:20:49 +03:00
if supported_cc_flags . contains ( '-Wlogical-op' )
# Broken in 6.0 and later
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602
2021-05-27 19:29:02 +03:00
w_logical_op_args = [ '-O2' , '-Wlogical-op' , '-Werror' ]
2021-04-07 20:20:49 +03:00
w_logical_op_code = '' '
#define TEST1 1
#define TEST2 TEST1
int main ( void ) {
int test = 0 ;
return test == TEST1 | | test == TEST2 ;
}
'' '
if not cc . compiles ( w_logical_op_code , args : w_logical_op_args )
conf . set ( 'BROKEN_GCC_WLOGICALOP_EQUAL_EXPR' , 1 )
endif
endif
# Check whether clang gives bogus warning for -Wdouble-promotion.
2021-05-27 19:29:02 +03:00
w_double_promotion_args = [ '-O2' , '-Wdouble-promotion' , '-Werror' ]
2021-04-07 20:20:49 +03:00
w_double_promotion_code = '' '
#include <math.h>
2020-07-24 17:35:03 +03:00
int main ( void ) {
2021-04-07 20:20:49 +03:00
float f = 0 . 0 ;
return isnan ( f ) ;
2020-07-24 17:35:03 +03:00
}
'' '
2021-04-07 20:20:49 +03:00
if cc . compiles ( w_double_promotion_code , args : w_double_promotion_args , name : '-Wdouble-promotion' )
2021-05-27 19:29:02 +03:00
supported_cc_flags + = [ '-Wdouble-promotion' ]
2020-07-24 17:35:03 +03:00
endif
2021-04-07 20:20:49 +03:00
# Clang complains about unused static inline functions which are common
# with G_DEFINE_AUTOPTR_CLEANUP_FUNC.
2021-05-27 19:29:02 +03:00
w_unused_function_args = [ '-Wunused-function' , '-Werror' ]
2021-04-07 20:20:49 +03:00
w_unused_function_code = '' '
static inline void foo ( void ) { }
2020-07-24 17:35:03 +03:00
2021-04-07 20:20:49 +03:00
int main ( void ) { return 0 ; }
'' '
# -Wunused-function is implied by -Wall, we must turn it off explicitly.
if not cc . compiles ( w_unused_function_code , args : w_unused_function_args )
2021-05-27 19:29:02 +03:00
supported_cc_flags + = [ '-Wno-unused-function' ]
2021-04-07 20:20:49 +03:00
endif
2020-07-24 17:35:03 +03:00
2021-04-07 20:20:49 +03:00
endif
2020-07-24 17:35:03 +03:00
add_project_arguments ( supported_cc_flags , language : 'c' )
if cc . has_argument ( '-Wsuggest-attribute=format' )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_SUGGEST_ATTRIBUTE_FORMAT' , 1 )
2020-07-24 17:35:03 +03:00
endif
# used in tests
2021-04-07 20:19:32 +03:00
cc_flags_relaxed_frame_limit = [ ]
if cc . has_argument ( '-Wframe-larger-than=262144' )
cc_flags_relaxed_frame_limit + = [
2020-07-24 17:35:03 +03:00
'-Wframe-larger-than=262144' ,
2021-04-07 20:19:32 +03:00
]
endif
2020-04-30 15:50:46 +03:00
2020-06-24 14:22:55 +03:00
# various linker checks
libvirt_relro = cc . get_supported_link_arguments ( [
'-Wl,-z,relro' ,
'-Wl,-z,now' ,
] )
libvirt_nodelete = cc . get_supported_link_arguments ( [
'-Wl,-z,nodelete' ,
] )
2021-05-06 18:08:33 +03:00
libvirt_no_undefined = [ ]
if get_option ( 'b_sanitize' ) == 'none'
libvirt_no_undefined + = cc . get_supported_link_arguments ( [
'-Wl,-z,defs' ,
] )
endif
2020-06-24 14:22:55 +03:00
libvirt_no_indirect = cc . get_supported_link_arguments ( [
'-Wl,--no-copy-dt-needed-entries' ,
] )
if host_machine . system ( ) == 'windows'
version_script_flags = '-Wl,'
2022-05-05 16:29:00 +03:00
elif host_machine . system ( ) == 'darwin'
# macOS libraries don't support symbol versioning
version_script_flags = ''
2020-06-24 14:22:55 +03:00
else
2023-03-20 15:38:27 +03:00
version_script_flags = '-Wl,--version-script='
2020-06-24 14:22:55 +03:00
endif
libvirt_flat_namespace = [ ]
if host_machine . system ( ) == 'darwin'
libvirt_flat_namespace = '-Wl,-flat_namespace'
endif
libvirt_export_dynamic = cc . first_supported_link_argument ( [
'-Wl,-export-dynamic' ,
'-Wl,-export_dynamic' ,
] )
2020-07-10 10:48:30 +03:00
# check availability of various common functions (non-fatal if missing)
functions = [
'elf_aux_info' ,
2022-12-12 13:20:36 +03:00
'explicit_bzero' ,
2020-07-10 10:48:30 +03:00
'fallocate' ,
'getauxval' ,
'getegid' ,
'geteuid' ,
'getgid' ,
'getifaddrs' ,
'getmntent_r' ,
'getpwuid_r' ,
'getrlimit' ,
'getuid' ,
'getutxid' ,
'if_indextoname' ,
'mmap' ,
'newlocale' ,
'pipe2' ,
'posix_fallocate' ,
'posix_memalign' ,
'prlimit' ,
'sched_setscheduler' ,
'setgroups' ,
'setrlimit' ,
'symlink' ,
'sysctlbyname' ,
]
tests: fix stat mocking with Fedora rawhide
GLibC has a really complicated way of dealing with the 'stat' function
historically, which means our mocks in turn have to look at four
different possible functions to replace, stat, stat64, __xstat,
__xstat64.
In Fedora 33 and earlier:
- libvirt.so links to __xstat64
- libc.so library exports stat, stat64, __xstat, __xstat64
- sys/stat.h header exposes stat and __xstat
In Fedora 34 rawhide:
- libvirt.so links to stat64
- libc.so library exports stat, stat64, __xstat, __xstat64
- sys/stat.h header exposes stat
Historically we only looked at the exported symbols from libc.so to
decide which to mock.
In F34 though we must not consider __xstat / __xstat64 though because
they only existance for binary compatibility. Newly built binaries
won't reference them.
Thus we must introduce a header file check into our logic for deciding
which symbol to mock. We must ignore the __xstat / __xstat64 symbols
if they don't appear in the sys/stat.h header, even if they appear
in libc.so
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2020-10-29 20:25:07 +03:00
stat_functions = [
'__lxstat' ,
'__lxstat64' ,
'__xstat' ,
'__xstat64' ,
'lstat' ,
'lstat64' ,
'stat' ,
'stat64' ,
]
functions + = stat_functions
2020-07-10 10:48:30 +03:00
foreach function : functions
if cc . has_function ( function )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_@0@' . format ( function . to_upper ( ) ) , 1 )
2020-07-10 10:48:30 +03:00
endif
endforeach
tests: fix stat mocking with Fedora rawhide
GLibC has a really complicated way of dealing with the 'stat' function
historically, which means our mocks in turn have to look at four
different possible functions to replace, stat, stat64, __xstat,
__xstat64.
In Fedora 33 and earlier:
- libvirt.so links to __xstat64
- libc.so library exports stat, stat64, __xstat, __xstat64
- sys/stat.h header exposes stat and __xstat
In Fedora 34 rawhide:
- libvirt.so links to stat64
- libc.so library exports stat, stat64, __xstat, __xstat64
- sys/stat.h header exposes stat
Historically we only looked at the exported symbols from libc.so to
decide which to mock.
In F34 though we must not consider __xstat / __xstat64 though because
they only existance for binary compatibility. Newly built binaries
won't reference them.
Thus we must introduce a header file check into our logic for deciding
which symbol to mock. We must ignore the __xstat / __xstat64 symbols
if they don't appear in the sys/stat.h header, even if they appear
in libc.so
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2020-10-29 20:25:07 +03:00
foreach function : stat_functions
if cc . has_header_symbol ( 'sys/stat.h' , function )
conf . set ( 'WITH_@0@_DECL' . format ( function . to_upper ( ) ) , 1 )
endif
endforeach
2020-07-21 16:23:48 +03:00
# various header checks
headers = [
'asm/hwcap.h' ,
'ifaddrs.h' ,
'libtasn1.h' ,
'linux/kvm.h' ,
'mntent.h' ,
'net/ethernet.h' ,
'net/if.h' ,
'pty.h' ,
'pwd.h' ,
2021-11-21 14:56:06 +03:00
'sched.h' ,
2021-02-05 17:03:32 +03:00
'sys/auxv.h' ,
2020-07-21 16:23:48 +03:00
'sys/ioctl.h' ,
'sys/mount.h' ,
'sys/syscall.h' ,
'sys/ucred.h' ,
'syslog.h' ,
'util.h' ,
'xlocale.h' ,
]
2020-09-25 12:19:03 +03:00
if host_machine . system ( ) == 'freebsd'
headers + = 'libutil.h'
endif
2020-07-21 16:23:48 +03:00
foreach name : headers
if cc . has_header ( name )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_@0@' . format ( name . underscorify ( ) . to_upper ( ) ) , 1 )
2020-07-21 16:23:48 +03:00
endif
endforeach
2022-12-08 13:07:19 +03:00
# check for kernel header required by src/util/virnetdevbridge.c
2020-07-21 16:23:48 +03:00
if host_machine . system ( ) == 'linux'
2022-12-08 13:07:19 +03:00
if not cc . has_header ( 'linux/sockios.h' )
error ( 'You must install kernel-headers in order to compile libvirt with QEMU or LXC support' )
endif
2020-07-21 16:23:48 +03:00
endif
2020-06-30 15:06:50 +03:00
# check various symbols
symbols = [
# Check whether endian provides handy macros.
[ 'endian.h' , 'htole64' ] ,
[ 'unistd.h' , 'SEEK_HOLE' ] ,
# Check for BSD approach for setting MAC addr
2020-08-08 12:16:16 +03:00
[ 'net/if_dl.h' , 'link_addr' , '#include <sys/types.h>\n#include <sys/socket.h>' ] ,
2021-11-21 14:56:06 +03:00
[ 'sched.h' , 'cpu_set_t' ] ,
2020-06-30 15:06:50 +03:00
]
foreach symbol : symbols
2020-08-08 12:16:16 +03:00
if cc . has_header_symbol ( symbol [ 0 ] , symbol [ 1 ] , args : '-D_GNU_SOURCE' , prefix : symbol . get ( 2 , '' ) )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_DECL_@0@' . format ( symbol [ 1 ] . to_upper ( ) ) , 1 )
2020-06-30 15:06:50 +03:00
endif
endforeach
# Check for BSD approach for bridge management
2020-08-08 12:16:16 +03:00
brd_required_headers = '' ' #include <stdint.h>
#include <net/if.h>
#include <net/ethernet.h>'''
if ( cc . has_header_symbol ( 'net/if_bridgevar.h' , 'BRDGSFD' , prefix : brd_required_headers ) and
cc . has_header_symbol ( 'net/if_bridgevar.h' , 'BRDGADD' , prefix : brd_required_headers ) and
cc . has_header_symbol ( 'net/if_bridgevar.h' , 'BRDGDEL' , prefix : brd_required_headers ) )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_BSD_BRIDGE_MGMT' , 1 )
2020-06-30 15:06:50 +03:00
endif
# Check for BSD CPU affinity availability
2021-11-23 14:19:10 +03:00
if cc . has_header_symbol ( 'sys/cpuset.h' , 'cpuset_getaffinity' , prefix : '#include <sys/param.h>' )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_BSD_CPU_AFFINITY' , 1 )
2020-06-30 15:06:50 +03:00
endif
# whether Mach clock routines are available
if ( cc . has_header_symbol ( 'mach/clock.h' , 'clock_serv_t' ) and
cc . has_header_symbol ( 'mach/clock.h' , 'host_get_clock_service' ) and
cc . has_header_symbol ( 'mach/clock.h' , 'clock_get_time' ) )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_MACH_CLOCK_ROUTINES' , 1 )
2020-06-30 15:06:50 +03:00
endif
2020-06-30 15:07:07 +03:00
# check various types
types = [
[ 'struct ifreq' , '#include <sys/socket.h>\n#include <net/if.h>' ] ,
[ 'struct sockpeercred' , '#include <sys/socket.h' ] ,
]
foreach type : types
if cc . has_type ( type [ 0 ] , prefix : type [ 1 ] )
name = type [ 0 ] . underscorify ( ) . to_upper ( )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_@0@' . format ( name ) , 1 )
2020-06-30 15:07:07 +03:00
endif
endforeach
if host_machine . system ( ) == 'windows'
uid_types = [
'uid_t' ,
'gid_t' ,
]
foreach type : uid_types
if not cc . has_type ( type , prefix : '#include <sys/types.h>' )
conf . set ( type , 'int' )
endif
endforeach
endif
2020-06-30 15:17:11 +03:00
# check various members
members = [
# Check for Linux vs. BSD ifreq members
[ 'struct ifreq' , 'ifr_newname' , '#include <sys/socket.h>\n#include <net/if.h>' ] ,
[ 'struct ifreq' , 'ifr_ifindex' , '#include <sys/socket.h>\n#include <net/if.h>' ] ,
[ 'struct ifreq' , 'ifr_index' , '#include <sys/socket.h>\n#include <net/if.h>' ] ,
[ 'struct ifreq' , 'ifr_hwaddr' , '#include <sys/socket.h>\n#include <net/if.h>' ] ,
]
foreach member : members
if cc . has_member ( member [ 0 ] , member [ 1 ] , prefix : member [ 2 ] )
type = member [ 0 ] . underscorify ( ) . to_upper ( )
member = member [ 1 ] . underscorify ( ) . to_upper ( )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_@0@_@1@' . format ( type , member ) , 1 )
2020-06-30 15:17:11 +03:00
endif
endforeach
2020-06-30 15:07:19 +03:00
# check various types sizeof
conf . set ( 'SIZEOF_LONG' , cc . sizeof ( 'long' ) )
2020-06-30 20:53:09 +03:00
# Where we look for daemons and admin binaries during configure
2023-04-17 14:53:56 +03:00
libvirt_sbin_path = [ ]
if host_machine . system ( ) != 'windows'
libvirt_sbin_path + = [
'/sbin' ,
'/usr/sbin' ,
'/usr/local/sbin' ,
]
endif
2020-06-30 20:53:09 +03:00
# required programs check
required_programs = [
'perl' ,
'python3' ,
'xmllint' ,
'xsltproc' ,
]
required_programs_groups = [
2021-05-27 19:29:02 +03:00
{ 'name' : 'rpcgen' , 'prog' : [ 'rpcgen' , 'portable-rpcgen' ] } ,
2020-06-30 20:53:09 +03:00
]
if host_machine . system ( ) == 'freebsd'
required_programs + = 'ifconfig'
endif
foreach name : required_programs
2021-05-27 20:04:10 +03:00
prog = find_program ( name , dirs : libvirt_sbin_path )
2020-06-30 20:53:09 +03:00
varname = name . underscorify ( )
2022-10-07 10:43:33 +03:00
conf . set_quoted ( varname . to_upper ( ) , prog . full_path ( ) )
2020-06-30 20:53:09 +03:00
set_variable ( '@0@_prog' . format ( varname ) , prog )
endforeach
foreach item : required_programs_groups
2021-05-27 20:04:10 +03:00
prog = find_program ( item . get ( 'prog' ) , dirs : libvirt_sbin_path )
2020-06-30 20:53:09 +03:00
varname = item . get ( 'name' ) . underscorify ( )
2022-10-07 10:43:33 +03:00
conf . set_quoted ( varname . to_upper ( ) , prog . full_path ( ) )
2020-06-30 20:53:09 +03:00
set_variable ( '@0@_prog' . format ( varname ) , prog )
endforeach
# optional programs
optional_programs = [
'augparse' ,
'dmidecode' ,
'ebtables' ,
'flake8' ,
'ip' ,
'ip6tables' ,
'iptables' ,
2020-06-24 13:17:39 +03:00
'iscsiadm' ,
2020-06-30 20:53:09 +03:00
'mdevctl' ,
'mm-ctl' ,
'modprobe' ,
'ovs-vsctl' ,
2022-12-15 22:19:16 +03:00
'passt' ,
2020-07-28 14:50:04 +03:00
'pdwtags' ,
2020-06-30 20:53:09 +03:00
'rmmod' ,
'scrub' ,
'tc' ,
'udevadm' ,
]
foreach name : optional_programs
prog = find_program ( name , required : false , dirs : libvirt_sbin_path )
varname = name . underscorify ( )
if prog . found ( )
2022-10-07 10:43:33 +03:00
prog_path = prog . full_path ( )
2020-06-30 20:53:09 +03:00
else
prog_path = name
endif
conf . set_quoted ( varname . to_upper ( ) , prog_path )
set_variable ( '@0@_prog' . format ( varname ) , prog )
endforeach
2021-07-07 14:00:12 +03:00
# early checks where lot of other packages depend on the result
if not get_option ( 'driver_remote' ) . disabled ( )
2021-12-08 11:32:55 +03:00
# On MinGW portablexdr provides XDR functions, on linux they are
# provided by libtirpc and on FreeBSD/macOS there is no need to
# use extra library as it's provided by libc directly.
if host_machine . system ( ) == 'windows'
xdr_dep = cc . find_library ( 'portablexdr' , required : get_option ( 'driver_remote' ) )
elif host_machine . system ( ) == 'linux'
xdr_dep = dependency ( 'libtirpc' , required : get_option ( 'driver_remote' ) )
elif host_machine . system ( ) in [ 'freebsd' , 'darwin' ]
xdr_dep = cc . find_library ( 'c' , required : get_option ( 'driver_remote' ) )
else
xdr_dep = dependency ( '' , required : false )
2021-07-07 14:00:12 +03:00
endif
2021-12-08 11:32:55 +03:00
if xdr_dep . found ( )
2021-07-07 14:00:12 +03:00
conf . set ( 'WITH_REMOTE' , 1 )
2021-12-08 11:32:55 +03:00
elif get_option ( 'driver_remote' ) . enabled ( )
error ( 'XDR is required for remote driver' )
2021-07-07 14:00:12 +03:00
endif
2021-12-08 11:32:55 +03:00
else
xdr_dep = dependency ( '' , required : false )
2021-07-07 14:00:12 +03:00
endif
2020-03-02 17:14:14 +03:00
# generic build dependencies
2021-05-26 19:46:20 +03:00
# FIXME rewrite to use dependency()
2021-05-26 19:42:40 +03:00
acl_dep = cc . find_library ( 'acl' , required : false )
if acl_dep . found ( )
conf . set ( 'WITH_LIBACL' , 1 )
2020-03-02 17:14:14 +03:00
endif
2020-07-29 15:19:59 +03:00
apparmor_dep = dependency ( 'libapparmor' , required : get_option ( 'apparmor' ) )
if apparmor_dep . found ( )
conf . set ( 'WITH_APPARMOR' , 1 )
2020-08-19 02:39:19 +03:00
conf . set_quoted ( 'APPARMOR_DIR' , sysconfdir / 'apparmor.d' )
2020-07-29 15:19:59 +03:00
conf . set_quoted ( 'APPARMOR_PROFILES_PATH' , '/sys/kernel/security/apparmor/profiles' )
endif
2021-05-27 16:20:24 +03:00
if not get_option ( 'apparmor_profiles' ) . disabled ( )
apparmor_profiles_enable = true
2021-05-27 16:17:19 +03:00
if not conf . has ( 'WITH_APPARMOR' )
2021-05-27 16:20:24 +03:00
apparmor_profiles_enable = false
if get_option ( 'apparmor_profiles' ) . enabled ( )
error ( 'Cannot enable apparmor_profiles without apparmor' )
endif
endif
if apparmor_profiles_enable
conf . set ( 'WITH_APPARMOR_PROFILES' , 1 )
2021-05-27 16:17:19 +03:00
endif
endif
2021-05-26 19:46:20 +03:00
# FIXME rewrite to use dependency() once we can use 2.4.48
2020-07-29 15:20:15 +03:00
attr_dep = cc . find_library ( 'attr' , required : get_option ( 'attr' ) )
if attr_dep . found ( )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_LIBATTR' , 1 )
2020-07-29 15:20:15 +03:00
endif
2021-05-26 19:46:20 +03:00
audit_dep = dependency ( 'audit' , required : get_option ( 'audit' ) )
2020-07-29 15:20:29 +03:00
if audit_dep . found ( )
conf . set ( 'WITH_AUDIT' , 1 )
endif
2020-06-24 14:24:53 +03:00
bash_completion_version = '2.0'
bash_completion_dep = dependency ( 'bash-completion' , version : '>=' + bash_completion_version , required : get_option ( 'bash_completion' ) )
2020-06-24 14:25:04 +03:00
blkid_version = '2.17'
blkid_dep = dependency ( 'blkid' , version : '>=' + blkid_version , required : get_option ( 'blkid' ) )
if blkid_dep . found ( )
conf . set ( 'WITH_BLKID' , 1 )
endif
2021-05-26 19:46:20 +03:00
capng_dep = dependency ( 'libcap-ng' , required : get_option ( 'capng' ) )
2020-06-24 14:25:16 +03:00
if capng_dep . found ( )
conf . set ( 'WITH_CAPNG' , 1 )
endif
2021-02-17 08:58:59 +03:00
curl_version = '7.19.1'
2020-06-24 14:25:26 +03:00
curl_dep = dependency ( 'libcurl' , version : '>=' + curl_version , required : get_option ( 'curl' ) )
if curl_dep . found ( )
conf . set ( 'WITH_CURL' , 1 )
endif
2020-04-29 11:32:28 +03:00
devmapper_version = '1.0.0'
devmapper_dep = dependency ( 'devmapper' , version : '>=' + devmapper_version , required : false )
if devmapper_dep . found ( )
conf . set ( 'WITH_DEVMAPPER' , 1 )
endif
2020-04-29 11:34:31 +03:00
dlopen_use = host_machine . system ( ) != 'windows'
dlopen_dep = cc . find_library ( 'dl' , required : dlopen_use )
if dlopen_dep . found ( )
if not cc . has_header ( 'dlfcn.h' )
error ( 'Unable to find dlfcn.h' )
endif
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_DLFCN_H' , 1 )
2020-04-29 11:34:31 +03:00
endif
2022-02-22 17:21:49 +03:00
fuse_version = '3.1.0'
fuse_dep = dependency ( 'fuse3' , version : '>=' + fuse_version , required : false )
2020-07-01 04:10:10 +03:00
if fuse_dep . found ( )
2022-02-22 17:21:49 +03:00
conf . set ( 'WITH_FUSE' , 3 )
else
fuse_version = '2.8.6'
fuse_dep = dependency ( 'fuse' , version : '>=' + fuse_version , required : get_option ( 'fuse' ) )
if fuse_dep . found ( )
conf . set ( 'WITH_FUSE' , 1 )
endif
2020-07-01 04:10:10 +03:00
endif
2021-03-02 01:57:05 +03:00
glib_version = '2.56.0'
2020-04-29 13:06:37 +03:00
glib_dep = dependency ( 'glib-2.0' , version : '>=' + glib_version )
gobject_dep = dependency ( 'gobject-2.0' , version : '>=' + glib_version )
2020-09-08 14:55:24 +03:00
if host_machine . system ( ) == 'windows'
gio_dep = dependency ( 'gio-2.0' , version : '>=' + glib_version )
else
gio_dep = dependency ( 'gio-unix-2.0' , version : '>=' + glib_version )
endif
2020-04-29 13:06:37 +03:00
glib_dep = declare_dependency (
dependencies : [ glib_dep , gobject_dep , gio_dep ] ,
)
2021-04-30 08:10:41 +03:00
glib_version_arr = glib_version . split ( '.' )
glib_version_str = 'GLIB_VERSION_@0@_@1@' . format ( glib_version_arr [ 0 ] , glib_version_arr [ 1 ] )
# Ask for warnings for anything that was marked deprecated in
# the defined version, or before. It is a candidate for rewrite.
conf . set ( 'GLIB_VERSION_MIN_REQUIRED' , glib_version_str )
# Ask for warnings if code tries to use function that did not
# exist in the defined version. These risk breaking builds
conf . set ( 'GLIB_VERSION_MAX_ALLOWED' , glib_version_str )
2020-04-29 13:06:37 +03:00
2020-06-24 14:26:27 +03:00
glusterfs_version = '3.4.1'
glusterfs_dep = dependency ( 'glusterfs-api' , version : '>=' + glusterfs_version , required : get_option ( 'glusterfs' ) )
2022-06-29 17:01:59 +03:00
gnutls_version = '3.6.0'
2020-04-29 13:07:33 +03:00
gnutls_dep = dependency ( 'gnutls' , version : '>=' + gnutls_version )
2020-06-30 20:53:36 +03:00
# Check for BSD kvm (kernel memory interface)
if host_machine . system ( ) == 'freebsd'
2020-10-08 14:51:00 +03:00
libkvm_dep = cc . find_library ( 'kvm' )
2020-09-04 14:52:13 +03:00
else
2020-10-08 14:51:00 +03:00
libkvm_dep = dependency ( '' , required : false )
2020-06-30 20:53:36 +03:00
endif
2020-06-24 14:26:48 +03:00
libiscsi_version = '1.18.0'
libiscsi_dep = dependency ( 'libiscsi' , version : '>=' + libiscsi_version , required : get_option ( 'libiscsi' ) )
2020-04-29 13:08:33 +03:00
libnl_version = '3.0'
2020-10-08 14:01:29 +03:00
if not get_option ( 'libnl' ) . disabled ( ) and host_machine . system ( ) == 'linux'
libnl_dep = dependency ( 'libnl-3.0' , version : '>=' + libnl_version , required : get_option ( 'libnl' ) )
libnl_route_dep = dependency ( 'libnl-route-3.0' , version : '>=' + libnl_version , required : get_option ( 'libnl' ) )
2020-04-29 13:08:33 +03:00
if libnl_dep . found ( ) and libnl_route_dep . found ( )
libnl_dep = declare_dependency (
dependencies : [ libnl_dep , libnl_route_dep ] ,
)
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_LIBNL' , 1 )
2020-04-29 13:08:33 +03:00
endif
2020-10-08 14:01:29 +03:00
elif get_option ( 'libnl' ) . enabled ( )
error ( 'libnl can be enabled only on linux' )
2020-04-29 13:08:33 +03:00
else
libnl_dep = dependency ( '' , required : false )
endif
2020-04-29 13:08:51 +03:00
libparted_version = '1.8.0'
2022-03-24 13:53:04 +03:00
libparted_dep = dependency ( 'libparted' , version : '>=' + libparted_version , required : get_option ( 'storage_disk' ) )
2020-04-29 13:08:51 +03:00
2020-06-24 14:27:03 +03:00
libpcap_version = '1.5.0'
2020-10-08 14:09:45 +03:00
if not get_option ( 'libpcap' ) . disabled ( )
2021-05-26 19:20:04 +03:00
libpcap_dep = dependency ( 'pcap' , version : '>=' + libpcap_version , required : get_option ( 'libpcap' ) )
2021-05-26 18:47:58 +03:00
if libpcap_dep . found ( )
conf . set ( 'WITH_LIBPCAP' , 1 )
endif
2020-10-08 14:09:45 +03:00
else
libpcap_dep = dependency ( '' , required : false )
2020-06-24 14:27:03 +03:00
endif
2022-09-07 16:08:20 +03:00
libssh_version = '0.8.1'
2021-07-07 14:00:12 +03:00
if conf . has ( 'WITH_REMOTE' )
2020-06-24 14:27:12 +03:00
libssh_dep = dependency ( 'libssh' , version : '>=' + libssh_version , required : get_option ( 'libssh' ) )
if libssh_dep . found ( )
conf . set ( 'WITH_LIBSSH' , 1 )
endif
else
libssh_dep = dependency ( '' , required : false )
endif
2020-04-29 12:07:42 +03:00
libssh2_version = '1.3'
2021-07-07 14:00:12 +03:00
if conf . has ( 'WITH_REMOTE' )
2020-04-29 12:07:42 +03:00
libssh2_dep = dependency ( 'libssh2' , version : '>=' + libssh2_version , required : get_option ( 'libssh2' ) )
if libssh2_dep . found ( )
conf . set ( 'WITH_SSH2' , 1 )
endif
else
libssh2_dep = dependency ( '' , required : false )
endif
2020-06-24 14:27:22 +03:00
libxml_version = '2.9.1'
libxml_dep = dependency ( 'libxml-2.0' , version : '>=' + libxml_version )
2021-05-27 20:34:50 +03:00
libm_dep = cc . find_library ( 'm' )
2020-08-26 21:22:07 +03:00
2020-06-24 14:27:31 +03:00
netcf_version = '0.1.8'
2021-01-22 00:01:06 +03:00
if not get_option ( 'netcf' ) . disabled ( )
2021-05-27 17:09:54 +03:00
netcf_dep = dependency ( 'netcf' , version : '>=' + netcf_version , required : get_option ( 'netcf' ) )
2021-01-22 00:01:06 +03:00
if netcf_dep . found ( )
conf . set ( 'WITH_NETCF' , 1 )
endif
2021-05-27 17:09:54 +03:00
else
netcf_dep = dependency ( '' , required : false )
2020-06-24 14:27:31 +03:00
endif
2020-06-24 14:27:40 +03:00
have_gnu_gettext_tools = false
if not get_option ( 'nls' ) . disabled ( )
have_gettext = cc . has_function ( 'gettext' )
if not have_gettext
2020-09-04 14:52:13 +03:00
intl_dep = cc . find_library ( 'intl' , required : false )
have_gettext = intl_dep . found ( )
else
intl_dep = dependency ( '' , required : false )
2020-06-24 14:27:40 +03:00
endif
if not have_gettext and get_option ( 'nls' ) . enabled ( )
error ( 'gettext() is required to build libvirt' )
endif
if cc . has_header ( 'libintl.h' )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_LIBINTL_H' , 1 )
2020-06-24 14:27:40 +03:00
elif get_option ( 'nls' ) . enabled ( )
error ( 'libintl.h is required to build libvirt' )
endif
gettext_progs = [
'xgettext' ,
'msgfmt' ,
'msgmerge' ,
]
foreach name : gettext_progs
prog = find_program ( name , required : false )
set_variable ( '@0@_prog' . format ( name ) , prog )
endforeach
if xgettext_prog . found ( ) and msgfmt_prog . found ( ) and msgmerge_prog . found ( )
2022-01-22 22:30:11 +03:00
rc = run_command ( msgfmt_prog , '--version' , check : false )
2020-06-24 14:27:40 +03:00
if rc . returncode ( ) == 0 and rc . stdout ( ) . contains ( 'GNU gettext' )
have_gnu_gettext_tools = true
endif
endif
2020-09-04 14:52:13 +03:00
else
intl_dep = dependency ( '' , required : false )
2020-06-24 14:27:40 +03:00
endif
2021-05-26 19:46:20 +03:00
# FIXME rewrite to use dependency() once we can use 2.0.14
2020-04-29 16:43:09 +03:00
numactl_dep = cc . find_library ( 'numa' , required : get_option ( 'numactl' ) )
if numactl_dep . found ( )
conf . set ( 'WITH_NUMACTL' , 1 )
2022-12-09 16:41:24 +03:00
if cc . has_function ( 'numa_set_preferred_many' , dependencies : numactl_dep )
conf . set ( 'WITH_NUMACTL_SET_PREFERRED_MANY' , 1 )
endif
2020-04-29 16:43:09 +03:00
endif
2020-10-09 10:46:08 +03:00
openwsman_version = '2.6.3'
2020-04-29 11:18:37 +03:00
openwsman_dep = dependency ( 'openwsman' , version : '>=' + openwsman_version , required : get_option ( 'openwsman' ) )
2020-04-30 12:35:36 +03:00
parallels_sdk_version = '7.0.22'
parallels_sdk_dep = dependency ( 'parallels-sdk' , version : '>=' + parallels_sdk_version , required : false )
2020-04-30 12:35:51 +03:00
pciaccess_version = '0.10.0'
pciaccess_dep = dependency ( 'pciaccess' , version : '>=' + pciaccess_version , required : get_option ( 'pciaccess' ) )
2022-03-24 13:53:03 +03:00
rbd_dep = cc . find_library ( 'rbd' , required : get_option ( 'storage_rbd' ) )
rados_dep = cc . find_library ( 'rados' , required : get_option ( 'storage_rbd' ) )
2020-04-29 12:37:40 +03:00
if rbd_dep . found ( ) and not cc . has_function ( 'rbd_get_features' , dependencies : rbd_dep )
rbd_dep = dependency ( '' , required : false )
endif
if rbd_dep . found ( ) and rados_dep . found ( )
if cc . has_function ( 'rbd_list2' , dependencies : rbd_dep )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_RBD_LIST2' , 1 )
2020-04-29 12:37:40 +03:00
endif
rbd_dep = declare_dependency ( dependencies : [ rbd_dep , rados_dep ] )
else
rbd_dep = dependency ( '' , required : false )
endif
2020-07-29 15:20:43 +03:00
# readline 7.0 is the first version which includes pkg-config support
readline_version = '7.0'
2020-10-08 14:24:55 +03:00
if not get_option ( 'readline' ) . disabled ( )
readline_dep = dependency ( 'readline' , version : '>=' + readline_version , required : false )
if not readline_dep . found ( )
readline_dep = cc . find_library ( 'readline' , required : get_option ( 'readline' ) )
if readline_dep . found ( )
# This variable is present in all reasonable (5.0+) readline versions;
# however, the macOS base system contains a library called libedit which
# takes over the readline name despite lacking many of its features. We
# want to make sure we only enable readline support when linking against
# the actual readline library, and the availability of this specific
# variable is as good a witness for that fact as any.
correct_rl = cc . has_header_symbol ( 'readline/readline.h' , 'rl_completion_quote_character' , prefix : '#include <stdio.h>' )
if not correct_rl
if get_option ( 'readline' ) . enabled ( )
error ( 'readline is missing rl_completion_quote_character' )
else
readline_dep = dependency ( '' , required : false )
endif
2020-08-05 13:39:24 +03:00
endif
2020-07-29 15:20:43 +03:00
endif
endif
2021-05-26 18:47:58 +03:00
if readline_dep . found ( )
# We need this to avoid compilation issues with modern compilers.
# See 9ea3424a178 for a more detailed explanation
readline_dep = declare_dependency (
compile_args : [ '-D_FUNCTION_DEF' ] ,
dependencies : [ readline_dep ] ,
)
conf . set ( 'WITH_READLINE' , 1 )
endif
2020-10-08 14:24:55 +03:00
else
readline_dep = dependency ( '' , required : false )
2020-07-29 15:20:43 +03:00
endif
2020-07-29 15:21:00 +03:00
if not get_option ( 'sanlock' ) . disabled ( )
2021-05-27 17:35:38 +03:00
sanlock_dep = dependency ( 'libsanlock_client' , required : get_option ( 'sanlock' ) )
2020-07-29 15:21:00 +03:00
if sanlock_dep . found ( )
conf . set ( 'WITH_SANLOCK' , 1 )
# check for sanlock_strerror introduced in sanlock-3.5.0
if cc . has_function ( 'sanlock_strerror' , dependencies : sanlock_dep )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_SANLOCK_STRERROR' , 1 )
2020-07-29 15:21:00 +03:00
endif
endif
endif
2020-07-29 15:21:14 +03:00
sasl_version = '2.1.26'
2021-07-07 14:00:12 +03:00
if conf . has ( 'WITH_REMOTE' )
2020-07-29 15:21:14 +03:00
sasl_dep = dependency ( 'libsasl2' , version : '>=' + sasl_version , required : get_option ( 'sasl' ) )
if sasl_dep . found ( )
conf . set ( 'WITH_SASL' , 1 )
endif
else
sasl_dep = dependency ( '' , required : false )
endif
2021-05-26 19:46:20 +03:00
selinux_dep = dependency ( 'libselinux' , required : get_option ( 'selinux' ) )
2020-07-29 15:21:29 +03:00
if selinux_dep . found ( )
selinux_mount = get_option ( 'selinux_mount' )
if selinux_mount == ''
2022-01-22 22:30:11 +03:00
if run_command ( 'test' , '-d' , '/sys/fs/selinux' , check : false ) . returncode ( ) == 0
2020-07-29 15:21:29 +03:00
selinux_mount = '/sys/fs/selinux'
else
selinux_mount = '/selinux'
endif
endif
conf . set_quoted ( 'SELINUX_MOUNT' , selinux_mount )
conf . set ( 'WITH_SELINUX' , 1 )
endif
2021-05-27 20:04:10 +03:00
thread_dep = dependency ( 'threads' )
2020-04-29 12:46:41 +03:00
pthread_sigmask_code = '' '
#include <sys/types.h>
#include <signal.h>
int main ( ) {
#ifdef pthread_sigmask
int ( * foo ) ( int , const sigset_t * , sigset_t * ) = & pthread_sigmask ;
return ! foo ;
#endif
return 0 ;
}
'' '
if not cc . compiles ( pthread_sigmask_code )
conf . set ( 'FUNC_PTHREAD_SIGMASK_BROKEN' , 1 )
endif
2020-07-29 15:21:43 +03:00
udev_version = '219'
udev_dep = dependency ( 'libudev' , version : '>=' + udev_version , required : get_option ( 'udev' ) )
if udev_dep . found ( )
conf . set ( 'WITH_UDEV' , 1 )
endif
2020-10-08 14:51:00 +03:00
libutil_dep = cc . find_library ( 'util' , required : false )
2020-04-29 16:43:27 +03:00
2020-06-16 23:54:17 +03:00
if host_machine . system ( ) == 'windows'
ole32_dep = cc . find_library ( 'ole32' )
oleaut32_dep = cc . find_library ( 'oleaut32' )
2020-12-01 23:15:20 +03:00
winsock2_dep = cc . find_library ( 'ws2_32' )
2020-06-16 23:54:17 +03:00
win32_dep = declare_dependency (
dependencies : [
ole32_dep ,
oleaut32_dep ,
2020-12-01 23:15:20 +03:00
winsock2_dep ,
2020-06-16 23:54:17 +03:00
] ,
)
if get_option ( 'default_library' ) == 'static'
win32_flags = [ '-DLIBVIRT_STATIC' ]
else
win32_flags = [ ]
endif
win32_link_flags = [ '-Wl,-no-undefined' ]
else
win32_dep = dependency ( '' , required : false )
win32_flags = [ ]
win32_link_flags = [ ]
endif
2020-11-13 14:08:47 +03:00
wireshark_version = '2.6.0'
2020-07-29 15:22:10 +03:00
wireshark_dep = dependency ( 'wireshark' , version : '>=' + wireshark_version , required : get_option ( 'wireshark_dissector' ) )
2021-12-08 15:12:17 +03:00
if wireshark_dep . found ( )
if not xdr_dep . found ( )
if get_option ( 'wireshark_dissector' ) . enabled ( )
error ( 'XDR is required for wireshark plugin' )
else
wireshark_dep = dependency ( '' , required : false )
endif
endif
endif
2020-07-29 15:22:10 +03:00
if wireshark_dep . found ( )
wireshark_plugindir = get_option ( 'wireshark_plugindir' )
if wireshark_plugindir == ''
2022-10-07 10:48:00 +03:00
wireshark_plugindir = wireshark_dep . get_variable ( pkgconfig : 'plugindir' )
2020-07-29 15:22:10 +03:00
endif
2022-10-07 10:48:00 +03:00
wireshark_prefix = wireshark_dep . get_variable ( pkgconfig : 'prefix' )
2020-11-13 14:08:47 +03:00
if wireshark_prefix == ''
# If wireshark's prefix cannot be retrieved from pkg-config,
# this is our best bet.
wireshark_prefix = '/usr'
2020-07-29 15:22:10 +03:00
endif
2020-11-13 14:08:47 +03:00
# Replace wireshark's prefix with our own.
# There is no replace method in meson so we have to workaround it.
rc = run_command (
'python3' , '-c' ,
'print("@0@".replace("@1@", "@2@"))' . format (
wireshark_plugindir , wireshark_prefix , prefix ,
) ,
check : true ,
)
wireshark_plugindir = rc . stdout ( ) . strip ( )
2020-07-29 15:22:10 +03:00
# Since wireshark 2.5.0 plugins can't live in top level plugindir but have
# to be under one of ["epan", "wiretap", "codecs"] subdir. The first one looks okay.
wireshark_plugindir = wireshark_plugindir / 'epan'
2020-09-07 18:50:24 +03:00
# Wireshark is installing ws_version.h since v2.9.0, but some distributions
# are not shipping it.
if cc . has_header ( 'wireshark/ws_version.h' )
conf . set ( 'WITH_WS_VERSION' , 1 )
endif
2020-07-29 15:22:10 +03:00
endif
2020-07-29 15:22:23 +03:00
yajl_version = '2.0.3'
2020-11-13 13:43:04 +03:00
yajl_dep = dependency ( 'yajl' , version : '>=' + yajl_version , required : get_option ( 'yajl' ) )
2020-07-29 15:22:23 +03:00
if yajl_dep . found ( )
2021-05-14 12:03:42 +03:00
# Kludge for yajl include path on non-Linux
#
# As of 2.1.0, upstream yajl.pc has -I${includedir}/yajl among
# its Cflags, which is clearly wrong. This does not affect Linux
# because ${includedir} is already part of the default include path,
# but on other platforms that's not the case and the result is that
# <yajl/yajl.h> can't be located, causing the build to fail.
#
# Since upstream development for yajl has stopped years ago, there's
# little hope of this issue getting fixed by a new upstream release.
# Some non-Linux operating systems such as FreeBSD have elected to
# carry a small downstream patch, but in the case of Homebrew on
# macOS this approach has been rejected[1] and so we're left with no
# choice but to work around the issue ourselves.
#
# [1] https://github.com/Homebrew/homebrew-core/pull/74516
if host_machine . system ( ) != 'linux'
2022-10-07 10:48:00 +03:00
yajl_includedir = yajl_dep . get_variable ( pkgconfig : 'includedir' )
2022-02-01 20:56:26 +03:00
if yajl_includedir . contains ( 'include/yajl' )
2021-05-14 12:03:42 +03:00
rc = run_command (
'python3' , '-c' ,
'print("@0@".replace("@1@", "@2@"))' . format (
2022-02-01 20:56:26 +03:00
yajl_includedir , 'include/yajl' , 'include' ,
2021-05-14 12:03:42 +03:00
) ,
check : true ,
)
2022-02-01 20:56:26 +03:00
yajl_includedir = rc . stdout ( ) . strip ( )
2021-05-14 12:03:42 +03:00
yajl_dep = declare_dependency (
2022-02-01 20:56:26 +03:00
compile_args : [ '-I' + yajl_includedir ] ,
2021-05-14 12:03:42 +03:00
dependencies : [ yajl_dep ] ,
)
endif
endif
2020-07-29 15:22:23 +03:00
conf . set ( 'WITH_YAJL' , 1 )
endif
2020-03-02 17:14:14 +03:00
2020-06-24 14:24:53 +03:00
# generic build dependencies checks
if bash_completion_dep . found ( ) and not readline_dep . found ( )
if get_option ( 'bash_completion' ) . enabled ( )
error ( 'readline is required for bash completion support' )
else
bash_completion_dep = dependency ( '' , required : false )
endif
endif
if bash_completion_dep . found ( )
bash_completion_dir = get_option ( 'bash_completion_dir' )
if bash_completion_dir == ''
2022-10-07 10:48:00 +03:00
bash_completion_dir = bash_completion_dep . get_variable ( pkgconfig : 'completionsdir' )
bash_completion_prefix = bash_completion_dep . get_variable ( pkgconfig : 'prefix' )
2020-06-24 14:24:53 +03:00
rc = run_command (
'python3' , '-c' ,
'print("@0@".replace("@1@", "@2@"))' . format (
bash_completion_dir , bash_completion_prefix , prefix ,
) ,
check : true ,
)
bash_completion_dir = rc . stdout ( ) . strip ( )
endif
endif
2021-05-26 18:31:03 +03:00
if not get_option ( 'firewalld' ) . disabled ( )
firewalld_enable = true
2021-05-26 18:33:08 +03:00
if host_machine . system ( ) != 'linux'
2021-05-26 18:31:03 +03:00
firewalld_enable = false
2021-05-26 18:33:08 +03:00
if get_option ( 'firewalld' ) . enabled ( )
error ( 'firewalld support can only be enabled on Linux' )
endif
2021-05-26 18:31:03 +03:00
endif
if firewalld_enable
2020-06-24 14:25:51 +03:00
conf . set ( 'WITH_FIREWALLD' , 1 )
endif
endif
2020-06-24 14:26:08 +03:00
if not get_option ( 'firewalld_zone' ) . disabled ( ) and conf . has ( 'WITH_FIREWALLD' )
conf . set ( 'WITH_FIREWALLD_ZONE' , 1 )
elif get_option ( 'firewalld_zone' ) . enabled ( )
error ( 'You must have firewalld support enabled to enable firewalld_zone' )
endif
2021-05-25 19:14:09 +03:00
if not get_option ( 'polkit' ) . disabled ( )
polkit_enable = true
if get_option ( 'polkit' ) . auto ( )
pkcheck_prog = find_program ( 'pkcheck' , required : false , dirs : libvirt_sbin_path )
polkit_enable = pkcheck_prog . found ( )
endif
if host_machine . system ( ) == 'windows'
polkit_enable = false
if get_option ( 'polkit' ) . enabled ( )
error ( 'polkit support cannot be enabled on Windows' )
endif
endif
if polkit_enable
conf . set ( 'WITH_POLKIT' , 1 )
endif
2020-04-29 12:32:41 +03:00
endif
2020-07-29 15:21:43 +03:00
if udev_dep . found ( ) and not pciaccess_dep . found ( )
error ( 'You must install the pciaccess module to build with udev' )
endif
2020-06-24 14:24:53 +03:00
2020-07-29 15:22:35 +03:00
# build driver options
2021-05-25 12:45:06 +03:00
remote_default_mode = get_option ( 'remote_default_mode' )
if remote_default_mode == 'direct'
conf . set ( 'REMOTE_DRIVER_AUTOSTART_DIRECT' , '1' )
endif
2020-07-29 15:22:35 +03:00
2020-06-17 00:47:29 +03:00
if not get_option ( 'driver_libvirtd' ) . disabled ( )
use_libvirtd = true
if host_machine . system ( ) == 'windows'
use_libvirtd = false
if get_option ( 'driver_libvirtd' ) . enabled ( )
error ( 'libvirtd daemon is not supported on windows' )
endif
endif
if not conf . has ( 'WITH_REMOTE' )
use_libvirtd = false
if get_option ( 'driver_libvirtd' ) . enabled ( )
error ( 'remote driver is required for libvirtd daemon' )
endif
endif
if use_libvirtd
conf . set ( 'WITH_LIBVIRTD' , 1 )
endif
endif
2020-04-30 01:56:50 +03:00
if not get_option ( 'driver_bhyve' ) . disabled ( ) and host_machine . system ( ) == 'freebsd'
bhyve_prog = find_program ( 'bhyve' , required : get_option ( 'driver_bhyve' ) )
bhyvectl_prog = find_program ( 'bhyvectl' , required : get_option ( 'driver_bhyve' ) )
bhyveload_prog = find_program ( 'bhyveload' , required : get_option ( 'driver_bhyve' ) )
if bhyve_prog . found ( ) and bhyvectl_prog . found ( ) and bhyveload_prog . found ( )
conf . set ( 'WITH_BHYVE' , 1 )
2022-10-07 10:43:33 +03:00
conf . set_quoted ( 'BHYVE' , bhyve_prog . full_path ( ) )
conf . set_quoted ( 'BHYVECTL' , bhyvectl_prog . full_path ( ) )
conf . set_quoted ( 'BHYVELOAD' , bhyveload_prog . full_path ( ) )
2020-04-30 01:56:50 +03:00
endif
elif get_option ( 'driver_bhyve' ) . enabled ( )
error ( 'The bhyve driver cannot be enabled' )
endif
2020-07-22 18:53:26 +03:00
if not get_option ( 'driver_esx' ) . disabled ( ) and curl_dep . found ( )
conf . set ( 'WITH_ESX' , 1 )
conf . set ( 'WITH_VMX' , 1 )
elif get_option ( 'driver_esx' ) . enabled ( )
error ( 'Curl is required for the ESX driver' )
endif
2020-04-30 13:24:29 +03:00
if not get_option ( 'driver_hyperv' ) . disabled ( ) and openwsman_dep . found ( )
conf . set ( 'WITH_HYPERV' , 1 )
elif get_option ( 'driver_hyperv' ) . enabled ( )
error ( 'openwsman is required for the Hyper-V driver' )
endif
2021-01-22 00:01:06 +03:00
if not get_option ( 'driver_interface' ) . disabled ( ) and conf . has ( 'WITH_LIBVIRTD' ) and ( udev_dep . found ( ) or conf . has ( 'WITH_NETCF' ) )
2020-04-28 23:52:30 +03:00
conf . set ( 'WITH_INTERFACE' , 1 )
elif get_option ( 'driver_interface' ) . enabled ( )
error ( 'Requested the Interface driver without netcf or udev and libvirtd support' )
endif
2020-04-30 12:30:11 +03:00
if not get_option ( 'driver_libxl' ) . disabled ( ) and conf . has ( 'WITH_LIBVIRTD' )
2021-06-14 20:17:54 +03:00
libxl_version = '4.9.0'
2020-04-30 12:30:11 +03:00
libxl_dep = dependency ( 'xenlight' , version : '>=' + libxl_version , required : get_option ( 'driver_libxl' ) )
if libxl_dep . found ( )
2022-12-12 14:46:41 +03:00
libxl_firmware_dir = libxl_dep . get_variable ( pkgconfig : 'xenfirmwaredir' , default_value : '' )
libxl_execbin = libxl_dep . get_variable ( pkgconfig : 'libexec_bin' , default_value : '' )
2020-04-30 12:30:11 +03:00
if libxl_firmware_dir != ''
conf . set_quoted ( 'LIBXL_FIRMWARE_DIR' , libxl_firmware_dir )
endif
if libxl_execbin != ''
conf . set_quoted ( 'LIBXL_EXECBIN_DIR' , libxl_execbin )
endif
# If building with libxl, use the libxl utility header and lib too
if cc . has_header ( 'libxlutil.h' )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_LIBXLUTIL_H' , 1 )
2020-04-30 12:30:11 +03:00
endif
2021-05-26 19:46:20 +03:00
xl_util_dep = dependency ( 'xlutil' )
2020-04-30 12:30:11 +03:00
2021-05-26 19:46:20 +03:00
xen_store_dep = dependency ( 'xenstore' )
2021-06-14 20:17:54 +03:00
xtl_link_dep = dependency ( 'xentoollog' )
2020-04-30 12:30:11 +03:00
2021-06-14 20:17:54 +03:00
# Upstream Xen failed to advertise LIBXL_API_VERSION 0x040700 and
# 0x040800 until the Xen 4.13 release. For Xen versions 4.9-4.12
# we'll need to stick with version 0x040500.
2021-03-25 19:26:12 +03:00
if libxl_dep . version ( ) . version_compare ( '>=4.13.0' )
LIBXL_API_VERSION = '0x041300'
else
LIBXL_API_VERSION = '0x040500'
endif
2020-04-30 12:30:11 +03:00
libxl_dep = declare_dependency (
2021-03-25 19:26:12 +03:00
compile_args : '-DLIBXL_API_VERSION=' + LIBXL_API_VERSION ,
2020-04-30 12:30:11 +03:00
dependencies : [
libxl_dep ,
xtl_link_dep ,
xl_util_dep ,
xen_store_dep ,
] ,
)
# Check if Xen has support for PVH
if cc . has_header_symbol ( 'libxl.h' , 'LIBXL_DOMAIN_TYPE_PVH' )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_XEN_PVH' , 1 )
2020-04-30 12:30:11 +03:00
endif
conf . set ( 'WITH_LIBXL' , 1 )
endif
elif get_option ( 'driver_libxl' ) . enabled ( )
error ( 'libvirtd is required for libxenlight' )
endif
2020-04-30 12:30:32 +03:00
if not get_option ( 'driver_lxc' ) . disabled ( ) and host_machine . system ( ) == 'linux' and conf . has ( 'WITH_LIBVIRTD' )
2022-12-08 12:17:37 +03:00
conf . set ( 'WITH_LXC' , 1 )
2020-04-30 12:30:32 +03:00
elif get_option ( 'driver_lxc' ) . enabled ( )
error ( 'linux and remote_driver are required for LXC' )
endif
2021-05-12 20:01:31 +03:00
if not get_option ( 'driver_ch' ) . disabled ( ) and host_machine . system ( ) == 'linux' and ( host_machine . cpu_family ( ) == 'x86_64' or host_machine . cpu_family ( ) == 'aarch64' )
use_ch = true
if not conf . has ( 'WITH_LIBVIRTD' )
use_ch = false
if get_option ( 'driver_ch' ) . enabled ( )
error ( 'libvirtd is required to build Cloud-Hypervisor driver' )
endif
endif
if not yajl_dep . found ( )
use_ch = false
if get_option ( 'driver_ch' ) . enabled ( )
error ( 'YAJL 2 is required to build Cloud-Hypervisor driver' )
endif
endif
if not curl_dep . found ( )
use_ch = false
if get_option ( 'driver_ch' ) . enabled ( )
error ( 'curl is required to build Cloud-Hypervisor driver' )
endif
endif
if use_ch
conf . set ( 'WITH_CH' , 1 )
default_ch_user = 'root'
default_ch_group = 'root'
ch_user = get_option ( 'ch_user' )
if ch_user == ''
ch_user = default_ch_user
endif
ch_group = get_option ( 'ch_group' )
if ch_group == ''
ch_group = default_ch_group
endif
conf . set_quoted ( 'CH_USER' , ch_user )
conf . set_quoted ( 'CH_GROUP' , ch_group )
endif
endif
2021-12-03 16:06:54 +03:00
if not get_option ( 'driver_network' ) . disabled ( ) and conf . has ( 'WITH_LIBVIRTD' )
2020-04-30 14:35:50 +03:00
conf . set ( 'WITH_NETWORK' , 1 )
2021-12-03 16:06:54 +03:00
elif get_option ( 'driver_network' ) . enabled ( )
error ( 'libvirtd must be enabled to build the network driver' )
2020-04-30 14:35:50 +03:00
endif
2020-10-08 13:46:11 +03:00
if udev_dep . found ( ) and conf . has ( 'WITH_LIBVIRTD' )
2020-06-30 20:53:59 +03:00
conf . set ( 'WITH_NODE_DEVICES' , 1 )
endif
2020-04-30 02:03:08 +03:00
if not get_option ( 'driver_openvz' ) . disabled ( ) and host_machine . system ( ) == 'linux'
conf . set ( 'WITH_OPENVZ' , 1 )
elif get_option ( 'driver_openvz' ) . enabled ( )
error ( 'OpenVZ driver can be enabled on Linux only' )
endif
2020-07-01 04:07:00 +03:00
if not get_option ( 'driver_qemu' ) . disabled ( )
use_qemu = true
if not yajl_dep . found ( )
use_qemu = false
if get_option ( 'driver_qemu' ) . enabled ( )
error ( 'YAJL 2 is required to build QEMU driver' )
endif
endif
if not conf . has ( 'WITH_LIBVIRTD' )
use_qemu = false
if get_option ( 'driver_qemu' ) . enabled ( )
error ( 'libvirtd is required to build QEMU driver' )
endif
endif
if use_qemu
conf . set ( 'WITH_QEMU' , 1 )
2020-08-21 00:52:17 +03:00
qemu_moddir = get_option ( 'qemu_moddir' )
if qemu_moddir == ''
2021-11-15 20:16:40 +03:00
qemu_moddir = libdir / 'qemu'
2020-08-21 00:52:17 +03:00
endif
conf . set_quoted ( 'QEMU_MODDIR' , qemu_moddir )
2021-11-15 20:13:56 +03:00
qemu_datadir = get_option ( 'qemu_datadir' )
if qemu_datadir == ''
qemu_datadir = datadir / 'qemu'
endif
conf . set_quoted ( 'QEMU_DATADIR' , qemu_datadir )
2020-07-01 04:07:00 +03:00
qemu_user = get_option ( 'qemu_user' )
2022-01-26 17:14:13 +03:00
qemu_group = get_option ( 'qemu_group' )
if ( qemu_user == '' and qemu_group != '' ) or ( qemu_user != '' and qemu_group == '' )
error ( 'Please specify both qemu_user and qemu_group or neither of them' )
endif
2022-01-26 17:21:20 +03:00
if qemu_user == '' and qemu_group == ''
if host_machine . system ( ) in [ 'freebsd' , 'darwin' ]
qemu_user = 'root'
qemu_group = 'wheel'
else
2022-01-26 17:09:52 +03:00
os_release = run_command ( 'grep' , '-E' , '^ID(_LIKE)*=' , '/etc/os-release' , check : false ) . stdout ( )
2022-01-26 17:21:20 +03:00
if os_release . contains ( 'arch' )
qemu_user = 'nobody'
qemu_group = 'nobody'
2022-01-26 17:09:52 +03:00
# RHEL and CentOS both have ID_LIKE=fedora, SLES has ID_LIKE=suse
elif ( os_release . contains ( 'fedora' ) or
2022-01-26 17:21:20 +03:00
os_release . contains ( 'gentoo' ) or
os_release . contains ( 'suse' ) )
qemu_user = 'qemu'
qemu_group = 'qemu'
2022-01-26 17:09:52 +03:00
# Ubuntu has ID_LIKE=debian so we need to handle it first
2022-01-26 17:21:20 +03:00
elif os_release . contains ( 'ubuntu' )
qemu_user = 'libvirt-qemu'
qemu_group = 'kvm'
2022-01-26 17:09:52 +03:00
elif os_release . contains ( 'debian' )
qemu_user = 'libvirt-qemu'
qemu_group = 'libvirt-qemu'
2022-01-26 17:21:20 +03:00
else
qemu_user = 'root'
qemu_group = 'root'
endif
endif
2020-07-01 04:07:00 +03:00
endif
conf . set_quoted ( 'QEMU_USER' , qemu_user )
conf . set_quoted ( 'QEMU_GROUP' , qemu_group )
qemu_bridge_prog = find_program (
'qemu-bridge-helper' ,
dirs : [ '/usr/libexec' , '/usr/lib/qemu' , '/usr/lib' ] ,
required : false
)
if qemu_bridge_prog . found ( )
2022-10-07 10:43:33 +03:00
qemu_bridge_path = qemu_bridge_prog . full_path ( )
2020-07-01 04:07:00 +03:00
else
qemu_bridge_path = '/usr/libexec/qemu-bridge-helper'
endif
conf . set_quoted ( 'QEMU_BRIDGE_HELPER' , qemu_bridge_path )
qemu_pr_prog = find_program (
'qemu-pr-helper' ,
dirs : [ '/usr/bin' , '/usr/libexec' ] ,
required : false
)
if qemu_pr_prog . found ( )
2022-10-07 10:43:33 +03:00
qemu_pr_path = qemu_pr_prog . full_path ( )
2020-07-01 04:07:00 +03:00
else
qemu_pr_path = '/usr/bin/qemu-pr-helper'
endif
conf . set_quoted ( 'QEMU_PR_HELPER' , qemu_pr_path )
qemu_slirp_prog = find_program (
'slirp-helper' ,
dirs : [ '/usr/bin' , '/usr/libexec' ] ,
required : false
)
if qemu_slirp_prog . found ( )
2022-10-07 10:43:33 +03:00
qemu_slirp_path = qemu_slirp_prog . full_path ( )
2020-07-01 04:07:00 +03:00
else
qemu_slirp_path = '/usr/bin/slirp-helper'
endif
conf . set_quoted ( 'QEMU_SLIRP_HELPER' , qemu_slirp_path )
qemu_dbus_daemon_prog = find_program (
'dbus-daemon' ,
dirs : [ '/usr/bin' , '/usr/libexec' ] ,
required : false
)
if qemu_dbus_daemon_prog . found ( )
2022-10-07 10:43:33 +03:00
qemu_dbus_daemon_path = qemu_dbus_daemon_prog . full_path ( )
2020-07-01 04:07:00 +03:00
else
qemu_dbus_daemon_path = '/usr/bin/dbus-daemon'
endif
conf . set_quoted ( 'QEMU_DBUS_DAEMON' , qemu_dbus_daemon_path )
endif
endif
2020-03-27 20:14:18 +03:00
if not get_option ( 'driver_secrets' ) . disabled ( ) and conf . has ( 'WITH_LIBVIRTD' )
conf . set ( 'WITH_SECRETS' , 1 )
endif
2021-05-26 18:46:26 +03:00
if not get_option ( 'driver_test' ) . disabled ( )
2020-04-30 02:05:43 +03:00
conf . set ( 'WITH_TEST' , 1 )
endif
2020-06-17 00:47:58 +03:00
if not get_option ( 'driver_vbox' ) . disabled ( ) and conf . has ( 'WITH_LIBVIRTD' )
conf . set ( 'WITH_VBOX' , 1 )
conf . set_quoted ( 'VBOX_XPCOMC_DIR' , get_option ( 'vbox_xpcomc_dir' ) )
endif
2021-01-05 12:18:57 +03:00
if not get_option ( 'driver_vmware' ) . disabled ( )
2020-04-30 02:08:19 +03:00
conf . set ( 'WITH_VMWARE' , 1 )
conf . set ( 'WITH_VMX' , 1 )
endif
2020-06-19 12:57:23 +03:00
if not get_option ( 'driver_vz' ) . disabled ( ) and parallels_sdk_dep . found ( )
conf . set ( 'WITH_VZ' , 1 )
elif get_option ( 'driver_vz' ) . enabled ( )
error ( 'Parallels Virtualization SDK is needed to build the Virtuozzo driver.' )
endif
2020-06-24 12:01:08 +03:00
if not get_option ( 'secdriver_apparmor' ) . disabled ( ) and apparmor_dep . found ( )
conf . set ( 'WITH_SECDRIVER_APPARMOR' , 1 )
elif get_option ( 'secdriver_apparmor' ) . enabled ( )
error ( 'You must install the AppArmor development package in order to compile libvirt.' )
endif
if not get_option ( 'secdriver_selinux' ) . disabled ( ) and selinux_dep . found ( )
conf . set ( 'WITH_SECDRIVER_SELINUX' , 1 )
elif get_option ( 'secdriver_selinux' ) . enabled ( )
error ( 'You must install the libselinux development package in order to compile libvirt.' )
endif
2020-04-30 14:35:50 +03:00
if conf . has ( 'WITH_QEMU' ) or conf . has ( 'WITH_LXC' ) or conf . has ( 'WITH_NETWORK' )
conf . set ( 'WITH_BRIDGE' , 1 )
endif
2020-07-29 15:22:35 +03:00
2020-04-24 16:14:37 +03:00
# check for storage drivers
use_storage = false
2020-04-30 11:43:08 +03:00
if conf . has ( 'WITH_LIBVIRTD' )
if not get_option ( 'storage_dir' ) . disabled ( )
use_storage = true
conf . set ( 'WITH_STORAGE_DIR' , 1 )
endif
2020-06-24 12:53:47 +03:00
if not get_option ( 'storage_disk' ) . disabled ( ) and devmapper_dep . found ( ) and libparted_dep . found ( )
use_storage = true
conf . set ( 'WITH_STORAGE_DISK' , 1 )
elif get_option ( 'storage_disk' ) . enabled ( )
error ( 'You must install libparted and libdevmapper to compile libvirt with disk storage driver' )
endif
2020-04-30 11:55:52 +03:00
if not get_option ( 'storage_fs' ) . disabled ( )
fs_enable = true
# storage-fs does not work on macOS
if host_machine . system ( ) == 'darwin'
fs_enable = false
endif
if fs_enable and not cc . has_header ( 'mntent.h' )
if get_option ( 'storage_fs' ) . enabled ( )
error ( '<mntent.h> is required for the FS storage driver' )
else
fs_enable = false
endif
endif
if fs_enable
mount_prog = find_program ( 'mount' , required : get_option ( 'storage_fs' ) , dirs : libvirt_sbin_path )
umount_prog = find_program ( 'umount' , required : get_option ( 'storage_fs' ) , dirs : libvirt_sbin_path )
mkfs_prog = find_program ( 'mkfs' , required : get_option ( 'storage_fs' ) , dirs : libvirt_sbin_path )
if not mount_prog . found ( ) or not umount_prog . found ( ) or not mkfs_prog . found ( )
fs_enable = false
endif
endif
if fs_enable
use_storage = true
conf . set ( 'WITH_STORAGE_FS' , 1 )
2022-10-07 10:43:33 +03:00
conf . set_quoted ( 'MOUNT' , mount_prog . full_path ( ) )
conf . set_quoted ( 'UMOUNT' , umount_prog . full_path ( ) )
conf . set_quoted ( 'MKFS' , mkfs_prog . full_path ( ) )
2020-04-30 11:55:52 +03:00
showmount_prog = find_program ( 'showmount' , required : false , dirs : libvirt_sbin_path )
showmount_path = ''
if showmount_prog . found ( )
2022-10-07 10:43:33 +03:00
showmount_path = showmount_prog . full_path ( )
2020-04-30 11:55:52 +03:00
endif
conf . set_quoted ( 'SHOWMOUNT' , showmount_path )
endif
endif
2020-04-30 12:07:59 +03:00
if not get_option ( 'storage_gluster' ) . disabled ( ) and glusterfs_dep . found ( )
use_storage = true
conf . set ( 'WITH_STORAGE_GLUSTER' , 1 )
elif get_option ( 'storage_gluster' ) . enabled ( )
error ( 'Need glusterfs (libgfapi) for gluster storage driver' )
endif
2020-04-30 12:09:45 +03:00
if not get_option ( 'storage_iscsi' ) . disabled ( ) and iscsiadm_prog . found ( )
use_storage = true
conf . set ( 'WITH_STORAGE_ISCSI' , 1 )
elif get_option ( 'storage_iscsi' ) . enabled ( )
error ( 'We need iscsiadm for iSCSI storage driver' )
endif
2020-04-30 11:59:58 +03:00
if not get_option ( 'storage_iscsi_direct' ) . disabled ( ) and libiscsi_dep . found ( )
use_storage = true
conf . set ( 'WITH_STORAGE_ISCSI_DIRECT' , 1 )
elif get_option ( 'storage_iscsi_direct' ) . enabled ( )
error ( 'Need libiscsi for iscsi-direct storage driver' )
endif
2020-04-30 12:00:49 +03:00
if not get_option ( 'storage_lvm' ) . disabled ( )
lvm_enable = true
lvm_progs = [
'pvcreate' , 'vgcreate' , 'lvcreate' ,
'pvremove' , 'vgremove' , 'lvremove' ,
'lvchange' , 'vgchange' , 'vgscan' ,
'pvs' , 'vgs' , 'lvs' ,
]
foreach name : lvm_progs
set_variable (
'@0@_prog' . format ( name ) ,
find_program ( name , required : get_option ( 'storage_lvm' ) , dirs : libvirt_sbin_path )
)
if not get_variable ( '@0@_prog' . format ( name ) ) . found ( )
lvm_enable = false
endif
endforeach
if lvm_enable
use_storage = true
conf . set ( 'WITH_STORAGE_LVM' , 1 )
foreach name : lvm_progs
2022-10-07 10:43:33 +03:00
conf . set_quoted ( name . to_upper ( ) , get_variable ( '@0@_prog' . format ( name ) ) . full_path ( ) )
2020-04-30 12:00:49 +03:00
endforeach
endif
endif
2020-04-30 12:01:46 +03:00
if not get_option ( 'storage_mpath' ) . disabled ( ) and host_machine . system ( ) == 'linux' and devmapper_dep . found ( )
use_storage = true
conf . set ( 'WITH_STORAGE_MPATH' , 1 )
elif get_option ( 'storage_mpath' ) . enabled ( )
error ( 'mpath storage driver is supported only on Linux and you must install libdevmapper' )
endif
2020-06-19 18:09:22 +03:00
if not get_option ( 'storage_rbd' ) . disabled ( ) and rbd_dep . found ( )
use_storage = true
conf . set ( 'WITH_STORAGE_RBD' , 1 )
elif get_option ( 'storage_rbd' ) . enabled ( )
error ( 'You must install the librbd library & headers to compile libvirt' )
endif
2020-04-30 12:31:33 +03:00
if not get_option ( 'storage_scsi' ) . disabled ( ) and host_machine . system ( ) == 'linux'
use_storage = true
conf . set ( 'WITH_STORAGE_SCSI' , 1 )
endif
2020-04-30 12:10:07 +03:00
2020-04-30 12:11:21 +03:00
if not get_option ( 'storage_vstorage' ) . disabled ( )
2021-01-19 16:34:26 +03:00
vstorage_enable = true
if host_machine . system ( ) != 'linux'
2021-05-26 18:47:58 +03:00
vstorage_enable = false
2021-05-26 18:47:05 +03:00
if get_option ( 'storage_vstorage' ) . enabled ( )
2021-01-19 16:34:26 +03:00
error ( 'Vstorage is supported only on Linux' )
endif
endif
if vstorage_enable
use_storage = true
conf . set ( 'WITH_STORAGE_VSTORAGE' , 1 )
endif
2020-04-30 12:11:21 +03:00
endif
2020-04-30 12:12:03 +03:00
if not get_option ( 'storage_zfs' ) . disabled ( )
2021-09-14 10:38:44 +03:00
use_storage = true
conf . set ( 'WITH_STORAGE_ZFS' , 1 )
2020-04-30 12:12:03 +03:00
endif
2020-04-30 11:43:08 +03:00
endif
2020-04-24 16:14:37 +03:00
if use_storage
conf . set ( 'WITH_STORAGE' , 1 )
endif
2020-07-24 17:43:48 +03:00
# build feature options
chrdev_lock_files = get_option ( 'chrdev_lock_files' )
if chrdev_lock_files == '' and host_machine . system ( ) == 'linux'
chrdev_lock_files = '/var/lock'
endif
if chrdev_lock_files != ''
conf . set_quoted ( 'VIR_CHRDEV_LOCK_FILE_PATH' , chrdev_lock_files )
endif
2020-07-24 17:44:39 +03:00
driver_modules_flags = [ ]
if conf . has ( 'WITH_LIBVIRTD' )
2020-09-01 14:27:44 +03:00
if not conf . has ( 'WITH_DLFCN_H' ) or not dlopen_dep . found ( )
2020-07-24 17:44:39 +03:00
error ( 'You must have dlfcn.h / dlopen() support to build driver modules' )
endif
driver_modules_flags = libvirt_export_dynamic
endif
2020-07-24 17:44:59 +03:00
if host_machine . system ( ) == 'linux'
dtrace_prog = find_program ( 'dtrace' , required : get_option ( 'dtrace' ) , dirs : libvirt_sbin_path )
if dtrace_prog . found ( )
conf . set ( 'WITH_DTRACE_PROBES' , 1 )
endif
2021-01-19 02:08:23 +03:00
dtrace_command = [ 'env' , 'CC=' + ' ' . join ( meson . get_compiler ( 'c' ) . cmd_array ( ) ) , dtrace_prog ]
2020-07-24 17:44:59 +03:00
endif
2020-07-24 17:45:36 +03:00
if not get_option ( 'host_validate' ) . disabled ( ) and host_machine . system ( ) != 'windows'
conf . set ( 'WITH_HOST_VALIDATE' , 1 )
elif get_option ( 'host_validate' ) . enabled ( )
error ( 'virt-host-validate is not supported on Windows' )
endif
2020-07-16 18:36:03 +03:00
if get_option ( 'init_script' ) == 'check'
if meson . is_cross_build ( )
init_script = 'none'
elif find_program ( 'systemctl' , required : false ) . found ( )
init_script = 'systemd'
elif find_program ( 'openrc' , required : false ) . found ( )
init_script = 'openrc'
else
init_script = 'none'
endif
else
init_script = get_option ( 'init_script' )
endif
2020-07-24 17:45:58 +03:00
loader_nvram = get_option ( 'loader_nvram' )
if loader_nvram != ''
if ( loader_nvram . split ( ':' ) . length ( ) % 2 ) != 0
error ( 'Malformed loader_nvram option' )
endif
conf . set_quoted ( 'DEFAULT_LOADER_NVRAM' , loader_nvram )
endif
2020-07-16 19:09:20 +03:00
if not get_option ( 'login_shell' ) . disabled ( ) and host_machine . system ( ) == 'linux'
conf . set ( 'WITH_LOGIN_SHELL' , 1 )
elif get_option ( 'login_shell' ) . enabled ( )
error ( 'virt-login-shell is supported on Linux only' )
endif
2020-06-24 14:27:59 +03:00
if not get_option ( 'nss' ) . disabled ( )
use_nss = true
if not yajl_dep . found ( )
if get_option ( 'nss' ) . enabled ( )
error ( 'Can\'t build nss plugin without yajl' )
else
use_nss = false
endif
endif
if use_nss and not conf . has ( 'WITH_NETWORK' )
if get_option ( 'nss' ) . enabled ( )
error ( 'Can\'t build nss plugin without network' )
else
use_nss = false
endif
endif
if use_nss and not cc . has_header ( 'nss.h' )
if get_option ( 'nss' ) . enabled ( )
error ( 'Can\'t build nss plugin without nss.h' )
else
use_nss = false
endif
endif
if use_nss
conf . set ( 'WITH_NSS' , 1 )
if cc . has_type ( 'struct gaih_addrtuple' , prefix : '#include <nss.h>' )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_STRUCT_GAIH_ADDRTUPLE' , 1 )
2020-06-24 14:27:59 +03:00
endif
if ( cc . has_type ( 'ns_mtab' , prefix : '#include <nsswitch.h>' ) and
cc . has_type ( 'nss_module_unregister_fn' , prefix : '#include <nsswitch.h>' ) )
conf . set ( 'WITH_BSD_NSS' , 1 )
endif
endif
endif
2020-07-01 03:47:06 +03:00
if not get_option ( 'numad' ) . disabled ( ) and numactl_dep . found ( )
numad_prog = find_program ( 'numad' , required : get_option ( 'numad' ) , dirs : libvirt_sbin_path )
if numad_prog . found ( )
2020-09-01 14:27:44 +03:00
conf . set ( 'WITH_NUMAD' , 1 )
2022-10-07 10:43:33 +03:00
conf . set_quoted ( 'NUMAD' , numad_prog . full_path ( ) )
2020-07-01 03:47:06 +03:00
endif
elif get_option ( 'numad' ) . enabled ( )
error ( 'You must have numactl enabled for numad support.' )
endif
2020-04-30 12:30:54 +03:00
# nwfilter should only be compiled for linux, and only if the
# libvirt daemon is also being compiled
if conf . has ( 'WITH_LIBVIRTD' ) and host_machine . system ( ) == 'linux'
conf . set ( 'WITH_NWFILTER' , 1 )
endif
2020-07-01 03:58:23 +03:00
if not get_option ( 'pm_utils' ) . disabled ( )
use_pm_utils = true
2020-09-15 15:22:57 +03:00
if init_script == 'systemd'
2020-07-01 03:58:23 +03:00
use_pm_utils = false
endif
if use_pm_utils
conf . set ( 'WITH_PM_UTILS' , 1 )
endif
endif
2020-04-30 01:43:59 +03:00
if not get_option ( 'sysctl_config' ) . disabled ( ) and host_machine . system ( ) == 'linux'
conf . set ( 'WITH_SYSCTL' , 1 )
elif get_option ( 'sysctl_config' ) . enabled ( )
error ( 'sysctl configuration is supported only on linux' )
endif
2020-07-01 04:07:37 +03:00
conf . set_quoted ( 'TLS_PRIORITY' , get_option ( 'tls_priority' ) )
2020-07-24 17:43:48 +03:00
2020-06-30 21:18:18 +03:00
# Various definitions
# Python3 < 3.7 treats the C locale as 7-bit only. We must force env vars so
# it treats it as UTF-8 regardless of the user's locale.
runutf8 = [ 'LC_ALL=' , 'LANG=C' , 'LC_CTYPE=en_US.UTF-8' ]
2020-08-03 09:50:49 +03:00
# define top include directory
top_inc_dir = include_directories ( '.' )
2023-04-17 14:54:01 +03:00
keycodemapdb = subproject ( 'keycodemapdb' )
2020-08-03 09:50:49 +03:00
2020-06-18 01:53:18 +03:00
# include remaining subdirs
subdir ( 'scripts' )
2020-06-18 01:53:35 +03:00
subdir ( 'include' )
2020-05-05 11:14:34 +03:00
subdir ( 'src' )
2020-06-24 14:32:04 +03:00
subdir ( 'tools' )
2023-03-21 19:01:34 +03:00
build_tests = [ not get_option ( 'tests' ) . disabled ( ) ]
if build_tests [ 0 ] and \
cc . get_id ( ) == 'clang' and \
not supported_cc_flags . contains ( '-fsemantic-interposition' ) \
and get_option ( 'optimization' ) != '0'
# If CLang doesn't support -fsemantic-interposition then our
# mocking doesn't work. The best we can do is to not run the
# test suite.
build_tests = [ false , '!!! Forcibly disabling tests because CLang lacks -fsemantic-interposition. Update CLang or disable optimization !!!' ]
endif
if build_tests [ 0 ]
2020-10-08 15:46:03 +03:00
subdir ( 'tests' )
endif
2020-05-21 17:41:32 +03:00
2020-06-25 19:14:13 +03:00
subdir ( 'examples' )
2020-06-29 22:55:39 +03:00
subdir ( 'po' )
2020-10-08 15:39:38 +03:00
gen_docs = not get_option ( 'docs' ) . disabled ( )
if gen_docs
subdir ( 'docs' )
endif
2020-06-18 03:20:37 +03:00
2020-06-26 00:29:43 +03:00
subdir ( 'build-aux' )
2020-06-18 01:53:18 +03:00
2020-06-29 22:56:09 +03:00
# install pkgconfig files
pkgconfig_files = [
'libvirt.pc.in' ,
'libvirt-qemu.pc.in' ,
'libvirt-lxc.pc.in' ,
'libvirt-admin.pc.in' ,
]
2022-03-29 12:43:36 +03:00
pkgconfig_conf = configuration_data ( {
'VERSION' : meson . project_version ( ) ,
'datadir' : datadir ,
'datarootdir' : datadir ,
'exec_prefix' : prefix ,
'includedir' : includedir ,
'libdir' : libdir ,
'prefix' : prefix ,
} )
2020-06-29 22:56:09 +03:00
pkgconfig_dir = libdir / 'pkgconfig'
foreach file : pkgconfig_files
configure_file (
input : file ,
output : '@BASENAME@' ,
configuration : pkgconfig_conf ,
install : true ,
install_dir : pkgconfig_dir ,
)
endforeach
2020-07-28 18:51:53 +03:00
# generate dist files
if git
2022-03-29 12:43:36 +03:00
spec_conf = configuration_data ( {
'VERSION' : meson . project_version ( ) ,
} )
2020-07-28 18:51:53 +03:00
2022-08-08 18:40:56 +03:00
configure_file (
input : 'libvirt.spec.in' ,
output : '@BASENAME@' ,
configuration : spec_conf ,
)
2020-07-28 18:51:53 +03:00
2022-10-07 10:43:33 +03:00
authors = run_command ( python3_prog , meson_gen_authors_prog . full_path ( ) ,
2022-01-22 22:30:11 +03:00
env : runutf8 , check : true )
2020-08-25 18:52:24 +03:00
authors_file = 'AUTHORS.rst.in'
2020-07-28 18:51:53 +03:00
2022-03-29 12:43:36 +03:00
authors_conf = configuration_data ( {
'contributorslist' : authors . stdout ( ) ,
} )
2020-07-28 18:51:53 +03:00
configure_file (
input : authors_file ,
output : '@BASENAME@' ,
configuration : authors_conf ,
)
# Using return values from configure_file in add_dist_script is possible since 0.55.0
dist_files = [
'libvirt.spec' ,
2020-08-25 18:52:24 +03:00
'AUTHORS.rst' ,
2020-07-28 18:51:53 +03:00
]
foreach file : dist_files
meson . add_dist_script (
2022-10-07 10:43:33 +03:00
meson_python_prog . full_path ( ) , python3_prog . full_path ( ) , meson_dist_prog . full_path ( ) ,
2022-10-07 10:31:32 +03:00
meson . project_build_root ( ) , file
2020-07-28 18:51:53 +03:00
)
endforeach
endif
2020-08-03 09:50:49 +03:00
# generate meson-config.h file
configure_file ( output : 'meson-config.h' , configuration : conf )
2020-04-30 15:56:21 +03:00
2020-07-01 03:52:45 +03:00
# generate run helper
2022-03-29 12:43:36 +03:00
run_conf = configuration_data ( {
2022-10-07 10:31:32 +03:00
'abs_builddir' : meson . project_build_root ( ) ,
'abs_top_builddir' : meson . project_build_root ( ) ,
2022-03-29 12:43:36 +03:00
} )
2020-07-01 03:52:45 +03:00
configure_file (
input : 'run.in' ,
2020-08-25 19:30:57 +03:00
output : '@BASENAME@' ,
2020-07-01 03:52:45 +03:00
configuration : run_conf ,
)
2022-01-22 22:30:11 +03:00
run_command ( 'chmod' , 'a+x' , meson . current_build_dir ( ) / 'run' , check : true )
2020-07-01 03:52:45 +03:00
2020-04-30 15:56:21 +03:00
# print configuration summary
2020-07-29 15:22:35 +03:00
driver_summary = {
2020-07-01 04:07:00 +03:00
'QEMU' : conf . has ( 'WITH_QEMU' ) ,
2020-04-30 02:03:08 +03:00
'OpenVZ' : conf . has ( 'WITH_OPENVZ' ) ,
2020-04-30 02:08:19 +03:00
'VMware' : conf . has ( 'WITH_VMWARE' ) ,
2020-06-17 00:47:58 +03:00
'VBox' : conf . has ( 'WITH_VBOX' ) ,
2020-04-30 12:30:11 +03:00
'libxl' : conf . has ( 'WITH_LIBXL' ) ,
2020-04-30 12:30:32 +03:00
'LXC' : conf . has ( 'WITH_LXC' ) ,
2021-05-12 20:01:31 +03:00
'Cloud-Hypervisor' : conf . has ( 'WITH_CH' ) ,
2020-07-22 18:53:26 +03:00
'ESX' : conf . has ( 'WITH_ESX' ) ,
2020-04-30 13:24:29 +03:00
'Hyper-V' : conf . has ( 'WITH_HYPERV' ) ,
2020-06-19 12:57:23 +03:00
'vz' : conf . has ( 'WITH_VZ' ) ,
2020-04-30 01:56:50 +03:00
'Bhyve' : conf . has ( 'WITH_BHYVE' ) ,
2020-04-30 02:05:43 +03:00
'Test' : conf . has ( 'WITH_TEST' ) ,
2020-07-29 15:22:35 +03:00
'Remote' : conf . has ( 'WITH_REMOTE' ) ,
2020-04-30 14:35:50 +03:00
'Network' : conf . has ( 'WITH_NETWORK' ) ,
2020-06-17 00:47:29 +03:00
'Libvirtd' : conf . has ( 'WITH_LIBVIRTD' ) ,
2020-04-28 23:52:30 +03:00
'Interface' : conf . has ( 'WITH_INTERFACE' ) ,
2020-07-29 15:22:35 +03:00
}
summary ( driver_summary , section : 'Drivers' , bool_yn : true )
2020-04-30 11:43:08 +03:00
storagedriver_summary = {
'Dir' : conf . has ( 'WITH_STORAGE_DIR' ) ,
2020-04-30 11:55:52 +03:00
'FS' : conf . has ( 'WITH_STORAGE_FS' ) ,
'NetFS' : conf . has ( 'WITH_STORAGE_FS' ) ,
2020-04-30 12:00:49 +03:00
'LVM' : conf . has ( 'WITH_STORAGE_LVM' ) ,
2020-04-30 12:09:45 +03:00
'iSCSI' : conf . has ( 'WITH_STORAGE_ISCSI' ) ,
2020-04-30 11:59:58 +03:00
'iscsi-direct' : conf . has ( 'WITH_STORAGE_ISCSI_DIRECT' ) ,
2020-04-30 12:31:33 +03:00
'SCSI' : conf . has ( 'WITH_STORAGE_SCSI' ) ,
2020-04-30 12:01:46 +03:00
'mpath' : conf . has ( 'WITH_STORAGE_MPATH' ) ,
2020-06-24 12:53:47 +03:00
'Disk' : conf . has ( 'WITH_STORAGE_DISK' ) ,
2020-06-19 18:09:22 +03:00
'RBD' : conf . has ( 'WITH_STORAGE_RBD' ) ,
2020-04-30 12:07:59 +03:00
'Gluster' : conf . has ( 'WITH_STORAGE_GLUSTER' ) ,
2020-04-30 12:12:03 +03:00
'ZFS' : conf . has ( 'WITH_STORAGE_ZFS' ) ,
2020-04-30 12:11:21 +03:00
'Virtuozzo storage' : conf . has ( 'WITH_STORAGE_VSTORAGE' ) ,
2020-04-30 11:43:08 +03:00
}
summary ( storagedriver_summary , section : 'Storage Drivers' , bool_yn : true )
2020-06-24 12:01:08 +03:00
secdriver_summary = {
'SELinux' : conf . has ( 'WITH_SECDRIVER_SELINUX' ) ,
'AppArmor' : conf . has ( 'WITH_SECDRIVER_APPARMOR' ) ,
}
summary ( secdriver_summary , section : 'Security Drivers' , bool_yn : true )
2020-07-24 17:44:39 +03:00
drivermod_summary = {
'driver_modules' : driver_modules_flags . length ( ) > 0 ,
}
summary ( drivermod_summary , section : 'Driver Loadable Modules' , bool_yn : true )
2020-03-02 17:14:14 +03:00
libs_summary = {
'acl' : acl_dep . found ( ) ,
2020-07-29 15:19:59 +03:00
'apparmor' : apparmor_dep . found ( ) ,
2020-07-29 15:20:15 +03:00
'attr' : attr_dep . found ( ) ,
2020-07-29 15:20:29 +03:00
'audit' : audit_dep . found ( ) ,
2020-06-24 14:24:53 +03:00
'bash_completion' : bash_completion_dep . found ( ) ,
2020-06-24 14:25:04 +03:00
'blkid' : blkid_dep . found ( ) ,
2020-06-24 14:25:16 +03:00
'capng' : capng_dep . found ( ) ,
2020-06-24 14:25:26 +03:00
'curl' : curl_dep . found ( ) ,
2020-10-08 14:51:43 +03:00
'devmapper' : devmapper_dep . found ( ) ,
2020-04-29 11:34:31 +03:00
'dlopen' : dlopen_dep . found ( ) ,
2020-07-01 04:10:10 +03:00
'fuse' : fuse_dep . found ( ) ,
2020-06-24 14:26:27 +03:00
'glusterfs' : glusterfs_dep . found ( ) ,
2020-06-24 14:26:48 +03:00
'libiscsi' : libiscsi_dep . found ( ) ,
2020-10-08 14:51:43 +03:00
'libkvm' : libkvm_dep . found ( ) ,
2020-04-29 13:08:33 +03:00
'libnl' : libnl_dep . found ( ) ,
2020-10-08 14:51:43 +03:00
'libparted' : libparted_dep . found ( ) ,
2020-06-24 14:27:03 +03:00
'libpcap' : libpcap_dep . found ( ) ,
2020-06-24 14:27:12 +03:00
'libssh' : libssh_dep . found ( ) ,
2020-04-29 12:07:42 +03:00
'libssh2' : libssh2_dep . found ( ) ,
2020-10-08 14:51:43 +03:00
'libutil' : libutil_dep . found ( ) ,
2021-01-22 00:01:06 +03:00
'netcf' : conf . has ( 'WITH_NETCF' ) ,
2020-06-24 14:27:40 +03:00
'NLS' : have_gnu_gettext_tools ,
2020-08-03 18:17:02 +03:00
'numactl' : numactl_dep . found ( ) ,
2020-04-29 11:18:37 +03:00
'openwsman' : openwsman_dep . found ( ) ,
2020-10-08 14:51:43 +03:00
'parallels-sdk' : parallels_sdk_dep . found ( ) ,
2020-04-30 12:35:51 +03:00
'pciaccess' : pciaccess_dep . found ( ) ,
2020-04-29 12:32:41 +03:00
'polkit' : conf . has ( 'WITH_POLKIT' ) ,
2020-04-29 12:37:40 +03:00
'rbd' : rbd_dep . found ( ) ,
2020-07-29 15:20:43 +03:00
'readline' : readline_dep . found ( ) ,
2020-07-29 15:21:00 +03:00
'sanlock' : conf . has ( 'WITH_SANLOCK' ) ,
2020-07-29 15:21:14 +03:00
'sasl' : sasl_dep . found ( ) ,
2020-07-29 15:21:29 +03:00
'selinux' : selinux_dep . found ( ) ,
2020-07-29 15:21:43 +03:00
'udev' : udev_dep . found ( ) ,
2020-06-24 04:17:42 +03:00
'xdr' : xdr_dep . found ( ) ,
2020-07-29 15:22:23 +03:00
'yajl' : yajl_dep . found ( ) ,
2020-03-02 17:14:14 +03:00
}
summary ( libs_summary , section : 'Libraries' , bool_yn : true )
2020-06-16 23:54:17 +03:00
win_summary = {
'MinGW' : host_machine . system ( ) == 'windows' ,
2020-07-01 04:08:06 +03:00
'windres' : host_machine . system ( ) == 'windows' ,
2020-06-16 23:54:17 +03:00
}
summary ( win_summary , section : 'Windows' , bool_yn : true )
2020-04-30 15:56:21 +03:00
test_summary = {
2020-09-22 16:15:49 +03:00
'Expensive' : use_expensive_tests ,
2020-04-30 15:56:21 +03:00
'Coverage' : coverage_flags . length ( ) > 0 ,
}
summary ( test_summary , section : 'Test suite' , bool_yn : true )
2020-07-24 17:35:03 +03:00
2020-07-24 17:45:58 +03:00
if conf . has ( 'DEFAULT_LOADER_NVRAM' )
loader_res = '@0@ !!! Using this configure option is strongly discouraged !!!' . format ( conf . get_unquoted ( 'DEFAULT_LOADER_NVRAM' ) )
else
loader_res = ''
endif
2020-07-24 17:35:03 +03:00
misc_summary = {
'Warning Flags' : supported_cc_flags ,
2020-10-08 15:39:38 +03:00
'docs' : gen_docs ,
2020-10-08 15:46:03 +03:00
'tests' : build_tests ,
2020-07-24 17:44:59 +03:00
'DTrace' : conf . has ( 'WITH_DTRACE_PROBES' ) ,
2020-10-08 15:10:46 +03:00
'firewalld' : conf . has ( 'WITH_FIREWALLD' ) ,
'firewalld-zone' : conf . has ( 'WITH_FIREWALLD_ZONE' ) ,
'nss' : conf . has ( 'WITH_NSS' ) ,
2020-09-01 14:27:44 +03:00
'numad' : conf . has ( 'WITH_NUMAD' ) ,
2020-07-16 18:36:03 +03:00
'Init script' : init_script ,
2020-07-24 17:43:48 +03:00
'Char device locks' : chrdev_lock_files ,
2020-07-24 17:45:58 +03:00
'Loader/NVRAM' : loader_res ,
2020-10-08 15:10:46 +03:00
'pm_utils' : conf . has ( 'WITH_PM_UTILS' ) ,
2020-07-16 19:09:20 +03:00
'virt-login-shell' : conf . has ( 'WITH_LOGIN_SHELL' ) ,
2020-07-24 17:45:36 +03:00
'virt-host-validate' : conf . has ( 'WITH_HOST_VALIDATE' ) ,
2020-07-01 04:07:37 +03:00
'TLS priority' : conf . get_unquoted ( 'TLS_PRIORITY' ) ,
2020-07-24 17:35:03 +03:00
}
summary ( misc_summary , section : 'Miscellaneous' , bool_yn : true , list_sep : ' ' )
2020-07-29 15:22:10 +03:00
devtools_summary = {
'wireshark_dissector' : wireshark_dep . found ( ) ,
}
summary ( devtools_summary , section : 'Developer Tools' , bool_yn : true )
2020-07-01 04:07:00 +03:00
if conf . has ( 'WITH_QEMU' )
qemu_warn = ''
if qemu_user == 'root'
qemu_warn = ' !!! running QEMU as root is strongly discouraged !!!'
endif
priv_summary = {
'QEMU' : '@0@:@1@@2@' . format ( qemu_user , qemu_group , qemu_warn ) ,
}
summary ( priv_summary , section : 'Privileges' )
endif