From cb97368328bc68698ab7e58a6d692635dfb1b1c7 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Wed, 19 Dec 2018 11:44:22 +0000 Subject: Add support for the meson build system The fwupd project has to build in all kinds of crazy targets, e.g. for odd endians, odd instruction sets, and in odd ways, e.g. installing with a prefix of /app for projects like flatpak. We also have other "robustness" guarantees and therefore have a comprehensive set of CI tests which enable a lot of warning flags and run linting and static analysis code like Coverity. Rather than hack the Makefile I ported the codebase to use Meson. Meson is a(nother) next-generation build system used by a lot of open source projects ranging from low level libraries to desktop software. As part of the port, I also copied the CONFIG_ logic from the makefile, e.g. Option Current Value Possible Values Description ------ ------------- --------------- ----------- config_atahpt false [true, false] Highpoint (HPT) ATA/RAID controllers config_atapromise false [true, false] Promise ATA controller config_atavia true [true, false] VIA VT6421A LPC memory ... At the moment I'm using the meson port so I can include flashrom as a subproject to fwupd as distros are not yet shipping libflashrom as a shared library. Change-Id: I3d950ece2a0568c09985eab47ddab9df1d0c43a2 Signed-off-by: Richard Hughes Reviewed-on: https://review.coreboot.org/c/flashrom/+/31248 Tested-by: build bot (Jenkins) Reviewed-by: Philipp Deppenwiese Reviewed-by: David Hendricks --- meson.build | 396 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 meson.build (limited to 'meson.build') diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..1923fdfb --- /dev/null +++ b/meson.build @@ -0,0 +1,396 @@ +project('flashromutils', 'c', + version : '1.0', + license : 'GPL-2.0+', + meson_version : '>=0.47.0', + default_options : ['warning_level=2', 'c_std=c99'], +) + +# libtool versioning +lt_current = '1' +lt_revision = '0' +lt_age = '0' +lt_version = '@0@.@1@.@2@'.format(lt_current, lt_age, lt_revision) + +# hide some warnings +warning_flags = [ + '-Wno-unused-parameter', + '-Wno-sign-compare', + '-Wno-address-of-packed-member', + '-Wno-enum-conversion', + '-Wno-missing-field-initializers', + '-Wno-missing-braces', +] + +conf = configuration_data() + +cc = meson.get_compiler('c') +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', language : 'c') # required for fileno +add_project_arguments('-D_BSD_SOURCE', language : 'c') # required for glibc < v2.19 +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_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_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') + +cargs = [] +deps = [] +srcs = [] + +need_libusb0 = false +need_raw_access = false +need_serial = false + +# check for required symbols +if cc.has_function('clock_gettime') + add_project_arguments('-DHAVE_CLOCK_GETTIME=1', language : 'c') +endif +if cc.has_function('strnlen') + add_project_arguments('-DHAVE_STRNLEN=1', language : 'c') +endif +if cc.check_header('sys/utsname.h') + add_project_arguments('-DHAVE_UTSNAME=1', language : 'c') +endif + +# some programmers require libusb +if get_option('usb') + srcs += 'usbdev.c' + deps += dependency('libusb-1.0') +else + config_ch341a_spi = false + config_dediprog = false + config_digilent_spi = false + config_developerbox_spi = false +endif + +# some programmers require libpci +if get_option('pciutils') + srcs += 'pcidev.c' + deps += dependency('libpci') + cargs += '-DNEED_PCI=1' +else + config_atahpt = false + config_atapromise = false + config_atavia = false + config_drkaiser = false + config_gfxnvidia = false + config_internal = false + config_it8212 = false + config_nic3com = false + config_nicintel_eeprom = false + config_nicintel = false + config_nicintel_spi = false + config_nicnatsemi = false + config_nicrealtek = false + config_ogp_spi = false + config_rayer_spi = false + config_satamv = false + config_satasii = false +endif + +# set defines for configured programmers +if config_atahpt + srcs += 'atahpt.c' + cargs += '-DCONFIG_ATAHPT=1' +endif +if config_atapromise + srcs += 'atapromise.c' + cargs += '-DCONFIG_ATAPROMISE=1' +endif +if config_atavia + srcs += 'atavia.c' + cargs += '-DCONFIG_ATAVIA=1' +endif +if config_buspirate_spi + srcs += 'buspirate_spi.c' + cargs += '-DCONFIG_BUSPIRATE_SPI=1' + need_serial = true +endif +if config_ch341a_spi + srcs += 'ch341a_spi.c' + cargs += '-DCONFIG_CH341A_SPI=1' +endif +if config_dediprog + srcs += 'dediprog.c' + cargs += '-DCONFIG_DEDIPROG=1' +endif +if config_developerbox_spi + srcs += 'developerbox_spi.c' + cargs += '-DCONFIG_DEVELOPERBOX_SPI=1' +endif +if config_digilent_spi + srcs += 'digilent_spi.c' + cargs += '-DCONFIG_DIGILENT_SPI=1' +endif +if config_drkaiser + srcs += 'drkaiser.c' + cargs += '-DCONFIG_DRKAISER=1' +endif +if config_dummy + srcs += 'dummyflasher.c' + cargs += '-DCONFIG_DUMMY=1' +endif +if config_ft2232_spi + srcs += 'ft2232_spi.c' + cargs += '-DCONFIG_FT2232_SPI=1' + deps += dependency('libftdi1') + cargs += '-DHAVE_FT232H=1' +endif +if config_gfxnvidia + srcs += 'gfxnvidia.c' + cargs += '-DCONFIG_GFXNVIDIA=1' +endif +if config_internal + srcs += 'board_enable.c' + srcs += 'cbtable.c' + srcs += 'chipset_enable.c' + srcs += 'internal.c' + srcs += 'processor_enable.c' + if target_machine.cpu_family() == 'x86' or target_machine.cpu_family() == 'x86_64' + srcs += 'amd_imc.c' + srcs += 'dmi.c' + srcs += 'ichspi.c' + srcs += 'it85spi.c' + srcs += 'it87spi.c' + srcs += 'mcp6x_spi.c' + srcs += 'sb600spi.c' + srcs += 'wbsio_spi.c' + endif + config_bitbang_spi = true + 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' + endif +endif +if config_it8212 + srcs += 'it8212.c' + cargs += '-DCONFIG_IT8212=1' +endif +if config_linux_mtd + srcs += 'linux_mtd.c' + cargs += '-DCONFIG_LINUX_MTD=1' +endif +if config_linux_spi + srcs += 'linux_spi.c' + cargs += '-DCONFIG_LINUX_SPI=1' +endif +if config_mstarddc_spi + srcs += 'mstarddc_spi.c' + cargs += '-DCONFIG_MSTARDDC_SPI=1' +endif +if config_nic3com + srcs += 'nic3com.c' + cargs += '-DCONFIG_NIC3COM=1' +endif +if config_nicintel + srcs += 'nicintel.c' + cargs += '-DCONFIG_NICINTEL=1' +endif +if config_nicintel_eeprom + srcs += 'nicintel_eeprom.c' + cargs += '-DCONFIG_NICINTEL_EEPROM=1' +endif +if config_nicintel_spi + srcs += 'nicintel_spi.c' + config_bitbang_spi = true + cargs += '-DCONFIG_NICINTEL_SPI=1' +endif +if config_nicnatsemi + srcs += 'nicnatsemi.c' + cargs += '-DCONFIG_NICNATSEMI=1' +endif +if config_nicrealtek + srcs += 'nicrealtek.c' + cargs += '-DCONFIG_NICREALTEK=1' +endif +if config_ogp_spi + config_bitbang_spi = true + srcs += 'ogp_spi.c' + cargs += '-DCONFIG_OGP_SPI=1' +endif +if config_pickit2_spi + srcs += 'pickit2_spi.c' + cargs += '-DCONFIG_PICKIT2_SPI=1' + need_libusb0 = true +endif +if config_pony_spi + srcs += 'pony_spi.c' + need_serial = true + config_bitbang_spi = true + cargs += '-DCONFIG_PONY_SPI=1' +endif +if config_rayer_spi + srcs += 'rayer_spi.c' + config_bitbang_spi = true + need_raw_access = true + cargs += '-DCONFIG_RAYER_SPI=1' +endif +if config_satamv + srcs += 'satamv.c' + cargs += '-DCONFIG_SATAMV=1' +endif +if config_satasii + srcs += 'satasii.c' + cargs += '-DCONFIG_SATASII=1' +endif +if config_serprog + srcs += 'serprog.c' + cargs += '-DCONFIG_SERPROG=1' + need_serial = true +endif +if config_usbblaster_spi + srcs += 'usbblaster_spi.c' + cargs += '-DCONFIG_USBBLASTER_SPI=1' +endif + +# bitbanging SPI infrastructure +if config_bitbang_spi + srcs += 'bitbang_spi.c' + cargs += '-DCONFIG_BITBANG_SPI=1' +endif + +# raw memory, MSR or PCI port I/O access +if need_raw_access + srcs += 'hwaccess.c' + srcs += 'physmap.c' + cargs += '-DNEED_RAW_ACCESS=1' +endif + +# raw serial IO +if need_serial + srcs += 'custom_baud.c' + srcs += 'serial.c' +endif + +# raw deprecated and old USB library +if need_libusb0 + deps += dependency('libusb') +endif + +prefix = get_option('prefix') +sbindir = join_paths(prefix, get_option('sbindir')) +libdir = join_paths(prefix, get_option('libdir')) + +install_headers([ + 'libflashrom.h', + ], +) + +# core modules needed by both the library and the CLI +srcs += '82802ab.c' +srcs += 'at45db.c' +srcs += 'edi.c' +srcs += 'en29lv640b.c' +srcs += 'flashchips.c' +srcs += 'flashrom.c' +srcs += 'fmap.c' +srcs += 'helpers.c' +srcs += 'ich_descriptors.c' +srcs += 'jedec.c' +srcs += 'layout.c' +srcs += 'libflashrom.c' +srcs += 'opaque.c' +srcs += 'print.c' +srcs += 'programmer.c' +srcs += 'sfdp.c' +srcs += 'spi25.c' +srcs += 'spi25_statusreg.c' +srcs += 'spi.c' +srcs += 'sst28sf040.c' +srcs += 'sst49lfxxxc.c' +srcs += 'sst_fwhub.c' +srcs += 'stm50.c' +srcs += 'udelay.c' +srcs += 'w29ee011.c' +srcs += 'w39.c' + +mapfile = 'libflashrom.map' +vflag = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile) +flashrom = shared_library( + 'flashrom', + sources : [ + srcs, + ], + soversion : lt_current, + version : lt_version, + dependencies : [ + deps, + ], + c_args : [ + cargs, + ], + install : true, + link_args : vflag, + link_depends : mapfile, +) + +pkgg = import('pkgconfig') +pkgg.generate( + libraries : flashrom, + version : meson.project_version(), + name : 'libflashrom', + filebase : 'libflashrom', + description : 'libflashrom', +) + +flashrom_dep = declare_dependency( + link_with : flashrom, + include_directories : include_directories('.'), + dependencies : deps +) + +# we can't just link_with libflashrom as we require all the internal symbols... +executable( + 'flashrom', + sources : [ + srcs, + 'cli_classic.c', + 'cli_common.c', + 'cli_output.c', + 'flashrom.c', + ], + dependencies : [ + deps, + ], + c_args : [ + cargs, + '-DSTANDALONE', + '-DCONFIG_DEFAULT_PROGRAMMER=PROGRAMMER_INVALID', + '-DCONFIG_DEFAULT_PROGRAMMER_ARGS=""', + ], + install : true, + install_dir : sbindir, +) + +subdir('util') -- cgit v1.2.3