blob: 3601e2656f65d540a9f9e5dfa87e8073e424a98e [file] [log] [blame]
project(
'fwupd',
'c',
version: '2.0.18',
license: 'LGPL-2.1-or-later',
meson_version: '>=0.63.0', # limited by RHEL-9
default_options: ['warning_level=2', 'c_std=c17'],
)
fwupd_version = meson.project_version()
varr = fwupd_version.split('.')
fwupd_major_version = varr[0]
fwupd_minor_version = varr[1]
fwupd_micro_version = varr[2]
conf = configuration_data()
conf.set('MAJOR_VERSION', fwupd_major_version)
conf.set('MINOR_VERSION', fwupd_minor_version)
conf.set('MICRO_VERSION', fwupd_micro_version)
conf.set_quoted('PACKAGE_VERSION', fwupd_version)
# get source version, falling back to package version
source_version = fwupd_version
git = find_program(
'git',
required: false,
)
tag = false
if git.found()
source_version = run_command(
[git, 'describe'],
check: false,
).stdout().strip()
if source_version == ''
source_version = fwupd_version
endif
tag = run_command(
[git, 'describe', '--exact-match'],
check: false,
).returncode() == 0
endif
conf.set_quoted('SOURCE_VERSION', source_version)
# libtool versioning - this applies to libfwupd
#
# See http://sources.redhat.com/autobook/autobook/autobook_91.html#SEC91 for details
#
# - If interfaces have been changed or added, but binary compatibility
# has been preserved, change:
# CURRENT += 1
# REVISION = 0
# AGE += 1
# - If binary compatibility has been broken (eg removed or changed
# interfaces), change:
# CURRENT += 1
# REVISION = 0
# AGE = 0
# - If the interface is the same as the previous version, but bugs are
# fixed, change:
# REVISION += 1
libfwupd_lt_current = '3'
libfwupd_lt_revision = '0'
libfwupd_lt_age = '0'
libfwupd_lt_version = '@0@.@1@.@2@'.format(
libfwupd_lt_current,
libfwupd_lt_age,
libfwupd_lt_revision,
)
# get supported warning flags
warning_flags = [
'-Wfatal-errors',
'-Waggregate-return',
'-Wunused',
'-Warray-bounds',
'-Wcast-align',
'-Wclobbered',
'-Wdeclaration-after-statement',
'-Wdiscarded-qualifiers',
'-Wduplicated-branches',
'-Wduplicated-cond',
'-Wempty-body',
'-Wfloat-equal',
'-Wformat=2',
'-Wformat-nonliteral',
'-Wformat-security',
'-Wformat-signedness',
'-Wignored-qualifiers',
'-Wimplicit-function-declaration',
'-Wimplicit-int',
'-Wincompatible-pointer-types',
'-Winit-self',
'-Wint-conversion',
'-Wlogical-op',
'-Wmaybe-uninitialized',
'-Wmissing-declarations',
'-Wmissing-format-attribute',
'-Wmissing-include-dirs',
'-Wmissing-noreturn',
'-Wmissing-parameter-type',
'-Wmissing-prototypes',
'-Wnested-externs',
'-Wno-cast-function-type',
'-Wno-deprecated-declarations',
'-Wno-address-of-packed-member', # incompatible with g_autoptr()
'-Wno-unknown-pragmas',
'-Wno-missing-field-initializers',
'-Wno-strict-aliasing',
'-Wno-suggest-attribute=format',
'-Wno-typedef-redefinition',
'-Wno-unknown-warning-option',
'-Wno-unused-parameter',
'-Wno-nonnull-compare',
'-Wno-analyzer-use-of-uninitialized-value', # incompatible with g_autoptr()
'-Wno-analyzer-fd-double-close',
'-Wold-style-definition',
'-Woverride-init',
'-Wpointer-arith',
'-Wredundant-decls',
'-Wreturn-type',
'-Wshadow',
'-Wsign-compare',
'-Wstrict-aliasing',
'-Wstrict-prototypes',
'-Wswitch-default',
'-Wtype-limits',
'-Wundef',
'-Wuninitialized',
'-Wunused-but-set-variable',
'-Wunused-variable',
'-Wvla',
'-Wwrite-strings',
]
static_analysis = get_option('static_analysis') and host_machine.system() != 'windows'
if static_analysis
warning_flags += ['-fanalyzer', '-Wno-analyzer-null-dereference']
endif
cc = meson.get_compiler('c')
add_project_arguments(
cc.get_supported_arguments(warning_flags),
language: 'c',
)
if not meson.is_cross_build()
add_project_arguments(
'-fstack-protector-strong',
language: 'c',
)
endif
if cc.get_id() == 'msvc'
error('MSVC is not supported as it does not support __attribute__((cleanup))')
endif
# ensure tests do not fail because of locale specific decimal separators (e.g. when comparing
# outputs with `diff`)
add_test_setup(
'default',
env: {
'LANG': 'C.UTF-8',
'LC_ALL': 'C.UTF-8',
},
is_default: true,
)
# enable full RELRO where possible
# FIXME: until https://github.com/mesonbuild/meson/issues/1140 is fixed
global_link_args = []
test_link_args = ['-Wl,-z,relro', '-Wl,-z,defs', '-Wl,-z,now', '-Wl,-z,ibt,-z,shstk']
foreach arg : test_link_args
if cc.has_link_argument(arg)
global_link_args += arg
endif
endforeach
add_project_link_arguments(
global_link_args,
language: 'c',
)
add_project_arguments(
'-DFWUPD_COMPILATION',
language: 'c',
)
# Needed for realpath(), syscall(), cfmakeraw(), etc.
add_project_arguments(
'-D_DEFAULT_SOURCE',
language: 'c',
)
# needed for symlink() and BYTE_ORDER
add_project_arguments(
'-D_BSD_SOURCE',
language: 'c',
)
add_project_arguments(
'-D__BSD_VISIBLE',
language: 'c',
)
# needed for memfd_create()
add_project_arguments(
'-D_GNU_SOURCE',
language: 'c',
)
# needed for memmem()
add_project_arguments(
'-D_DARWIN_C_SOURCE=900000',
language: 'c',
)
# sanity check
if get_option('build') == 'all'
build_standalone = true
build_daemon = true
elif get_option('build') == 'standalone'
build_standalone = true
build_daemon = false
elif get_option('build') == 'library'
build_standalone = false
build_daemon = false
endif
prefix = get_option('prefix')
bindir = join_paths(prefix, get_option('bindir'))
libdir = join_paths(prefix, get_option('libdir'))
libexecdir = join_paths(prefix, get_option('libexecdir'))
#this ends up in compiled code, ignore prefix
if host_machine.system() == 'windows'
sysconfdir = get_option('sysconfdir')
localstatedir = get_option('localstatedir')
datadir = get_option('datadir')
installed_test_bindir = get_option('libexecdir')
installed_test_datadir = get_option('datadir')
daemon_dir = get_option('libexecdir')
else
datadir = join_paths(prefix, get_option('datadir'))
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
localstatedir = join_paths(prefix, get_option('localstatedir'))
installed_test_bindir = join_paths(libexecdir, 'installed-tests', meson.project_name())
installed_test_datadir = join_paths(datadir, 'installed-tests', meson.project_name())
daemon_dir = join_paths(libexecdir, 'fwupd')
endif
mandir = join_paths(prefix, get_option('mandir'))
localedir = join_paths(prefix, get_option('localedir'))
diffcmd = find_program('diff')
gio = dependency(
'gio-2.0',
version: '>= 2.68.0',
) # limited by RHEL-9, which has v2.68.4
giounix = dependency(
'gio-unix-2.0',
version: '>= 2.68.0',
required: false,
)
if giounix.found()
conf.set('HAVE_GIO_UNIX', '1')
endif
gmodule = dependency('gmodule-2.0')
if host_machine.system() == 'linux'
conf.set('HAVE_UDEV', '1')
endif
if build_standalone
bluez = get_option('bluez').disable_auto_if(host_machine.system() != 'linux')
if bluez.allowed()
conf.set('HAVE_BLUEZ', '1')
endif
host_cpu = host_machine.cpu_family()
hsi = get_option('hsi').disable_auto_if(host_machine.system() != 'linux').disable_auto_if(
host_cpu != 'x86' and host_cpu != 'x86_64'
).allowed()
if hsi
conf.set('HAVE_HSI', '1')
endif
libxmlb = dependency(
'xmlb',
version: '>= 0.3.19',
fallback: ['libxmlb', 'libxmlb_dep'],
)
if libxmlb.get_variable('zstd') == 'true'
lvfs_metadata_format = 'zst'
elif libxmlb.get_variable('lzma') == 'true'
lvfs_metadata_format = 'xz'
else
lvfs_metadata_format = 'gz'
endif
conf.set_quoted('FU_LVFS_METADATA_FORMAT', lvfs_metadata_format)
# FreeBSD is missing some libusb symbols
libusb = dependency(
'libusb-1.0',
version: '>= 0.1.27',
)
conf.set_quoted('LIBUSB_VERSION', libusb.version())
if cc.has_header_symbol(
'libusb.h',
'libusb_set_option',
dependencies: libusb,
)
conf.set('HAVE_LIBUSB_SET_OPTION', '1')
endif
if cc.has_header_symbol(
'libusb.h',
'libusb_init_context',
dependencies: libusb,
)
conf.set('HAVE_LIBUSB_INIT_CONTEXT', '1')
endif
if cc.has_header_symbol(
'libusb.h',
'libusb_get_parent',
dependencies: libusb,
)
conf.set('HAVE_LIBUSB_GET_PARENT', '1')
endif
if cc.has_header_symbol(
'libusb.h',
'libusb_wrap_sys_device',
dependencies: libusb,
)
conf.set('HAVE_LIBUSB_WRAP_SYS_DEVICE', '1')
endif
readline = dependency(
'readline',
required: get_option('readline'),
)
if readline.found() and get_option('readline').allowed()
conf.set('HAVE_READLINE', '1')
endif
sqlite = dependency('sqlite3')
if sqlite.found()
conf.set('HAVE_SQLITE', '1')
endif
passim = dependency(
'passim',
version: '>= 0.1.6',
required: get_option('passim'),
fallback: ['passim', 'passim_dep'],
)
if passim.found()
conf.set('HAVE_PASSIM', '1')
endif
libarchive = dependency(
'libarchive',
required: get_option('libarchive'),
)
if libarchive.found()
conf.set('HAVE_LIBARCHIVE', '1')
if cc.has_header_symbol('archive.h', 'archive_write_add_filter_zstd')
conf.set('HAVE_LIBARCHIVE_WRITE_ADD_FILTER_ZSTD', '1')
endif
endif
endif
libjcat = dependency(
'jcat',
version: '>= 0.2.0',
fallback: ['libjcat', 'libjcat_dep'],
)
libjsonglib = dependency(
'json-glib-1.0',
version: '>= 1.6.0',
fallback: ['libjsonglib', 'libjsonglib_dep'],
)
libblkid = dependency(
'blkid',
required: get_option('blkid'),
)
if libblkid.found()
conf.set('HAVE_BLKID', '1')
endif
valgrind = dependency(
'valgrind',
required: get_option('valgrind'),
)
libcurl = dependency(
'libcurl',
version: '>= 7.62.0',
)
libdrm = dependency(
'libdrm',
required: get_option('libdrm'),
)
if libdrm.found()
conf.set('HAVE_LIBDRM' , '1')
endif
polkit = dependency(
'polkit-gobject-1',
version: '>= 0.114',
required: get_option('polkit').disable_auto_if(host_machine.system() != 'linux'),
)
if polkit.found()
conf.set('HAVE_POLKIT', '1')
conf.set_quoted(
'POLKIT_ACTIONDIR',
polkit.get_variable(
pkgconfig: 'actiondir'
),
)
endif
if build_daemon
if not polkit.found()
warning('Polkit is disabled, the daemon will allow ALL client actions')
endif
endif
libm = cc.find_library(
'm',
required: false,
)
zlib = dependency('zlib')
libmnl = dependency(
'libmnl',
required: get_option('libmnl'),
)
fs = import('fs')
# look for usb.ids in both of the Debian and Fedora locations,
# and fall back to the system datadir in case we're building in a venv or prefix
vendor_ids_dir = get_option('vendor_ids_dir')
if vendor_ids_dir == ''
vendor_ids_dir = join_paths(datadir, 'misc')
if not fs.is_file(join_paths(vendor_ids_dir, 'usb.ids'))
vendor_ids_dir = join_paths(datadir, 'hwdata')
endif
if not fs.is_file(join_paths(vendor_ids_dir, 'usb.ids'))
vendor_ids_dir = '/usr/share/hwdata'
endif
if not fs.is_file(join_paths(vendor_ids_dir, 'usb.ids'))
vendor_ids_dir = '/usr/local/share/hwdata'
endif
if not fs.is_file(join_paths(vendor_ids_dir, 'usb.ids'))
vendor_ids_dir = '/usr/share/misc'
endif
if not fs.is_file(join_paths(vendor_ids_dir, 'usb.ids'))
vendor_ids_dir = '/usr/local/var/homebrew/linked/usb.ids/share/misc'
endif
if not fs.is_file(join_paths(vendor_ids_dir, 'usb.ids'))
vendor_ids_dir = '/opt/homebrew/share/misc'
endif
if not fs.is_file(join_paths(vendor_ids_dir, 'usb.ids'))
error('could not auto-detect -Dvendor_ids_dir=')
endif
endif
conf.set_quoted('FWUPD_DATADIR_VENDOR_IDS', vendor_ids_dir)
bashcomp = dependency(
'bash-completion',
required: false,
)
python3path = get_option('python')
if python3path == ''
python3 = import('python').find_installation('python3')
else
python3 = find_program(python3path)
endif
gnutls = dependency(
'gnutls',
version: '>= 3.6.0',
required: get_option('gnutls'),
)
if gnutls.found()
conf.set('HAVE_GNUTLS', '1')
endif
lzma = dependency('liblzma')
cbor = dependency(
'libcbor',
version: '>= 0.7.0',
required: get_option('cbor'),
)
if cbor.found()
conf.set('HAVE_CBOR', '1')
if cc.has_header_symbol('cbor.h', 'cbor_set_allocs')
conf.set('HAVE_CBOR_SET_ALLOCS', '1')
endif
endif
platform_deps = []
if get_option('default_library') != 'static'
if host_machine.system() == 'windows'
platform_deps += cc.find_library('shlwapi')
endif
if host_machine.system() == 'freebsd'
platform_deps += dependency('efivar')
platform_deps += dependency(
'libinotify',
required: false,
)
endif
endif
if valgrind.found()
conf.set('HAVE_VALGRIND', '1')
endif
libsystemd = dependency(
'libsystemd',
required: get_option('systemd').disable_auto_if(host_machine.system() != 'linux'),
)
if cc.has_header('sys/auxv.h')
conf.set('HAVE_AUXV_H', '1')
endif
if cc.has_header('sys/utsname.h')
conf.set('HAVE_UTSNAME_H', '1')
endif
if cc.has_header('sys/inotify.h')
conf.set('HAVE_INOTIFY_H', '1')
endif
if cc.has_header('sys/ioctl.h')
conf.set('HAVE_IOCTL_H', '1')
endif
if cc.has_header('termios.h')
conf.set('HAVE_TERMIOS_H', '1')
endif
if cc.has_header('errno.h')
conf.set('HAVE_ERRNO_H', '1')
endif
if cc.has_header('sys/socket.h')
conf.set('HAVE_SOCKET_H', '1')
endif
if cc.has_header('scsi/sg.h')
conf.set('HAVE_SCSI_SG_H', '1')
endif
if cc.has_header('sys/select.h')
conf.set('HAVE_SELECT_H', '1')
endif
if cc.has_header('sys/io.h') and cc.has_function(
'outb',
prefix: '#include <sys/io.h>',
)
conf.set('HAVE_IO_H', '1')
endif
if cc.has_header('linux/ethtool.h')
conf.set('HAVE_ETHTOOL_H', '1')
endif
if cc.has_header('linux/i2c-dev.h')
conf.set('HAVE_I2C_DEV_H', '1')
endif
if cc.has_header('linux/mei.h')
conf.set('HAVE_MEI_H', '1')
endif
if cc.has_header('linux/videodev2.h')
conf.set('HAVE_VIDEODEV2_H', '1')
endif
if cc.has_header('mtd/mtd-user.h')
conf.set('HAVE_MTD_USER_H', '1')
endif
if cc.has_header('linux/hidraw.h')
conf.set('HAVE_HIDRAW_H', '1')
endif
if cc.has_header('sys/mman.h')
conf.set('HAVE_MMAN_H', '1')
endif
if cc.has_header('sys/vfs.h')
conf.set('HAVE_SYS_VFS_H', '1')
endif
if cc.has_header('poll.h')
conf.set('HAVE_POLL_H', '1')
endif
if cc.has_header('kenv.h')
conf.set('HAVE_KENV_H', '1')
endif
if cc.has_header('malloc.h')
conf.set('HAVE_MALLOC_H', '1')
if cc.has_function(
'malloc_trim',
prefix: '#include <malloc.h>',
)
conf.set('HAVE_MALLOC_TRIM', '1')
endif
endif
has_cpuid = cc.has_header_symbol(
'cpuid.h',
'__get_cpuid_count',
required: false,
)
if has_cpuid
conf.set('HAVE_CPUID_H', '1')
endif
if cc.has_function('getuid')
conf.set('HAVE_GETUID', '1')
endif
if cc.has_function('realpath')
conf.set('HAVE_REALPATH', '1')
endif
if cc.has_function('memmem')
conf.set('HAVE_MEMMEM', '1')
endif
if cc.has_function('sigaction')
conf.set('HAVE_SIGACTION', '1')
endif
if cc.has_function('memfd_create')
conf.set('HAVE_MEMFD_CREATE', '1')
endif
if cc.has_function('strerrordesc_np')
conf.set('HAVE_STRERRORDESC_NP', '1')
endif
if cc.has_header_symbol('locale.h', 'LC_MESSAGES')
conf.set('HAVE_LC_MESSAGES', '1')
endif
if cc.has_header('linux/ipmi.h')
conf.set('HAVE_LINUX_IPMI_H', '1')
endif
if cc.has_header_symbol('fcntl.h', 'F_WRLCK')
conf.set('HAVE_WRLCK', '1')
endif
if cc.has_header_symbol('fcntl.h', 'F_OFD_SETLK')
conf.set('HAVE_OFD', '1')
endif
if cc.has_function(
'pwrite',
args: '-D_XOPEN_SOURCE',
)
conf.set('HAVE_PWRITE', '1')
endif
if cc.has_header_symbol('sys/mount.h', 'BLKSSZGET')
conf.set('HAVE_BLKSSZGET', '1')
endif
if host_machine.system() == 'freebsd'
if cc.has_type(
'struct efi_esrt_entry_v1',
prefix: '#include <sys/types.h>\n#include <sys/efiio.h>',
)
conf.set('HAVE_FREEBSD_ESRT', '1')
endif
endif
launchctl = find_program(
'launchctl',
required: host_machine.system() == 'darwin',
)
# this is way less hassle than including TargetConditionals.h and looking for TARGET_OS_MAC=1
if host_machine.system() == 'darwin'
conf.set('HOST_MACHINE_SYSTEM_DARWIN', '1')
summary(
{
'launchctl': launchctl,
'launchd_agent_dir': get_option('launchd_agent_dir'),
},
section: 'Darwin options',
)
endif
# EFI
if build_standalone
efi_app_location = join_paths(libexecdir, 'fwupd', 'efi')
conf.set_quoted('EFI_APP_LOCATION', efi_app_location)
endif
flashrom = get_option('plugin_flashrom').disable_auto_if(host_machine.system() != 'linux')
allow_flashrom = flashrom.allowed()
if build_standalone
libflashrom = dependency(
'flashrom',
fallback: ['flashrom', 'flashrom_dep'],
required: flashrom,
)
if libflashrom.type_name() == 'pkgconfig' and cc.has_function(
'flashrom_set_progress_callback_v2',
dependencies: libflashrom,
)
conf.set('HAVE_FLASHROM_SET_PROGRESS_CALLBACK_V2' , '1')
endif
endif
if libsystemd.found()
systemd = dependency(
'systemd',
version: '>= 249',
required: get_option('systemd'),
)
conf.set('HAVE_SYSTEMD' , '1')
conf.set('HAVE_LOGIND' , '1')
systemd_root_prefix = get_option('systemd_root_prefix')
if systemd_root_prefix == ''
systemdunitdir = systemd.get_variable(
pkgconfig: 'systemdsystemunitdir'
)
systemd_shutdown_dir = systemd.get_variable(
pkgconfig: 'systemdshutdowndir'
)
systemd_modules_load_dir = systemd.get_variable(
pkgconfig: 'modulesloaddir'
)
systemd_sysusers_dir = systemd.get_variable(
pkgconfig: 'sysusersdir'
)
else
systemdunitdir = systemd.get_variable(
pkgconfig: 'systemdsystemunitdir',
pkgconfig_define: ['rootprefix', systemd_root_prefix],
)
systemd_shutdown_dir = systemd.get_variable(
pkgconfig: 'systemdshutdowndir',
pkgconfig_define: ['root_prefix', systemd_root_prefix],
)
systemd_modules_load_dir = systemd.get_variable(
pkgconfig: 'modulesloaddir',
pkgconfig_define: ['root_prefix', systemd_root_prefix],
)
systemd_sysusers_dir = systemd.get_variable(
pkgconfig: 'sysusersdir',
pkgconfig_define: ['root_prefix', systemd_root_prefix],
)
endif
endif
supported_build = get_option('supported_build').disable_auto_if(not tag).allowed()
if supported_build
conf.set('SUPPORTED_BUILD', '1')
endif
gnome = import('gnome')
i18n = import('i18n')
conf.set_quoted('FWUPD_PREFIX', prefix)
conf.set_quoted('FWUPD_BINDIR', bindir)
conf.set_quoted('FWUPD_LIBDIR', libdir)
conf.set_quoted('FWUPD_LIBEXECDIR', libexecdir)
conf.set_quoted('FWUPD_DATADIR', datadir)
conf.set_quoted('FWUPD_LOCALSTATEDIR', localstatedir)
conf.set_quoted('FWUPD_SYSCONFDIR', sysconfdir)
conf.set_quoted('FWUPD_LOCALEDIR', localedir)
if build_standalone
if host_machine.system() == 'windows'
libdir_pkg = bindir
else
libdir_pkg = join_paths(libdir, 'fwupd-@0@'.format(fwupd_version))
endif
conf.set_quoted('FWUPD_LIBDIR_PKG', libdir_pkg)
endif
conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
conf.set_quoted('PACKAGE_NAME', meson.project_name())
conf.set_quoted('VERSION', meson.project_version())
if get_option('dbus_socket_address') != ''
conf.set_quoted('FWUPD_DBUS_SOCKET_ADDRESS', get_option('dbus_socket_address'))
endif
motd_file = '85-fwupd'
motd_dir = 'motd.d'
conf.set_quoted('MOTD_FILE', motd_file)
conf.set_quoted('MOTD_DIR', motd_dir)
conf.set_quoted('FU_DEFAULT_P2P_POLICY', get_option('p2p_policy'))
if get_option('plugin_uefi_capsule_splash')
conf.set('FWUPD_UEFI_CAPSULE_SPLASH_ENABLED', '1')
endif
configure_file(
output: 'config.h',
configuration: conf,
)
libdrm_amdgpu = dependency(
'libdrm_amdgpu',
version: '>= 2.4.113',
required: get_option('libdrm'),
)
protobufc = dependency(
'libprotobuf-c',
required: get_option('protobuf'),
)
protoc = find_program(
'protoc',
'protoc-c',
required: get_option('protobuf'),
)
root_incdir = include_directories('.')
fwupd_gir = []
gir_dep = dependency(
'gobject-introspection-1.0',
required: get_option('introspection'),
)
introspection = get_option('introspection').disable_auto_if(host_machine.system() != 'linux').disable_auto_if(
not gir_dep.found()
)
gidocgen_dep = dependency(
'gi-docgen',
version: '>= 2021.1',
native: true,
fallback: ['gi-docgen', 'dummy_dep'],
required: get_option('docs'),
)
gidocgen_app = find_program(
'gi-docgen',
required: gidocgen_dep.found(),
)
build_docs = gidocgen_dep.found() and gidocgen_app.found() and introspection.allowed()
if build_docs and gidocgen_dep.version().version_compare('< 2022.2')
markdown_version = run_command(
[python3, '-c', 'import markdown; print(markdown.__version__)'],
check: true,
).stdout().strip()
build_docs = get_option('docs').require(
markdown_version.version_compare('>=3.2'),
error_message: 'docs=enabled requires at least markdown >= 3.2',
).allowed()
endif
jinja2 = run_command(
[python3, '-c', 'import jinja2; print(jinja2.__version__)'],
check: true,
)
if jinja2.stderr().strip() != ''
error('Python module jinja2 not found')
endif
# using "meson configure -Db_sanitize=address,undefined" is super useful in finding corruption,
# but it does not work with our GMainContext-abuse tests...
if get_option('b_sanitize') in ['address,undefined', 'address', 'undefined', 'leak']
run_sanitize_unsafe_tests = false
else
run_sanitize_unsafe_tests = true
endif
# take foo.rs and generate foo-struct.c and foo-struct.h files like protobuf_c
rustgen = generator(
python3,
output: ['@BASENAME@-struct.c', '@BASENAME@-struct.h'],
# fake custom target to ensure the generator reruns if these input files change
depends: custom_target(
'rustgen-files-timestamp',
input: files(
'libfwupdplugin/fu-rustgen-enum.c.in',
'libfwupdplugin/fu-rustgen-enum.h.in',
'libfwupdplugin/fu-rustgen-struct.c.in',
'libfwupdplugin/fu-rustgen-struct.h.in',
'libfwupdplugin/fu-rustgen.c.in',
'libfwupdplugin/fu-rustgen.h.in',
'libfwupdplugin/rustgen.py',
),
output: 'rustgen-files-timestamp',
command: [python3, '-c', 'from pathlib import Path\nPath("@OUTPUT@").touch()'],
),
arguments: [
join_paths(meson.project_source_root(), 'libfwupdplugin', 'rustgen.py'),
'@INPUT@',
'@OUTPUT0@',
'@OUTPUT1@',
],
)
dbusmock = run_command(
[python3, '-c', 'import dbusmock; print(dbusmock.__version__)'],
check: false,
)
umockdev_integration_tests = get_option('umockdev_tests') \
.disable_auto_if(not get_option('tests')) \
.disable_auto_if(not introspection.allowed()) \
.disable_auto_if(not run_sanitize_unsafe_tests) \
.disable_auto_if(dbusmock.returncode() != 0)
dependency(
'umockdev-1.0',
required: get_option('umockdev_tests'),
)
if dbusmock.returncode() != 0 and get_option('umockdev_tests').allowed()
warning('python dbusmock not found, umockdev tests will be disabled')
endif
allow_uefi = host_machine.system() in ['linux', 'freebsd'] and \
host_machine.cpu_family() in ['x86', 'x86_64', 'aarch64', 'riscv64', 'loongarch64']
subdir('generate-build')
subdir('libfwupd')
if polkit.found()
subdir('policy')
endif
if build_standalone
man_md = []
md_targets = []
plugin_quirks = []
subdir('libfwupdplugin')
subdir('po')
subdir('contrib')
# common to all plugins
plugin_builtins = []
plugin_incdirs = [root_incdir, fwupd_incdir, fwupdplugin_incdir]
plugin_libs = [fwupd, fwupdplugin]
subdir('plugins')
subdir('src')
subdir('docs')
subdir('data')
# append all the quirks into one big file and gzip it
custom_target(
'builtin-quirk-gz',
input: plugin_quirks,
output: 'builtin.quirk.gz',
command: [generate_quirk_builtin, '@OUTPUT@', '@INPUT@'],
install: true,
install_tag: 'runtime',
install_dir: join_paths(datadir, 'fwupd', 'quirks.d'),
)
endif
if libsystemd.found()
summary(
{
'systemd_unit_user': get_option('systemd_unit_user'),
'systemd unit dir': systemdunitdir,
'systemd shutdown dir': systemd_shutdown_dir,
'systemd modules dir': systemd_modules_load_dir,
'systemd sysusers dir': systemd_sysusers_dir,
},
section: 'systemd options',
)
endif
summary(
{
'fwupdtool': build_standalone,
'fwupd (daemon)': build_daemon,
},
section: 'build targets',
)
summary(
{
'cbor': cbor,
'dbus_socket_address': get_option('dbus_socket_address'),
'vendor_ids_dir': vendor_ids_dir,
'docs': build_docs,
'gnutls': gnutls,
'introspection': introspection.allowed(),
'libblkid': libblkid,
'libdrm': libdrm,
'valgrind': valgrind,
'polkit': polkit,
'python3': python3,
'supported_build': supported_build,
'static_analysis': static_analysis,
'tests': get_option('tests'),
'umockdev_tests': umockdev_integration_tests.allowed(),
},
section: 'project features',
)
if build_daemon
summary(
{
'bluez': bluez.allowed(),
'libusb': libusb,
'hsi': hsi,
'lvfs_metadata_format': lvfs_metadata_format,
'libarchive': libarchive.found(),
'passim': passim,
'GPG support': supported_gpg,
'PKCS7 support': supported_pkcs7,
},
section: 'daemon features',
)
en = []
dis = []
foreach plugin : plugins.keys()
if plugins[plugin]
en += plugin
else
dis += plugin
endif
endforeach
summary(
{
'enabled': ', '.join(en),
'disabled': ', '.join(dis),
},
section: 'plugins',
)
endif