mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-28 03:07:23 +00:00

This exports FuSecurityAttrs into libfwupdplugin so that we can pass the plugins this object rather than a 'bare' GPtrArray. This greatly simplifies the object ownership, and also allows us to check the object type before adding. In the future we could also check for duplicate appstream IDs or missing properties at insertion time. This change also changes the fu_plugin_add_security_attrs() to not return an error. This forces the plugin to handle the error, storing the failure in the attribute itself. Only the plugin know if a missing file it needs to read indicates a runtime problem or a simple failure to obtain a specific HSI level.
462 lines
14 KiB
Meson
462 lines
14 KiB
Meson
project('fwupd', 'c',
|
|
version : '1.5.0',
|
|
license : 'LGPL-2.1+',
|
|
meson_version : '>=0.47.0',
|
|
default_options : ['warning_level=2', 'c_std=c99'],
|
|
)
|
|
|
|
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('FWUPD_MAJOR_VERSION', fwupd_major_version)
|
|
conf.set('FWUPD_MINOR_VERSION', fwupd_minor_version)
|
|
conf.set('FWUPD_MICRO_VERSION', fwupd_micro_version)
|
|
conf.set_quoted('PACKAGE_VERSION', fwupd_version)
|
|
|
|
# get source version, falling back to package version
|
|
git = find_program('git', required : false)
|
|
if git.found()
|
|
source_version = run_command(git, 'describe').stdout().strip()
|
|
if source_version == ''
|
|
source_version = fwupd_version
|
|
endif
|
|
else
|
|
source_version = fwupd_version
|
|
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 = '2'
|
|
libfwupd_lt_revision = '0'
|
|
libfwupd_lt_age = '0'
|
|
libfwupd_lt_version = '@0@.@1@.@2@'.format(libfwupd_lt_current, libfwupd_lt_age, libfwupd_lt_revision)
|
|
libfwupdplugin_lt_current = '1'
|
|
libfwupdplugin_lt_revision = '0'
|
|
libfwupdplugin_lt_age = '0'
|
|
libfwupdplugin_lt_version = '@0@.@1@.@2@'.format(libfwupdplugin_lt_current, libfwupdplugin_lt_age, libfwupdplugin_lt_revision)
|
|
|
|
# get supported warning flags
|
|
warning_flags = [
|
|
'-Waggregate-return',
|
|
'-Wunused',
|
|
'-Warray-bounds',
|
|
'-Wcast-align',
|
|
'-Wclobbered',
|
|
'-Wdeclaration-after-statement',
|
|
'-Wdiscarded-qualifiers',
|
|
'-Wduplicated-branches',
|
|
'-Wduplicated-cond',
|
|
'-Wempty-body',
|
|
'-Wformat=2',
|
|
'-Wformat-nonliteral',
|
|
'-Wformat-security',
|
|
'-Wformat-signedness',
|
|
'-Wignored-qualifiers',
|
|
'-Wimplicit-function-declaration',
|
|
'-Wincompatible-pointer-types-discards-qualifiers',
|
|
'-Winit-self',
|
|
'-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-address-of-packed-member', # incompatible with g_autoptr()
|
|
'-Wno-unknown-pragmas',
|
|
'-Wno-deprecated-declarations',
|
|
'-Wno-missing-field-initializers',
|
|
'-Wno-strict-aliasing',
|
|
'-Wno-suggest-attribute=format',
|
|
'-Wno-unused-parameter',
|
|
'-Wnull-dereference',
|
|
'-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'
|
|
]
|
|
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
|
|
|
|
# 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',
|
|
]
|
|
foreach arg: test_link_args
|
|
if cc.has_link_argument(arg)
|
|
global_link_args += arg
|
|
endif
|
|
endforeach
|
|
add_global_link_arguments(
|
|
global_link_args,
|
|
language: 'c'
|
|
)
|
|
|
|
# Needed for realpath(), syscall(), cfmakeraw(), etc.
|
|
add_project_arguments('-D_DEFAULT_SOURCE', language : 'c')
|
|
|
|
# do not use deprecated symbols or defines internally
|
|
add_project_arguments('-DFWUPD_DISABLE_DEPRECATED', language : 'c')
|
|
|
|
# needed for symlink() and BYTE_ORDER
|
|
add_project_arguments('-D_BSD_SOURCE', language : 'c')
|
|
add_project_arguments('-D_XOPEN_SOURCE=700', 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')
|
|
else
|
|
datadir = join_paths(prefix, get_option('datadir'))
|
|
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
|
|
localstatedir = join_paths(prefix, get_option('localstatedir'))
|
|
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.45.8')
|
|
giounix = dependency('gio-unix-2.0', version : '>= 2.45.8', required: false)
|
|
if giounix.found()
|
|
conf.set('HAVE_GIO_UNIX', '1')
|
|
endif
|
|
if gio.version().version_compare ('>= 2.55.0')
|
|
conf.set('HAVE_GIO_2_55_0', '1')
|
|
endif
|
|
if build_standalone
|
|
gmodule = dependency('gmodule-2.0')
|
|
if get_option('gudev')
|
|
gudev = dependency('gudev-1.0', version : '>= 232')
|
|
conf.set('HAVE_GUDEV', '1')
|
|
else
|
|
gudev = dependency('', required : false)
|
|
endif
|
|
libxmlb = dependency('xmlb', version : '>= 0.1.13', fallback : ['libxmlb', 'libxmlb_dep'])
|
|
libjcat = dependency('jcat', version : '>= 0.1.0', fallback : ['libjcat', 'libjcat_dep'])
|
|
gusb = dependency('gusb', version : '>= 0.2.9', fallback : ['gusb', 'gusb_dep'])
|
|
sqlite = dependency('sqlite3')
|
|
libarchive = dependency('libarchive')
|
|
endif
|
|
libjsonglib = dependency('json-glib-1.0', version : '>= 1.1.1')
|
|
valgrind = dependency('valgrind', required: false)
|
|
soup = dependency('libsoup-2.4', version : '>= 2.51.92')
|
|
if build_daemon
|
|
polkit = dependency('polkit-gobject-1', version : '>= 0.103')
|
|
if polkit.version().version_compare('>= 0.114')
|
|
conf.set('HAVE_POLKIT_0_114', '1')
|
|
endif
|
|
conf.set_quoted ('POLKIT_ACTIONDIR', polkit.get_pkgconfig_variable('actiondir'))
|
|
udevdir = get_option('udevdir')
|
|
if udevdir == ''
|
|
udev = dependency('udev')
|
|
udevdir = udev.get_pkgconfig_variable('udevdir')
|
|
endif
|
|
endif
|
|
libm = cc.find_library('m', required: false)
|
|
libgcab = dependency('libgcab-1.0', version : '>= 1.0', fallback : ['gcab', 'gcab_dep'])
|
|
gcab = find_program('gcab', required : true)
|
|
bashcomp = dependency('bash-completion', required: false)
|
|
python3 = find_program('python3')
|
|
tpm2tss = dependency('tss2-esys', version : '>= 2.0', required: false)
|
|
if tpm2tss.found()
|
|
conf.set('HAVE_TSS2', '1')
|
|
endif
|
|
|
|
platform_deps = []
|
|
if get_option('default_library') != 'static'
|
|
if host_machine.system() == 'windows'
|
|
platform_deps += cc.find_library('shlwapi')
|
|
endif
|
|
endif
|
|
|
|
if valgrind.found()
|
|
conf.set('HAVE_VALGRIND', '1')
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_redfish')
|
|
efivar = dependency('efivar')
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_altos')
|
|
libelf = dependency('libelf')
|
|
endif
|
|
|
|
if cc.has_header('sys/utsname.h')
|
|
conf.set('HAVE_UTSNAME_H', '1')
|
|
endif
|
|
if cc.has_header('sys/ioctl.h')
|
|
conf.set('HAVE_IOCTL_H', '1')
|
|
endif
|
|
if cc.has_header('sys/errno.h')
|
|
conf.set('HAVE_ERRNO_H', '1')
|
|
endif
|
|
if cc.has_header('poll.h')
|
|
conf.set('HAVE_POLL_H', '1')
|
|
endif
|
|
if cc.has_header('fnmatch.h')
|
|
conf.set('HAVE_FNMATCH_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_header_symbol('locale.h', 'LC_MESSAGES')
|
|
conf.set('HAVE_LC_MESSAGES', '1')
|
|
endif
|
|
if cc.has_function('pwrite', args : '-D_XOPEN_SOURCE')
|
|
conf.set('HAVE_PWRITE', '1')
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_tpm') and not tpm2tss.found()
|
|
error('tss2-esys is required for -Dplugin_tpm=true')
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_uefi')
|
|
cairo = dependency('cairo')
|
|
fontconfig = cc.find_library('fontconfig')
|
|
freetype = cc.find_library('freetype')
|
|
efivar = dependency('efivar', version : '>= 33')
|
|
conf.set_quoted('EFIVAR_LIBRARY_VERSION', efivar.version())
|
|
efiboot = dependency('efiboot')
|
|
objcopy = find_program ('objcopy')
|
|
readelf = find_program ('readelf')
|
|
genpeimg = find_program ('genpeimg', required: false)
|
|
|
|
efi_app_location = join_paths(libexecdir, 'fwupd', 'efi')
|
|
conf.set_quoted ('EFI_APP_LOCATION', efi_app_location)
|
|
|
|
# e.g. could be:
|
|
# * /usr/share/dbxtool for Red Hat
|
|
# * /usr/share/secureboot/updates/dbx for Ubuntu
|
|
efi_dbxdir = get_option('efi_dbxdir')
|
|
if efi_dbxdir != ''
|
|
conf.set_quoted ('FWUPD_EFI_DBXDIR', efi_dbxdir)
|
|
endif
|
|
|
|
efi_arch = host_machine.cpu_family()
|
|
if efi_arch == 'x86'
|
|
EFI_MACHINE_TYPE_NAME = 'ia32'
|
|
gnu_efi_arch = 'ia32'
|
|
elif efi_arch == 'x86_64'
|
|
EFI_MACHINE_TYPE_NAME = 'x64'
|
|
gnu_efi_arch = 'x86_64'
|
|
elif efi_arch == 'arm'
|
|
EFI_MACHINE_TYPE_NAME = 'arm'
|
|
gnu_efi_arch = 'arm'
|
|
elif efi_arch == 'aarch64'
|
|
EFI_MACHINE_TYPE_NAME = 'aa64'
|
|
gnu_efi_arch = 'aarch64'
|
|
else
|
|
EFI_MACHINE_TYPE_NAME = ''
|
|
gnu_efi_arch = ''
|
|
endif
|
|
conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
|
|
r = run_command([python3, 'po/test-deps'])
|
|
if r.returncode() != 0
|
|
error(r.stderr())
|
|
endif
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_dell')
|
|
libsmbios_c = dependency('libsmbios_c', version : '>= 2.4.0')
|
|
efivar = dependency('efivar')
|
|
conf.set('HAVE_DELL', '1')
|
|
if not get_option('plugin_uefi')
|
|
error('plugin_dell also needs plugin_uefi to work')
|
|
endif
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_modem_manager')
|
|
libmm_glib = dependency('mm-glib', version : '>= 1.10.0')
|
|
add_project_arguments('-DMM_REQUIRED_VERSION="1.10.0"', language : 'c')
|
|
libqmi_glib = dependency('qmi-glib', version : '>= 1.22.0')
|
|
add_project_arguments('-DQMI_REQUIRED_VERSION="1.23.1"', language : 'c')
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_nvme')
|
|
if not cc.has_header('linux/nvme_ioctl.h')
|
|
error('NVMe support requires kernel >= 4.4')
|
|
endif
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_synaptics')
|
|
conf.set('HAVE_SYNAPTICS', '1')
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_thunderbolt')
|
|
umockdev = dependency('umockdev-1.0', required: false)
|
|
conf.set('HAVE_THUNDERBOLT', '1')
|
|
endif
|
|
|
|
if build_standalone and get_option('plugin_flashrom')
|
|
libflashrom = dependency('flashrom', fallback : ['flashrom', 'flashrom_dep'])
|
|
endif
|
|
|
|
if build_standalone and get_option('systemd')
|
|
systemd = dependency('systemd', version : '>= 211')
|
|
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_pkgconfig_variable('systemdsystemunitdir')
|
|
systemdsystempresetdir = systemd.get_pkgconfig_variable('systemdsystempresetdir')
|
|
systemd_shutdown_dir = systemd.get_pkgconfig_variable('systemdshutdowndir')
|
|
else
|
|
systemdunitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir', define_variable: ['rootprefix', systemd_root_prefix])
|
|
systemdsystempresetdir = systemd.get_pkgconfig_variable('systemdsystempresetdir', define_variable: ['rootprefix', systemd_root_prefix])
|
|
systemd_shutdown_dir = systemd.get_pkgconfig_variable('systemdshutdowndir', define_variable: ['rootprefix', systemd_root_prefix])
|
|
endif
|
|
endif
|
|
|
|
if build_standalone and get_option('elogind')
|
|
elogind = dependency('libelogind', version : '>= 211')
|
|
conf.set('HAVE_LOGIND' , '1')
|
|
endif
|
|
|
|
if build_standalone and get_option('consolekit')
|
|
conf.set('HAVE_CONSOLEKIT' , '1')
|
|
endif
|
|
|
|
gnome = import('gnome')
|
|
i18n = import('i18n')
|
|
|
|
conf.set_quoted('FWUPD_BINDIR', bindir)
|
|
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'
|
|
plugin_dir = 'fwupd-plugins-3'
|
|
else
|
|
plugin_dir = join_paths(libdir, 'fwupd-plugins-3')
|
|
endif
|
|
conf.set_quoted('FWUPD_PLUGINDIR', plugin_dir)
|
|
endif
|
|
|
|
conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
|
|
conf.set_quoted('PACKAGE_NAME', meson.project_name())
|
|
conf.set_quoted('VERSION', meson.project_version())
|
|
|
|
motd_file = '85-fwupd'
|
|
motd_dir = 'motd.d'
|
|
conf.set_quoted('MOTD_FILE', motd_file)
|
|
conf.set_quoted('MOTD_DIR', motd_dir)
|
|
|
|
configure_file(
|
|
output : 'config.h',
|
|
configuration : conf
|
|
)
|
|
|
|
if build_standalone
|
|
plugin_deps = []
|
|
plugin_deps += libxmlb
|
|
plugin_deps += gio
|
|
plugin_deps += giounix
|
|
plugin_deps += gmodule
|
|
plugin_deps += gusb
|
|
plugin_deps += soup
|
|
plugin_deps += libarchive
|
|
plugin_deps += gudev
|
|
plugin_deps += libjsonglib
|
|
endif
|
|
|
|
root_incdir = include_directories('.')
|
|
|
|
if get_option('gtkdoc')
|
|
gtkdocscan = find_program('gtkdoc-scan', required : true)
|
|
subdir('docs')
|
|
endif
|
|
subdir('libfwupd')
|
|
if build_daemon
|
|
subdir('policy')
|
|
endif
|
|
if build_standalone
|
|
subdir('data')
|
|
subdir('po')
|
|
subdir('libfwupdplugin')
|
|
subdir('src')
|
|
subdir('plugins')
|
|
subdir('contrib')
|
|
endif
|
|
|
|
if get_option('systemd') and build_daemon
|
|
meson.add_install_script('meson_post_install.sh', systemdunitdir, localstatedir)
|
|
endif
|
|
|
|
makensis = find_program('makensis', required : false)
|
|
if makensis.found()
|
|
run_target(
|
|
'makensis',
|
|
command: [
|
|
makensis,
|
|
join_paths(meson.source_root(), 'contrib', 'setup-win32.nsi'),
|
|
])
|
|
endif
|