From 3e04f1517914b399551daa21f1b1b5e0c6f15797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 1 Jul 2026 13:56:44 +0200 Subject: [PATCH] build: Use a dict to define drivers build info We used multiple arrays, making things more complicated than we should with current meson --- libfprint/meson.build | 3 +- meson.build | 167 ++++++++++++++++-------------------------- 2 files changed, 67 insertions(+), 103 deletions(-) diff --git a/libfprint/meson.build b/libfprint/meson.build index 093b9328..19451d2f 100644 --- a/libfprint/meson.build +++ b/libfprint/meson.build @@ -1,7 +1,7 @@ spi_sources = [] spi_headers = [] -if enabled_spi_drivers.length() > 0 +if have_spi spi_headers = ['fpi-spi-transfer.h'] spi_sources = ['fpi-spi-transfer.c'] endif @@ -146,6 +146,7 @@ helper_sources = { 'aesx660': files('drivers/aesx660.c'), 'aes3k': files('drivers/aes3k.c'), 'openssl': files(), + 'pixman': files(), 'udev': files(), 'virtual': files('drivers/virtual-device-listener.c'), } diff --git a/meson.build b/meson.build index 538415ad..adf1f56d 100644 --- a/meson.build +++ b/meson.build @@ -109,81 +109,60 @@ have_spi = host_machine.system() == 'linux' # Drivers drivers = get_option('drivers').split(',') -virtual_drivers = [ - 'virtual_image', - 'virtual_device', - 'virtual_device_storage', -] -default_drivers = [ - 'upektc_img', - 'vfs5011', - 'vfs7552', - 'aes3500', - 'aes4000', - 'aes1610', - 'aes1660', - 'aes2660', - 'aes2501', - 'aes2550', - 'vfs101', - 'vfs301', - 'vfs0050', - 'etes603', - 'egis0570', - 'egismoc', - 'egis_etu905', - 'vcom5s', - 'synaptics', - 'elan', - 'elanmoc', - 'uru4000', - 'upektc', - 'upeksonly', - 'upekts', - 'goodixmoc', - 'nb1010', - 'fpcmoc', - 'realtek', - 'focaltech_moc', - 'mafpmoc', - 'secugen', -] +drivers_info = { + 'upektc_img': {}, + 'vfs5011': { 'endian_dependent': true }, + 'vfs7552': {}, + 'aes3500': { 'helper': ['aeslib', 'aes3k', 'pixman'] }, + 'aes4000': { 'helper': ['aeslib', 'aes3k', 'pixman'] }, + 'aes1610': { 'helper': ['aeslib'] }, + 'aes1660': { 'helper': ['aeslib', 'aesx660'] }, + 'aes2660': { 'helper': ['aeslib', 'aesx660'] }, + 'aes2501': { 'helper': ['aeslib'], 'endian_dependent': true }, + 'aes2550': { 'helper': ['aeslib'] }, + 'vfs101': {}, + 'vfs301': { 'endian_dependent': true }, + 'vfs0050': { 'endian_dependent': true }, + 'etes603': {}, + 'egis0570': {}, + 'egismoc': {}, + 'egis_etu905': {}, + 'vcom5s': {}, + 'synaptics': {}, + 'elan': { 'endian_dependent': true }, + 'elanmoc': {}, + 'uru4000': { 'helper': ['openssl'], 'endian_dependent': true }, + 'upektc': {}, + 'upeksonly': {}, + 'upekts': {}, + 'goodixmoc': { 'endian_dependent': true }, + 'nb1010': {}, + 'fpcmoc': { 'endian_dependent': true }, + 'realtek': {}, + 'focaltech_moc': {}, + 'mafpmoc': { 'endian_dependent': true }, + 'secugen': { 'endian_dependent': true }, -spi_drivers = [ - 'elanspi' -] + # SPI driver (non-optional if SPI is available) + 'elanspi': { 'spi': true, 'helper': ['udev'], 'optional': not have_spi, 'endian_dependent': true }, -if have_spi - default_drivers += spi_drivers -endif + # Virtual drivers (test-only, optional) + 'virtual_image': { 'virtual': true, 'helper': ['virtual'], 'optional': true }, + 'virtual_device': { 'virtual': true, 'helper': ['virtual'], 'optional': true }, + 'virtual_device_storage': { 'virtual': true, 'helper': ['virtual'], 'optional': true }, +} -# FIXME: All the drivers should be fixed by adjusting the byte order. -# See https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/236 -endian_independent_drivers = virtual_drivers + [ - 'aes1610', - 'aes1660', - 'aes2550', - 'aes2660', - 'aes3500', - 'aes4000', - 'egis0570', - 'egismoc', - 'egis_etu905', - 'elanmoc', - 'etes603', - 'focaltech_moc', - 'nb1010', - 'realtek', - 'synaptics', - 'upeksonly', - 'upektc', - 'upektc_img', - 'upekts', - 'vcom5s', - 'vfs101', - 'vfs7552', -] +default_drivers = [] +virtual_drivers = [] +foreach name, info : drivers_info + if not info.get('optional', false) + default_drivers += name + endif + if info.get('virtual', false) + virtual_drivers += name + endif +endforeach all_drivers = default_drivers + virtual_drivers @@ -195,36 +174,18 @@ if drivers == [ 'default' ] drivers = default_drivers endif -enabled_spi_drivers = [] -foreach driver : spi_drivers - if driver in drivers - enabled_spi_drivers += driver - endif -endforeach - -if enabled_spi_drivers.length() > 0 and not have_spi - error('SPI drivers @0@ are not supported'.format(enabled_spi_drivers)) +if not have_spi + foreach driver: drivers + if drivers_info[driver].get('spi', false) + error('SPI driver @0@ is not supported'.format(driver)) + endif + endforeach endif -driver_helper_mapping = { - 'aes1610' : [ 'aeslib' ], - 'aes1660' : [ 'aeslib', 'aesx660' ], - 'aes2501' : [ 'aeslib' ], - 'aes2550' : [ 'aeslib' ], - 'aes2660' : [ 'aeslib', 'aesx660' ], - 'aes3500' : [ 'aeslib', 'aes3k' ], - 'aes4000' : [ 'aeslib', 'aes3k' ], - 'uru4000' : [ 'openssl' ], - 'elanspi' : [ 'udev' ], - 'virtual_image' : [ 'virtual' ], - 'virtual_device' : [ 'virtual' ], - 'virtual_device_storage' : [ 'virtual' ], -} - driver_helpers = [] foreach driver : drivers - if driver in driver_helper_mapping - foreach helper : driver_helper_mapping[driver] + if driver in drivers_info + foreach helper : drivers_info[driver].get('helper', []) if helper not in driver_helpers driver_helpers += helper endif @@ -256,14 +217,14 @@ optional_deps = [] # Resolve extra dependencies foreach i : driver_helpers - foreach d, helpers : driver_helper_mapping - if i in helpers - driver = d + foreach name, info : drivers_info + if i in info.get('helper', []) + driver = name break endif endforeach - if i == 'aes3k' + if i == 'pixman' imaging_dep = dependency('pixman-1', required: false) if not imaging_dep.found() error('pixman is required for @0@ and possibly others'.format(driver)) @@ -304,9 +265,11 @@ if install_udev_rules endif endif +# FIXME: All the drivers should be fixed by adjusting the byte order. +# See https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/236 supported_drivers = [] foreach driver: drivers - if build_machine.endian() == 'little' or driver in endian_independent_drivers + if build_machine.endian() == 'little' or not drivers_info[driver].get('endian_dependent', false) supported_drivers += driver else warning('Driver @0@ is not supported by big endian cpu @1@. Please, fix it!'.format(