summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Heijligen <thomas.heijligen@secunet.com>2022-08-18 12:16:29 +0200
committerThomas Heijligen <src@posteo.de>2022-09-12 07:15:03 +0000
commit3753d29b97cd10abe98846ec48ff4ec1d20baa80 (patch)
tree8fc20db5c272f5c7570bd94d718e8e6bed3b5e1e
parent66dc554d7f72860ccb4cf6fcfd0eb89df9a7564f (diff)
downloadflashrom-3753d29b97cd10abe98846ec48ff4ec1d20baa80.tar.gz
flashrom-3753d29b97cd10abe98846ec48ff4ec1d20baa80.tar.bz2
flashrom-3753d29b97cd10abe98846ec48ff4ec1d20baa80.zip
meson: Refactor the programmer selection
This implements a positive selection choice of which programmers should be built. - Each programmer is represented through an entry in the programmer dictionary - The entry contains: - A list of systems and CPU families where the programmer can run on - A list of required dependencies - A list of sources needed to build the programmer - A list of compiler flags - A flag to determin if the programmer should be build on 'auto' - If an entry is not given it is set to the default value - If a programmer gets selected, an 'active' flag is added to the entry on runtime - All programmers with an 'active' flag will be included in the build - One or more programmers can be selected through '-Dprogrammer=<>' - 'auto' enables all programmers which are available, deps are found and have the 'default' flag - 'all' enables all programmers which are available and deps are found - 'group_***' enables all programmers which are available, deps are found and the programmer belongs to the selected group - '_programmer_name_' forces the programmer to be built or the build will fail. Change-Id: Ib44b26e3748fc71f116184082b4aed0bb208b4c1 Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/63724 Reviewed-by: Anastasia Klimchuk <aklm@chromium.org> Reviewed-by: Felix Singer <felixsinger@posteo.net> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--meson.build717
-rw-r--r--meson_options.txt53
-rw-r--r--platform/meson.build31
-rw-r--r--tests/meson.build4
4 files changed, 463 insertions, 342 deletions
diff --git a/meson.build b/meson.build
index 6b00ec2fd..56ab55c63 100644
--- a/meson.build
+++ b/meson.build
@@ -1,7 +1,7 @@
project('flashromutils', 'c',
version : run_command('util/getversion.sh', '--version', check : true).stdout().strip(),
license : 'GPL-2.0',
- meson_version : '>=0.50.0',
+ meson_version : '>=0.53.0',
default_options : [
'warning_level=2',
'c_std=c99',
@@ -35,46 +35,13 @@ add_project_arguments(cc.get_supported_arguments(warning_flags), language : 'c')
add_project_arguments('-D_DEFAULT_SOURCE', language : 'c')
add_project_arguments('-D_POSIX_C_SOURCE=200809L', language : 'c') # required for fileno, nanosleep, and strndup
add_project_arguments('-D_BSD_SOURCE', language : 'c') # required for glibc < v2.19
+add_project_arguments('-D__BSD_VISIBLE', language : 'c') # required for u_char, u_int, u_long on FreeBSD
+add_project_arguments('-D__XSI_VISIBLE', language : 'c') # required for gettimeofday() on FreeBSD
+add_project_arguments('-D_NETBSD_SOURCE', language : 'c') # required for indirect include of strings.h on NetBSD
+add_project_arguments('-D_DARWIN_C_SOURCE', language : 'c') # required for indirect include of strings.h on MacOS
add_project_arguments('-DFLASHROM_VERSION="' + meson.project_version() + '"', language : 'c')
# get defaults from configure
-config_atahpt = get_option('config_atahpt')
-config_atapromise = get_option('config_atapromise')
-config_atavia = get_option('config_atavia')
-config_buspirate_spi = get_option('config_buspirate_spi')
-config_ch341a_spi = get_option('config_ch341a_spi')
-config_dediprog = get_option('config_dediprog')
-config_developerbox_spi = get_option('config_developerbox_spi')
-config_digilent_spi = get_option('config_digilent_spi')
-config_jlink_spi = get_option('config_jlink_spi')
-config_drkaiser = get_option('config_drkaiser')
-config_dummy = get_option('config_dummy')
-config_ft2232_spi = get_option('config_ft2232_spi')
-config_gfxnvidia = get_option('config_gfxnvidia')
-config_raiden_debug_spi = get_option('config_raiden_debug_spi')
-config_internal = get_option('config_internal')
-config_it8212 = get_option('config_it8212')
-config_linux_mtd = get_option('config_linux_mtd')
-config_linux_spi = get_option('config_linux_spi')
-config_mstarddc_spi = get_option('config_mstarddc_spi')
-config_nic3com = get_option('config_nic3com')
-config_nicintel_eeprom = get_option('config_nicintel_eeprom')
-config_nicintel = get_option('config_nicintel')
-config_nicintel_spi = get_option('config_nicintel_spi')
-config_nicnatsemi = get_option('config_nicnatsemi')
-config_nicrealtek = get_option('config_nicrealtek')
-config_ogp_spi = get_option('config_ogp_spi')
-config_pickit2_spi = get_option('config_pickit2_spi')
-config_pony_spi = get_option('config_pony_spi')
-config_rayer_spi = get_option('config_rayer_spi')
-config_satamv = get_option('config_satamv')
-config_satasii = get_option('config_satasii')
-config_serprog = get_option('config_serprog')
-config_usbblaster_spi = get_option('config_usbblaster_spi')
-config_stlinkv3_spi = get_option('config_stlinkv3_spi')
-config_parade_lspcon = get_option('config_parade_lspcon')
-config_mediatek_i2c_spi = get_option('config_mediatek_i2c_spi')
-config_realtek_mst_i2c_spi = get_option('config_realtek_mst_i2c_spi')
config_print_wiki= get_option('classic_cli_print_wiki')
config_default_programmer_name = get_option('default_programmer_name')
config_default_programmer_args = get_option('default_programmer_args')
@@ -118,51 +85,6 @@ srcs = files(
'writeprotect_ranges.c',
)
-subdir('platform')
-
-host_is_x86 = ['x86', 'x86_64'].contains(host_machine.cpu_family())
-
-need_serial = [
- config_buspirate_spi, config_pony_spi, config_serprog,
-].contains(true)
-need_bitbang_spi = [
- config_internal, config_nicintel_spi, config_ogp_spi,
- config_pony_spi, config_rayer_spi,
-].contains(true)
-need_raw_mem_access = [
- config_atapromise, config_drkaiser, config_gfxnvidia, config_internal,
- config_it8212, config_nicintel, config_nicintel_eeprom, config_nicintel_spi,
- config_ogp_spi, config_satamv, config_satasii,
-].contains(true)
-# Internal programmer uses x86 features if the system is x86
-need_x86_msr = config_internal and host_is_x86
-need_x86_port_io = [
- config_atahpt, config_atapromise, config_internal and host_is_x86,
- config_nic3com, config_nicnatsemi, config_nicrealtek, config_rayer_spi,
- config_satamv,
-].contains(true)
-need_libpci = [
- config_atahpt, config_atapromise, config_atavia,
- config_drkaiser, config_gfxnvidia, config_internal, config_it8212,
- config_nic3com, config_nicintel, config_nicintel_eeprom, config_nicintel_spi,
- config_nicnatsemi, config_nicrealtek, config_ogp_spi, config_satamv,
- config_satasii,
-].contains(true)
-need_libusb1 = [
- config_ch341a_spi, config_dediprog, config_developerbox_spi,
- config_digilent_spi, config_pickit2_spi, config_raiden_debug_spi,
- config_stlinkv3_spi,
-].contains(true)
-need_libftdi1 = [
- config_ft2232_spi, config_usbblaster_spi,
-].contains(true)
-need_libjaylink = config_jlink_spi
-
-if (need_x86_port_io or need_x86_msr) and not host_is_x86
- error('one or more enabled programmer only supports x86 and target is not')
-endif
-
-
# check for required symbols
if cc.has_function('clock_gettime')
add_project_arguments('-DHAVE_CLOCK_GETTIME=1', language : 'c')
@@ -179,237 +101,411 @@ else
add_project_arguments('-DIS_WINDOWS=0', language : 'c')
endif
-# some programmers require libusb
-if get_option('usb')
- srcs += files('usbdev.c', 'usb_device.c')
- deps += dependency('libusb-1.0')
-elif need_libusb1
- error('usb is disabled but one or more enabled programmer requires USB access')
-endif
+systems_hwaccess = [ 'linux', 'openbsd', 'freebsd', 'dragonfly', 'netbsd' ]
+systems_serial = [ 'linux', 'openbsd', 'freebsd', 'dragonfly', 'netbsd', 'darwin' ]
-# some programmers require libpci
-if get_option('pciutils')
- srcs += files('pcidev.c')
- deps += dependency('libpci')
-elif need_libpci
- error('pciutils is disabled but one or more enabled programmer requires PCI access')
-endif
+cpus_port_io = [ 'x86', 'x86_64' ]
-if need_libftdi1
- deps += dependency('libftdi1')
-endif
+group_ftdi = get_option('programmer').contains('group_ftdi')
+group_pci = get_option('programmer').contains('group_pci')
+group_usb = get_option('programmer').contains('group_usb')
+group_i2c = get_option('programmer').contains('group_i2c')
+group_serial = get_option('programmer').contains('group_serial')
+group_jlink = get_option('programmer').contains('group_jlink')
+group_internal = get_option('programmer').contains('group_internal')
+group_external = get_option('programmer').contains('group_external')
-if need_libjaylink
- deps += dependency('libjaylink')
-endif
+libpci = dependency('libpci', required : group_pci, static : (host_machine.system() == 'openbsd' ? true : false)) # On openbsd a static version of libpci is needed to get also -libz
+libusb1 = dependency('libusb-1.0', required : group_usb)
+libftdi1 = dependency('libftdi1', required : group_ftdi)
+libjaylink = dependency('libjaylink', required : group_jlink)
-# set defines for configured programmers
-if config_atahpt
- srcs += files('atahpt.c')
- cargs += '-DCONFIG_ATAHPT=1'
-endif
-if config_atapromise
- srcs += files('atapromise.c')
- cargs += '-DCONFIG_ATAPROMISE=1'
-endif
-if config_atavia
- srcs += files('atavia.c')
- cargs += '-DCONFIG_ATAVIA=1'
-endif
-if config_buspirate_spi
- srcs += files('buspirate_spi.c')
- cargs += '-DCONFIG_BUSPIRATE_SPI=1'
-endif
-if config_ch341a_spi
- srcs += files('ch341a_spi.c')
- cargs += '-DCONFIG_CH341A_SPI=1'
-endif
-if config_dediprog
- srcs += files('dediprog.c')
- cargs += '-DCONFIG_DEDIPROG=1'
-endif
-if config_developerbox_spi
- srcs += files('developerbox_spi.c')
- cargs += '-DCONFIG_DEVELOPERBOX_SPI=1'
-endif
-if config_digilent_spi
- srcs += files('digilent_spi.c')
- cargs += '-DCONFIG_DIGILENT_SPI=1'
-endif
-if config_jlink_spi
- srcs += files('jlink_spi.c')
- cargs += '-DCONFIG_JLINK_SPI=1'
-endif
-if config_drkaiser
- srcs += files('drkaiser.c')
- cargs += '-DCONFIG_DRKAISER=1'
-endif
-if config_dummy
- srcs += files('dummyflasher.c')
- cargs += '-DCONFIG_DUMMY=1'
-endif
-if config_ft2232_spi
- srcs += files('ft2232_spi.c')
- cargs += '-DCONFIG_FT2232_SPI=1'
- cargs += '-DHAVE_FT232H=1'
-endif
-if config_gfxnvidia
- srcs += files('gfxnvidia.c')
- cargs += '-DCONFIG_GFXNVIDIA=1'
-endif
-if config_raiden_debug_spi
- srcs += files('raiden_debug_spi.c')
- cargs += '-DCONFIG_RAIDEN_DEBUG_SPI=1'
+subdir('platform')
+
+if systems_hwaccess.contains(host_machine.system())
+ srcs += files('hwaccess_physmap.c')
+ if ['x86', 'x86_64'].contains(host_machine.cpu_family())
+ srcs += files('hwaccess_x86_msr.c', 'hwaccess_x86_io.c')
+ endif
endif
-if config_internal
- srcs += files(
- 'board_enable.c',
- 'cbtable.c',
- 'chipset_enable.c',
- 'internal.c',
- 'processor_enable.c',
- 'known_boards.c',
- )
- if host_is_x86
- srcs += files(
- 'amd_imc.c',
- 'dmi.c',
- 'ichspi.c',
+
+# Pseudo dependencies
+linux_headers = \
+ cc.has_header('linux/i2c.h') and \
+ cc.has_header('linux/i2c-dev.h') and \
+ cc.has_header('mtd/mtd-user.h') and \
+ cc.has_header('linux/spi/spidev.h') ? declare_dependency() : dependency('', required : false)
+
+# '<programmer_name>' : {
+# 'system' : list[string], # default: ['all']
+# 'cpu_families : list[string], # default: ['all']
+# 'deps' : list[dep], # default: []
+# 'groups : list[boolean], # default: []
+# 'srcs' : list[file], # default: []
+# 'flags' : list[string], # default: []
+# 'default' : boolean, # default: true
+# 'active' : boolean, # added on runtime
+# }
+programmer = {
+ 'atahpt' : {
+ 'systems' : systems_hwaccess,
+ 'cpu_families' : cpus_port_io,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('atahpt.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_ATAHPT=1' ],
+ 'default' : false, # not yet working
+ },
+ 'atapromise' : {
+ 'systems' : systems_hwaccess,
+ 'cpu_families' : cpus_port_io,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('atapromise.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_ATAPROMISE=1' ],
+ 'default' : false,
+ },
+ 'atavia' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('atavia.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_ATAVIA=1' ],
+ },
+ 'buspirate_spi' : {
+ 'systems' : systems_serial,
+ 'groups' : [ group_serial, group_external ],
+ 'srcs' : files('buspirate_spi.c', 'serial.c', (host_machine.system() == 'linux' ? 'custom_baud_linux.c' : 'custom_baud.c')),
+ 'flags' : [ '-DCONFIG_BUSPIRATE_SPI=1' ],
+ },
+ 'ch341a_spi' : {
+ 'deps' : [ libusb1 ],
+ 'groups' : [ group_usb, group_external ],
+ 'srcs' : files('ch341a_spi.c'),
+ 'flags' : [ '-DCONFIG_CH341A_SPI=1' ],
+ },
+ 'dediprog' : {
+ 'deps' : [ libusb1 ],
+ 'groups' : [ group_usb, group_external ],
+ 'srcs' : files('dediprog.c', 'usbdev.c'),
+ 'flags' : [ '-DCONFIG_DEDIPROG=1' ],
+ },
+ 'developerbox_spi' : {
+ 'deps' : [ libusb1 ],
+ 'groups' : [ group_usb, group_external ],
+ 'srcs' : files('developerbox_spi.c', 'usbdev.c'),
+ 'flags' : [ '-DCONFIG_DEVELOPERBOX_SPI=1' ],
+ },
+ 'digilent_spi' : {
+ 'deps' : [ libusb1 ],
+ 'groups' : [ group_usb, group_external ],
+ 'srcs' : files('digilent_spi.c'),
+ 'flags' : [ '-DCONFIG_DIGILENT_SPI=1' ],
+ },
+ 'drkaiser' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('drkaiser.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_DRKAISER=1' ],
+ },
+ 'dummy' : {
+ 'srcs' : files('dummyflasher.c'),
+ 'flags' : [ '-DCONFIG_DUMMY=1' ],
+ },
+ 'ft2232_spi' : {
+ 'deps' : [ libftdi1 ],
+ 'groups' : [ group_ftdi, group_external ],
+ 'srcs' : files('ft2232_spi.c' ),
+ 'flags' : [ '-DCONFIG_FT2232_SPI=1' ],
+ },
+ 'gfxnvidia' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('gfxnvidia.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_GFXNVIDIA=1' ],
+ },
+ 'internal' : {
+ 'systems' : systems_hwaccess + ['linux'],
+ 'cpu_families' : (host_machine.system() == 'linux' ? [host_machine.cpu_family()] : ['x86', 'x86_64']),
+ 'deps' : [ libpci ],
+ 'groups' : [ group_internal ],
+ 'srcs' : (host_machine.cpu_family() in ['x86', 'x86_64'] ? files(
+ 'processor_enable.c',
+ 'chipset_enable.c',
+ 'board_enable.c',
+ 'cbtable.c',
+ 'internal.c',
'it87spi.c',
- 'mcp6x_spi.c',
'sb600spi.c',
+ 'amd_imc.c',
'wbsio_spi.c',
- )
- endif
- cargs += '-DCONFIG_INTERNAL=1'
- if get_option('config_internal_dmi')
- # Use internal DMI/SMBIOS decoder by default instead of relying on dmidecode.
- cargs += '-DCONFIG_INTERNAL_DMI=1'
+ 'mcp6x_spi.c',
+ 'ichspi.c',
+ 'dmi.c',
+ 'pcidev.c',
+ 'known_boards.c',
+ ) : files(
+ 'board_enable.c',
+ 'cbtable.c',
+ 'chipset_enable.c',
+ 'internal.c',
+ 'processor_enable.c',
+ 'pcidev.c',
+ 'known_boards.c',
+ )),
+ 'flags' : [
+ '-DCONFIG_INTERNAL=1',
+ '-DCONFIG_INTERNAL_DMI=' + (get_option('use_internal_dmi') ? '1' : '0'),
+ ]
+ },
+ 'it8212' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('it8212.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_IT8212=1' ],
+ },
+ 'jlink_spi' : {
+ 'deps' : [ libjaylink ],
+ 'groups' : [ group_jlink, group_external ],
+ 'srcs' : files('jlink_spi.c'),
+ 'flags' : [ '-DCONFIG_JLINK_SPI=1' ],
+ 'default' : false,
+ },
+ 'linux_mtd' : {
+ 'systems' : [ 'linux' ],
+ 'deps' : [ linux_headers ],
+ 'groups' : [ group_internal ],
+ 'srcs' : files('linux_mtd.c'),
+ 'flags' : [ '-DCONFIG_LINUX_MTD=1' ],
+ },
+ 'linux_spi' : {
+ 'systems' : [ 'linux' ],
+ 'deps' : [ linux_headers ],
+ # internal / external?
+ 'srcs' : files('linux_spi.c'),
+ 'flags' : [ '-DCONFIG_LINUX_SPI=1' ],
+ },
+ 'parade_lspcon' : {
+ 'systems' : [ 'linux' ],
+ 'deps' : [ linux_headers ],
+ 'groups' : [ group_i2c ],
+ 'srcs' : files('parade_lspcon.c', 'i2c_helper_linux.c'),
+ 'flags' : [ '-DCONFIG_PARADE_LSPCON=1' ],
+ 'default' : false
+ },
+ 'mediatek_i2c_spi' : {
+ 'systems' : [ 'linux' ],
+ 'deps' : [ linux_headers ],
+ 'groups' : [ group_i2c ],
+ 'srcs' : files('mediatek_i2c_spi.c', 'i2c_helper_linux.c'),
+ 'flags' : [ '-DCONFIG_MEDIATEK_I2C_SPI=1' ],
+ 'default' : false,
+ },
+ 'mstarddc_spi' : {
+ 'systems' : [ 'linux' ],
+ 'deps' : [ linux_headers ],
+ 'groups' : [ group_i2c ],
+ 'srcs' : files('mstarddc_spi.c', 'i2c_helper_linux.c'),
+ 'flags' : [ '-DCONFIG_MSTARDDC_SPI=1' ],
+ 'default' : false
+ },
+ 'nic3com' : {
+ 'systems' : systems_hwaccess,
+ 'cpu_families' : cpus_port_io,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('nic3com.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_NIC3COM=1' ],
+ },
+ 'nicintel' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('nicintel.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_NICINTEL=1' ],
+ },
+ 'nicintel_eeprom' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('nicintel_eeprom.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_NICINTEL_EEPROM=1' ],
+ },
+ 'nicintel_spi' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('nicintel_spi.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_NICINTEL_SPI=1' ],
+ },
+ 'nicnatsemi' : {
+ 'systems' : systems_hwaccess,
+ 'cpu_families' : cpus_port_io,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('nicnatsemi.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_NICNATSEMI=1' ],
+ 'default' : false, # not complete nor tested
+ },
+ 'nicrealtek' : {
+ 'systems' : systems_hwaccess,
+ 'cpu_families' : cpus_port_io,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('nicrealtek.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_NICREALTEK=1' ],
+ },
+ 'ogp_spi' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('ogp_spi.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_OGP_SPI=1' ],
+ },
+ 'pickit2_spi' : {
+ 'deps' : [ libusb1 ],
+ 'groups' : [ group_usb, group_external ],
+ 'srcs' : files('pickit2_spi.c'),
+ 'flags' : [ '-DCONFIG_PICKIT2_SPI=1' ],
+ },
+ 'pony_spi' : {
+ 'systems' : systems_serial,
+ 'groups' : [ group_serial, group_external ],
+ 'srcs' : files('pony_spi.c', 'serial.c', (host_machine.system() == 'linux' ? 'custom_baud_linux.c' : 'custom_baud.c')),
+ 'flags' : [ '-DCONFIG_PONY_SPI=1' ],
+ },
+ 'raiden_debug_spi' : {
+ 'deps' : [ libusb1 ],
+ 'groups' : [ group_usb, group_external ],
+ 'srcs' : files('raiden_debug_spi.c', 'usb_device.c'),
+ 'flags' : [ '-DCONFIG_RAIDEN_DEBUG_SPI=1' ],
+ },
+ 'rayer_spi' : {
+ 'systems' : systems_hwaccess,
+ 'cpu_families' : cpus_port_io,
+ 'groups' : [ group_internal ],
+ 'srcs' : files('rayer_spi.c'),
+ 'flags' : [ '-DCONFIG_RAYER_SPI=1' ],
+ },
+ 'realtek_mst_i2c_spi' : {
+ 'systems' : [ 'linux' ],
+ 'deps' : [ linux_headers ],
+ 'groups' : [ group_i2c ],
+ 'srcs' : files('realtek_mst_i2c_spi.c', 'i2c_helper_linux.c'),
+ 'flags' : [ '-DCONFIG_REALTEK_MST_I2C_SPI=1' ],
+ 'default' : false,
+ },
+ 'satamv' : {
+ 'systems' : systems_hwaccess,
+ 'cpu_families' : cpus_port_io,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('satamv.c', 'pcidev.c'),
+ 'flags' : ['-DCONFIG_SATAMV=1'],
+ },
+ 'satasii' : {
+ 'systems' : systems_hwaccess,
+ 'deps' : [ libpci ],
+ 'groups' : [ group_pci, group_internal ],
+ 'srcs' : files('satasii.c', 'pcidev.c'),
+ 'flags' : [ '-DCONFIG_SATASII=1' ],
+ },
+ 'serprog' : {
+ 'systems' : systems_serial,
+ 'groups' : [ group_serial, group_external ],
+ 'srcs' : files('serprog.c', 'serial.c', (host_machine.system() == 'linux' ? 'custom_baud_linux.c' : 'custom_baud.c')),
+ 'flags' : [ '-DCONFIG_SERPROG=1' ],
+ },
+ 'stlinkv3_spi' : {
+ 'deps' : [ libusb1 ],
+ 'groups' : [ group_usb, group_external ],
+ 'srcs' : files('stlinkv3_spi.c', 'usbdev.c'),
+ 'flags' : [ '-DCONFIG_STLINKV3_SPI=1' ],
+ },
+ 'usbblaster_spi' : {
+ 'deps' : [ libftdi1 ],
+ 'groups' : [ group_ftdi, group_external ],
+ 'srcs' : files('usbblaster_spi.c'),
+ 'flags' : [ '-DCONFIG_USBBLASTER_SPI=1' ],
+ },
+}
+
+active_programmer_count = 0
+foreach p_name, p_data : programmer
+ p_data += {
+ 'systems' : p_data.get('systems', ['all']),
+ 'cpu_families' : p_data.get('cpu_families', ['all']),
+ 'deps' : p_data.get('deps', []),
+ 'groups' : p_data.get('groups', []),
+ 'srcs' : p_data.get('srcs', []),
+ 'flags' : p_data.get('flags', []),
+ 'default' : p_data.get('default', true),
+ }
+
+ active = false
+ deps_found = true
+ not_found_dep = ''
+ not_active_message = ''
+ selected_hard = p_name in get_option('programmer')
+ selected_soft = p_data.get('groups').contains(true) or \
+ 'all' in get_option('programmer') or \
+ 'auto' in get_option('programmer') and p_data.get('default')
+ available = (p_data.get('systems').contains('all') or p_data.get('systems').contains(host_machine.system())) \
+ and (p_data.get('cpu_families').contains('all') or p_data.get('cpu_families').contains(host_machine.cpu_family()))
+
+ foreach dep : p_data.get('deps')
+ if not dep.found()
+ deps_found = false
+ not_found_dep = dep.name()
+ break
+ endif
+ endforeach
+
+ if selected_hard
+ if not available
+ error(p_name + ' selected but not supported on this platform')
+ elif not deps_found
+ error(p_name + ' selected but dependency ' + not_found_dep +'not found')
+ else
+ active = true
+ endif
+ elif selected_soft
+ if not available
+ not_active_message = 'Not available on platform'
+ elif not deps_found
+ not_active_message = 'dependency ' + not_found_dep + ' not found'
+ else
+ active = true
+ endif
+ else
+ not_active_message = 'not selected'
endif
-endif
-if config_it8212
- srcs += files('it8212.c')
- cargs += '-DCONFIG_IT8212=1'
-endif
-if config_linux_mtd
- srcs += files('linux_mtd.c')
- cargs += '-DCONFIG_LINUX_MTD=1'
-endif
-if config_linux_spi
- srcs += files('linux_spi.c')
- cargs += '-DCONFIG_LINUX_SPI=1'
-endif
-if config_mstarddc_spi
- srcs += files('mstarddc_spi.c')
- cargs += '-DCONFIG_MSTARDDC_SPI=1'
-endif
-if config_nic3com
- srcs += files('nic3com.c')
- cargs += '-DCONFIG_NIC3COM=1'
-endif
-if config_nicintel
- srcs += files('nicintel.c')
- cargs += '-DCONFIG_NICINTEL=1'
-endif
-if config_nicintel_eeprom
- srcs += files('nicintel_eeprom.c')
- cargs += '-DCONFIG_NICINTEL_EEPROM=1'
-endif
-if config_nicintel_spi
- srcs += files('nicintel_spi.c')
- cargs += '-DCONFIG_NICINTEL_SPI=1'
-endif
-if config_nicnatsemi
- srcs += files('nicnatsemi.c')
- cargs += '-DCONFIG_NICNATSEMI=1'
-endif
-if config_nicrealtek
- srcs += files('nicrealtek.c')
- cargs += '-DCONFIG_NICREALTEK=1'
-endif
-if config_ogp_spi
- srcs += files('ogp_spi.c')
- cargs += '-DCONFIG_OGP_SPI=1'
-endif
-if config_pickit2_spi
- srcs += files('pickit2_spi.c')
- cargs += '-DCONFIG_PICKIT2_SPI=1'
-endif
-if config_pony_spi
- srcs += files('pony_spi.c')
- cargs += '-DCONFIG_PONY_SPI=1'
-endif
-if config_rayer_spi
- srcs += files('rayer_spi.c')
- cargs += '-DCONFIG_RAYER_SPI=1'
-endif
-if config_satamv
- srcs += files('satamv.c')
- cargs += '-DCONFIG_SATAMV=1'
-endif
-if config_satasii
- srcs += files('satasii.c')
- cargs += '-DCONFIG_SATASII=1'
-endif
-if config_serprog
- srcs += files('serprog.c')
- cargs += '-DCONFIG_SERPROG=1'
-endif
-if config_usbblaster_spi
- srcs += files('usbblaster_spi.c')
- cargs += '-DCONFIG_USBBLASTER_SPI=1'
-endif
-if config_stlinkv3_spi
- srcs += files('stlinkv3_spi.c')
- cargs += '-DCONFIG_STLINKV3_SPI=1'
-endif
-if config_parade_lspcon
- srcs += files('parade_lspcon.c')
- cargs += '-DCONFIG_PARADE_LSPCON=1'
-endif
-if config_mediatek_i2c_spi
- srcs += files('mediatek_i2c_spi.c')
- cargs += '-DCONFIG_MEDIATEK_I2C_SPI=1'
-endif
-if config_realtek_mst_i2c_spi
- srcs += files('realtek_mst_i2c_spi.c')
- cargs += '-DCONFIG_REALTEK_MST_I2C_SPI=1'
-endif
-
-# bitbanging SPI infrastructure
-if need_bitbang_spi
- srcs += files('bitbang_spi.c')
- cargs += '-DCONFIG_BITBANG_SPI=1'
-endif
-
-if host_machine.system() == 'linux'
- srcs += files('i2c_helper_linux.c')
-endif
-if need_raw_mem_access
- srcs += files('hwaccess_physmap.c')
-endif
-
-if need_x86_port_io
- srcs += files('hwaccess_x86_io.c')
- cargs += '-D__FLASHROM_HAVE_OUTB__=1'
-endif
+ p_data += {
+ 'active' : active,
+ 'summary' : not_active_message,
+ }
+ programmer += {p_name : p_data}
+ if active
+ active_programmer_count += 1
+ endif
+endforeach
-if need_x86_msr
- srcs += files('hwaccess_x86_msr.c')
+if active_programmer_count == 0
+ error('At least one programmer must be selected')
endif
-# raw serial IO
-if need_serial
- srcs += files('serial.c')
- if host_machine.system() == 'linux'
- srcs += files('custom_baud_linux.c')
- else
- srcs += files('custom_baud.c')
+# add srcs, cargs & deps from active programmer to global srcs, cargs & deps
+foreach p_name, p_data : programmer
+ if p_data.get('active')
+ srcs += p_data.get('srcs')
+ cargs += p_data.get('flags')
+ deps += p_data.get('deps')
endif
-endif
-
-
+endforeach
if config_print_wiki.enabled()
if get_option('classic_cli').disabled()
@@ -436,7 +532,11 @@ install_headers([
include_dir = include_directories('include')
mapfile = 'libflashrom.map'
-vflag = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile)
+if host_machine.system() == 'darwin'
+ vflag = ''
+else
+ vflag = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile)
+endif
libflashrom = both_libraries(
'flashrom',
sources : [
@@ -535,3 +635,18 @@ if get_option('tests').auto() or get_option('tests').enabled()
subdir('tests')
endif
endif
+
+programmer_names_active = []
+programmer_names_not_active = []
+foreach p_name, p_data : programmer
+ if p_data.get('active')
+ programmer_names_active += p_name
+ else
+ programmer_names_not_active += p_name + ' (' + p_data.get('summary', '') + ')'
+ endif
+endforeach
+
+summary({
+ 'active' : [programmer_names_active],
+ 'non active' : [programmer_names_not_active],
+}, section : 'Programmer')
diff --git a/meson_options.txt b/meson_options.txt
index 4ec4aaa84..be56ac7eb 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,47 +1,18 @@
-option('pciutils', type : 'boolean', value : true, description : 'use pciutils')
-option('usb', type : 'boolean', value : true, description : 'use libusb1')
option('classic_cli', type : 'feature', value : 'enabled', description : 'classic flashrom cli binary')
option('classic_cli_print_wiki', type : 'feature', value : 'disabled', description : 'Print Wiki')
option('default_programmer_name', type : 'string', description : 'default programmer')
option('default_programmer_args', type : 'string', description : 'default programmer arguments')
option('ich_descriptors_tool', type : 'feature', value : 'auto', description : 'Build ich_descriptors_tool')
-
-option('config_atahpt', type : 'boolean', value : false, description : 'Highpoint (HPT) ATA/RAID controllers')
-option('config_atapromise', type : 'boolean', value : false, description : 'Promise ATA controller')
-option('config_atavia', type : 'boolean', value : true, description : 'VIA VT6421A LPC memory')
-option('config_buspirate_spi', type : 'boolean', value : true, description : 'Bus Pirate SPI')
-option('config_ch341a_spi', type : 'boolean', value : true, description : 'Winchiphead CH341A')
-option('config_dediprog', type : 'boolean', value : true, description : 'Dediprog SF100')
-option('config_developerbox_spi', type : 'boolean', value : true, description : 'Developerbox emergency recovery')
-option('config_digilent_spi', type : 'boolean', value : true, description : 'Digilent Development board JTAG')
-option('config_jlink_spi', type : 'boolean', value : false, description : 'SEGGER J-Link and compatible devices')
-option('config_drkaiser', type : 'boolean', value : true, description : 'Dr. Kaiser')
-option('config_dummy', type : 'boolean', value : true, description : 'dummy tracing')
-option('config_ft2232_spi', type : 'boolean', value : true, description : 'FT2232 SPI dongles')
-option('config_gfxnvidia', type : 'boolean', value : true, description : 'NVIDIA graphics cards')
-option('config_raiden_debug_spi', type : 'boolean', value : true, description : 'ChromiumOS Servo DUT debug board')
-option('config_internal', type : 'boolean', value : true, description : 'internal/onboard')
-option('config_internal_dmi', type : 'boolean', value : true, description : 'Use internal DMI parser')
-option('config_it8212', type : 'boolean', value : true, description : 'ITE IT8212F PATA')
-option('config_linux_mtd', type : 'boolean', value : true, description : 'Linux MTD interfaces')
-option('config_linux_spi', type : 'boolean', value : true, description : 'Linux spidev interfaces')
-option('config_mstarddc_spi', type : 'boolean', value : false, description : 'MSTAR DDC support')
-option('config_nic3com', type : 'boolean', value : true, description : '3Com NICs')
-option('config_nicintel_eeprom', type : 'boolean', value : true, description : 'EEPROM on Intel NICs')
-option('config_nicintel_spi', type : 'boolean', value : true, description : 'SPI on Intel NICs')
-option('config_nicintel', type : 'boolean', value : true, description : 'Intel NICs')
-option('config_nicnatsemi', type : 'boolean', value : false, description : 'National Semiconductor NICs')
-option('config_nicrealtek', type : 'boolean', value : true, description : 'Realtek NICs')
-option('config_ogp_spi', type : 'boolean', value : true, description : 'SPI on OGP cards')
-option('config_pickit2_spi', type : 'boolean', value : true, description : 'PICkit2 SPI')
-option('config_pony_spi', type : 'boolean', value : true, description : 'PonyProg2000 SPI')
-option('config_rayer_spi', type : 'boolean', value : true, description : 'RayeR SPIPGM')
-option('config_satamv', type : 'boolean', value : true, description : 'Marvell SATA controllers')
-option('config_satasii', type : 'boolean', value : true, description : 'SiI SATA controllers')
-option('config_serprog', type : 'boolean', value : true, description : 'serprog')
-option('config_usbblaster_spi', type : 'boolean', value : true, description : 'Altera USB-Blaster dongles')
-option('config_stlinkv3_spi', type : 'boolean', value : true, description : 'STMicroelectronics STLINK-V3')
-option('config_parade_lspcon', type : 'boolean', value : false, description : 'Parade USB-C to HDMI protocol translator')
-option('config_mediatek_i2c_spi', type : 'boolean', value : false, description : 'MediaTek LCD controller')
-option('config_realtek_mst_i2c_spi', type : 'boolean', value : true, description : 'Realtek MultiStream Transport MST')
option('tests', type : 'feature', value : 'auto', description : 'Build unit tests')
+option('use_internal_dmi', type : 'boolean', value : 'true')
+option('programmer', type : 'array', value : ['auto'], choices : [
+ 'auto', 'all',
+ 'group_internal', 'group_external',
+ 'group_ftdi', 'group_i2c', 'group_jlink', 'group_pci', 'group_serial', 'group_usb',
+ 'atahpt', 'atapromise', 'atavia', 'buspirate_spi', 'ch341a_spi', 'dediprog', 'developerbox_spi',
+ 'digilent_spi', 'drkaiser', 'dummy', 'ft2232_spi', 'gfxnvidia', 'internal', 'it8212', 'jlink_spi',
+ 'linux_mtd', 'linux_spi', 'mediatek_i2c_spi', 'mstarddc_spi', 'nic3com', 'nicintel',
+ 'nicintel_eeprom', 'nicintel_spi', 'nicnatsemi', 'nicrealtek', 'ogp_spi', 'parade_lspcon',
+ 'pickit2_spi', 'pony_spi', 'raiden_debug_spi', 'rayer_spi', 'realtek_mst_i2c_spi', 'satamv',
+ 'satasii', 'serprog', 'stlinkv3_spi', 'usbblaster_spi',
+], description: 'Active programmers')
diff --git a/platform/meson.build b/platform/meson.build
index 5a74cef72..42e85eea4 100644
--- a/platform/meson.build
+++ b/platform/meson.build
@@ -9,3 +9,34 @@ endif
if host_machine.endian() == 'big'
add_project_arguments('-D__FLASHROM_BIG_ENDIAN__=1', language : 'c')
endif
+
+# OpenBSD requires libi386 or libamd64 for I/O port handling
+if host_machine.system() == 'openbsd'
+ if host_machine.cpu_family() == 'x86'
+ libi386 = cc.find_library('i386')
+ deps += libi386
+ elif host_machine.cpu_family() == 'x86_64'
+ libamd64 = cc.find_library('amd64')
+ deps += libamd64
+ endif
+endif
+
+# NetBSD requires libx86 or libx86_64 for I/O port handling
+if host_machine.system() == 'netbsd'
+ if host_machine.cpu_family() == 'x86'
+ libx86 = cc.find_library('x86')
+ deps += libx86
+ elif host_machine.cpu_family() == 'x86_64'
+ libx86_64 = cc.find_library('x86_64')
+ deps += libx86_64
+ endif
+endif
+
+
+# SunOS requires external libraries for network sockets
+# they are used to support serial devices via network
+if host_machine.system() == 'sunos'
+ libsocket = cc.find_library('socket')
+ libnsl = cc.find_library('nsl')
+ deps += [ libsocket, libnsl]
+endif
diff --git a/tests/meson.build b/tests/meson.build
index b629998f0..e4f7c2aa2 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -33,6 +33,10 @@ srcs = [
'chip_wp.c',
]
+if not programmer.get('dummy').get('active')
+ srcs += programmer.get('dummy').get('srcs')
+endif
+
mocks = [
'-Wl,--wrap=strdup',
'-Wl,--wrap=physunmap',