blob: 09572a34a13c3b30f744c973fa82915b8a1aaaa9 [file] [log] [blame]
Richard Hughescb973682018-12-19 11:44:22 +00001project('flashromutils', 'c',
Samuel R. Messner21bcfa92022-02-17 06:17:31 +01002 version : run_command('util/getversion.sh', '--version').stdout().strip(),
Nico Huberb417c0c2019-09-24 22:12:40 +02003 license : 'GPL-2.0',
Angel Pons30649432021-01-26 10:21:46 +01004 meson_version : '>=0.50.0',
Richard Hughescb973682018-12-19 11:44:22 +00005 default_options : ['warning_level=2', 'c_std=c99'],
6)
7
8# libtool versioning
9lt_current = '1'
10lt_revision = '0'
11lt_age = '0'
12lt_version = '@0@.@1@.@2@'.format(lt_current, lt_age, lt_revision)
13
Jacob Garber4a84ec22019-07-25 19:12:31 -060014# hide/enable some warnings
Richard Hughescb973682018-12-19 11:44:22 +000015warning_flags = [
Jacob Garber4a84ec22019-07-25 19:12:31 -060016 '-Wwrite-strings',
Richard Hughescb973682018-12-19 11:44:22 +000017 '-Wno-unused-parameter',
Richard Hughescb973682018-12-19 11:44:22 +000018 '-Wno-address-of-packed-member',
19 '-Wno-enum-conversion',
Richard Hughescb973682018-12-19 11:44:22 +000020 '-Wno-missing-braces',
21]
22
23conf = configuration_data()
24
25cc = meson.get_compiler('c')
26add_project_arguments(cc.get_supported_arguments(warning_flags), language : 'c')
27add_project_arguments('-D_DEFAULT_SOURCE', language : 'c')
Rosen Penev566193f2020-07-18 12:50:16 -070028add_project_arguments('-D_POSIX_C_SOURCE=200809L', language : 'c') # required for fileno, nanosleep, and strndup
Richard Hughescb973682018-12-19 11:44:22 +000029add_project_arguments('-D_BSD_SOURCE', language : 'c') # required for glibc < v2.19
30add_project_arguments('-DFLASHROM_VERSION="' + meson.project_version() + '"', language : 'c')
31
Thomas Heijligen847d94b2021-10-12 17:38:01 +020032if host_machine.system() in ['cygwin', 'windows']
33 add_project_arguments('-DIS_WINDOWS=1', language : 'c')
34else
35 add_project_arguments('-DIS_WINDOWS=0', language : 'c')
36endif
37
Richard Hughescb973682018-12-19 11:44:22 +000038# get defaults from configure
39config_atahpt = get_option('config_atahpt')
40config_atapromise = get_option('config_atapromise')
41config_atavia = get_option('config_atavia')
42config_buspirate_spi = get_option('config_buspirate_spi')
43config_ch341a_spi = get_option('config_ch341a_spi')
44config_dediprog = get_option('config_dediprog')
45config_developerbox_spi = get_option('config_developerbox_spi')
46config_digilent_spi = get_option('config_digilent_spi')
Jean THOMASe28d8e42022-10-11 17:54:30 +020047config_dirtyjtag_spi = get_option('config_dirtyjtag_spi')
Richard Hughescb973682018-12-19 11:44:22 +000048config_drkaiser = get_option('config_drkaiser')
49config_dummy = get_option('config_dummy')
50config_ft2232_spi = get_option('config_ft2232_spi')
51config_gfxnvidia = get_option('config_gfxnvidia')
52config_internal = get_option('config_internal')
53config_it8212 = get_option('config_it8212')
Marc Schink7ec2d632020-12-08 22:20:50 +010054config_jlink_spi = get_option('config_jlink_spi')
Richard Hughescb973682018-12-19 11:44:22 +000055config_linux_mtd = get_option('config_linux_mtd')
56config_linux_spi = get_option('config_linux_spi')
57config_mstarddc_spi = get_option('config_mstarddc_spi')
58config_nic3com = get_option('config_nic3com')
59config_nicintel_eeprom = get_option('config_nicintel_eeprom')
60config_nicintel = get_option('config_nicintel')
61config_nicintel_spi = get_option('config_nicintel_spi')
62config_nicnatsemi = get_option('config_nicnatsemi')
63config_nicrealtek = get_option('config_nicrealtek')
64config_ogp_spi = get_option('config_ogp_spi')
65config_pickit2_spi = get_option('config_pickit2_spi')
66config_pony_spi = get_option('config_pony_spi')
67config_rayer_spi = get_option('config_rayer_spi')
68config_satamv = get_option('config_satamv')
69config_satasii = get_option('config_satasii')
70config_serprog = get_option('config_serprog')
71config_usbblaster_spi = get_option('config_usbblaster_spi')
Miklós Márton324929c2019-08-01 19:14:10 +020072config_stlinkv3_spi = get_option('config_stlinkv3_spi')
Thomas Heijligen84e9c912021-06-01 16:22:14 +020073config_default_programmer_name = get_option('default_programmer_name')
74config_default_programmer_args = get_option('default_programmer_args')
Daniel Campellof7a84fd2021-03-16 17:17:14 -060075config_print_wiki= get_option('print_wiki')
Richard Hughescb973682018-12-19 11:44:22 +000076
77cargs = []
78deps = []
79srcs = []
80
Peter Marheine306c8b72022-01-21 02:07:30 +000081host_is_x86 = ['x86', 'x86_64'].contains(host_machine.cpu_family())
82
83need_serial = [
84 config_buspirate_spi, config_pony_spi, config_serprog,
85].contains(true)
86need_bitbang_spi = [
87 config_internal, config_nicintel_spi, config_ogp_spi,
88 config_pony_spi, config_rayer_spi,
89].contains(true)
90need_raw_mem_access = [
91 config_atapromise, config_drkaiser, config_gfxnvidia, config_internal,
92 config_it8212, config_nicintel, config_nicintel_eeprom, config_nicintel_spi,
93 config_ogp_spi, config_satamv, config_satasii,
94].contains(true)
95# Internal programmer uses x86 features if the system is x86
96need_x86_msr = config_internal and host_is_x86
97need_x86_port_io = [
98 config_atahpt, config_atapromise, config_internal and host_is_x86,
99 config_nic3com, config_nicnatsemi, config_nicrealtek, config_rayer_spi,
100 config_satamv,
101].contains(true)
102need_libpci = [
103 config_atahpt, config_atapromise, config_atavia,
104 config_drkaiser, config_gfxnvidia, config_internal, config_it8212,
105 config_nic3com, config_nicintel, config_nicintel_eeprom, config_nicintel_spi,
106 config_nicnatsemi, config_nicrealtek, config_ogp_spi, config_satamv,
107 config_satasii,
108].contains(true)
109need_libusb1 = [
110 config_ch341a_spi, config_dediprog, config_developerbox_spi,
111 config_digilent_spi, config_dirtyjtag_spi, config_pickit2_spi,
112 config_stlinkv3_spi,
113].contains(true)
114need_libftdi1 = [
115 config_ft2232_spi, config_usbblaster_spi,
116].contains(true)
117need_libjaylink = config_jlink_spi
118
119if (need_x86_port_io or need_x86_msr) and not host_is_x86
120 error('one or more enabled programmer only supports x86 and target is not')
121endif
122
Richard Hughescb973682018-12-19 11:44:22 +0000123
124# check for required symbols
125if cc.has_function('clock_gettime')
126 add_project_arguments('-DHAVE_CLOCK_GETTIME=1', language : 'c')
127endif
128if cc.has_function('strnlen')
129 add_project_arguments('-DHAVE_STRNLEN=1', language : 'c')
130endif
131if cc.check_header('sys/utsname.h')
132 add_project_arguments('-DHAVE_UTSNAME=1', language : 'c')
133endif
134
Thomas Heijligen5194d582022-02-19 22:31:32 +0100135srcs += 'platform/memaccess.c'
136
Thomas Heijligen5618d5b2022-02-19 21:17:44 +0100137if host_machine.endian() == 'little'
Thomas Heijligenc92f94b2022-03-17 13:41:17 +0100138 srcs += 'platform/endian_little.c'
Thomas Heijligen5618d5b2022-02-19 21:17:44 +0100139 add_project_arguments('-D__FLASHROM_LITTLE_ENDIAN__=1', language : 'c')
140endif
141if host_machine.endian() == 'big'
Thomas Heijligenc92f94b2022-03-17 13:41:17 +0100142 srcs += 'platform/endian_big.c'
Thomas Heijligen5618d5b2022-02-19 21:17:44 +0100143 add_project_arguments('-D__FLASHROM_BIG_ENDIAN__=1', language : 'c')
144endif
145
Richard Hughescb973682018-12-19 11:44:22 +0000146# some programmers require libusb
147if get_option('usb')
148 srcs += 'usbdev.c'
149 deps += dependency('libusb-1.0')
Peter Marheine306c8b72022-01-21 02:07:30 +0000150elif need_libusb1
151 error('usb is disabled but one or more enabled programmer requires USB access')
Richard Hughescb973682018-12-19 11:44:22 +0000152endif
153
154# some programmers require libpci
155if get_option('pciutils')
156 srcs += 'pcidev.c'
157 deps += dependency('libpci')
158 cargs += '-DNEED_PCI=1'
Peter Marheine306c8b72022-01-21 02:07:30 +0000159elif need_libpci
160 error('pciutils is disabled but one or more enabled programmer requires PCI access')
161endif
162
163if need_libftdi1
164 deps += dependency('libftdi1')
165endif
166
167if need_libjaylink
168 deps += dependency('libjaylink')
Richard Hughescb973682018-12-19 11:44:22 +0000169endif
170
171# set defines for configured programmers
172if config_atahpt
173 srcs += 'atahpt.c'
174 cargs += '-DCONFIG_ATAHPT=1'
175endif
176if config_atapromise
177 srcs += 'atapromise.c'
178 cargs += '-DCONFIG_ATAPROMISE=1'
179endif
180if config_atavia
181 srcs += 'atavia.c'
182 cargs += '-DCONFIG_ATAVIA=1'
183endif
184if config_buspirate_spi
185 srcs += 'buspirate_spi.c'
186 cargs += '-DCONFIG_BUSPIRATE_SPI=1'
Richard Hughescb973682018-12-19 11:44:22 +0000187endif
188if config_ch341a_spi
189 srcs += 'ch341a_spi.c'
190 cargs += '-DCONFIG_CH341A_SPI=1'
191endif
192if config_dediprog
193 srcs += 'dediprog.c'
194 cargs += '-DCONFIG_DEDIPROG=1'
195endif
196if config_developerbox_spi
197 srcs += 'developerbox_spi.c'
198 cargs += '-DCONFIG_DEVELOPERBOX_SPI=1'
199endif
200if config_digilent_spi
201 srcs += 'digilent_spi.c'
202 cargs += '-DCONFIG_DIGILENT_SPI=1'
203endif
Jean THOMASe28d8e42022-10-11 17:54:30 +0200204if config_dirtyjtag_spi
205 srcs += 'dirtyjtag_spi.c'
206 cargs += '-DCONFIG_DIRTYJTAG_SPI=1'
207endif
Richard Hughescb973682018-12-19 11:44:22 +0000208if config_drkaiser
209 srcs += 'drkaiser.c'
210 cargs += '-DCONFIG_DRKAISER=1'
211endif
212if config_dummy
213 srcs += 'dummyflasher.c'
214 cargs += '-DCONFIG_DUMMY=1'
215endif
216if config_ft2232_spi
217 srcs += 'ft2232_spi.c'
218 cargs += '-DCONFIG_FT2232_SPI=1'
Richard Hughescb973682018-12-19 11:44:22 +0000219 cargs += '-DHAVE_FT232H=1'
220endif
221if config_gfxnvidia
222 srcs += 'gfxnvidia.c'
223 cargs += '-DCONFIG_GFXNVIDIA=1'
224endif
225if config_internal
226 srcs += 'board_enable.c'
227 srcs += 'cbtable.c'
228 srcs += 'chipset_enable.c'
229 srcs += 'internal.c'
230 srcs += 'processor_enable.c'
Peter Marheine306c8b72022-01-21 02:07:30 +0000231 if host_is_x86
Richard Hughescb973682018-12-19 11:44:22 +0000232 srcs += 'amd_imc.c'
233 srcs += 'dmi.c'
234 srcs += 'ichspi.c'
Richard Hughescb973682018-12-19 11:44:22 +0000235 srcs += 'it87spi.c'
236 srcs += 'mcp6x_spi.c'
237 srcs += 'sb600spi.c'
238 srcs += 'wbsio_spi.c'
239 endif
Richard Hughescb973682018-12-19 11:44:22 +0000240 cargs += '-DCONFIG_INTERNAL=1'
241 if get_option('config_internal_dmi')
242 # Use internal DMI/SMBIOS decoder by default instead of relying on dmidecode.
243 cargs += '-DCONFIG_INTERNAL_DMI=1'
244 endif
245endif
246if config_it8212
247 srcs += 'it8212.c'
248 cargs += '-DCONFIG_IT8212=1'
249endif
Marc Schink7ec2d632020-12-08 22:20:50 +0100250if config_jlink_spi
251 srcs += 'jlink_spi.c'
252 cargs += '-DCONFIG_JLINK_SPI=1'
Marc Schink7ec2d632020-12-08 22:20:50 +0100253endif
Richard Hughescb973682018-12-19 11:44:22 +0000254if config_linux_mtd
255 srcs += 'linux_mtd.c'
256 cargs += '-DCONFIG_LINUX_MTD=1'
257endif
258if config_linux_spi
259 srcs += 'linux_spi.c'
260 cargs += '-DCONFIG_LINUX_SPI=1'
261endif
262if config_mstarddc_spi
263 srcs += 'mstarddc_spi.c'
264 cargs += '-DCONFIG_MSTARDDC_SPI=1'
265endif
266if config_nic3com
267 srcs += 'nic3com.c'
268 cargs += '-DCONFIG_NIC3COM=1'
269endif
270if config_nicintel
271 srcs += 'nicintel.c'
272 cargs += '-DCONFIG_NICINTEL=1'
273endif
274if config_nicintel_eeprom
275 srcs += 'nicintel_eeprom.c'
276 cargs += '-DCONFIG_NICINTEL_EEPROM=1'
277endif
278if config_nicintel_spi
279 srcs += 'nicintel_spi.c'
Richard Hughescb973682018-12-19 11:44:22 +0000280 cargs += '-DCONFIG_NICINTEL_SPI=1'
281endif
282if config_nicnatsemi
283 srcs += 'nicnatsemi.c'
284 cargs += '-DCONFIG_NICNATSEMI=1'
285endif
286if config_nicrealtek
287 srcs += 'nicrealtek.c'
288 cargs += '-DCONFIG_NICREALTEK=1'
289endif
290if config_ogp_spi
Richard Hughescb973682018-12-19 11:44:22 +0000291 srcs += 'ogp_spi.c'
292 cargs += '-DCONFIG_OGP_SPI=1'
293endif
294if config_pickit2_spi
295 srcs += 'pickit2_spi.c'
296 cargs += '-DCONFIG_PICKIT2_SPI=1'
Richard Hughescb973682018-12-19 11:44:22 +0000297endif
298if config_pony_spi
299 srcs += 'pony_spi.c'
Richard Hughescb973682018-12-19 11:44:22 +0000300 cargs += '-DCONFIG_PONY_SPI=1'
301endif
302if config_rayer_spi
303 srcs += 'rayer_spi.c'
Richard Hughescb973682018-12-19 11:44:22 +0000304 cargs += '-DCONFIG_RAYER_SPI=1'
305endif
306if config_satamv
307 srcs += 'satamv.c'
308 cargs += '-DCONFIG_SATAMV=1'
309endif
310if config_satasii
311 srcs += 'satasii.c'
312 cargs += '-DCONFIG_SATASII=1'
313endif
314if config_serprog
315 srcs += 'serprog.c'
316 cargs += '-DCONFIG_SERPROG=1'
Richard Hughescb973682018-12-19 11:44:22 +0000317endif
318if config_usbblaster_spi
319 srcs += 'usbblaster_spi.c'
320 cargs += '-DCONFIG_USBBLASTER_SPI=1'
321endif
Miklós Márton324929c2019-08-01 19:14:10 +0200322if config_stlinkv3_spi
323 srcs += 'stlinkv3_spi.c'
324 cargs += '-DCONFIG_STLINKV3_SPI=1'
325endif
Richard Hughescb973682018-12-19 11:44:22 +0000326
327# bitbanging SPI infrastructure
Peter Marheine306c8b72022-01-21 02:07:30 +0000328if need_bitbang_spi
Richard Hughescb973682018-12-19 11:44:22 +0000329 srcs += 'bitbang_spi.c'
330 cargs += '-DCONFIG_BITBANG_SPI=1'
331endif
332
Peter Marheine306c8b72022-01-21 02:07:30 +0000333if need_raw_mem_access
Thomas Heijligen74b4aa02021-12-14 17:52:30 +0100334 srcs += 'hwaccess_physmap.c'
Peter Marheine306c8b72022-01-21 02:07:30 +0000335endif
336
337if need_x86_port_io
338 srcs += 'hwaccess_x86_io.c'
Thomas Heijligena0655202021-12-14 16:36:05 +0100339 cargs += '-D__FLASHROM_HAVE_OUTB__=1'
Richard Hughescb973682018-12-19 11:44:22 +0000340endif
341
Peter Marheine306c8b72022-01-21 02:07:30 +0000342if need_x86_msr
343 srcs += 'hwaccess_x86_msr.c'
344endif
345
Richard Hughescb973682018-12-19 11:44:22 +0000346# raw serial IO
347if need_serial
Richard Hughescb973682018-12-19 11:44:22 +0000348 srcs += 'serial.c'
Thomas Heijligen140c1262021-09-27 15:12:26 +0200349 if host_machine.system() == 'linux'
350 srcs += 'custom_baud_linux.c'
351 else
352 srcs += 'custom_baud.c'
353 endif
Richard Hughescb973682018-12-19 11:44:22 +0000354endif
355
Richard Hughescb973682018-12-19 11:44:22 +0000356prefix = get_option('prefix')
357sbindir = join_paths(prefix, get_option('sbindir'))
358libdir = join_paths(prefix, get_option('libdir'))
Richard Hughesdad3a162020-02-17 09:57:01 +0000359mandir = join_paths(prefix, get_option('mandir'))
Richard Hughescb973682018-12-19 11:44:22 +0000360
361install_headers([
362 'libflashrom.h',
363 ],
364)
365
366# core modules needed by both the library and the CLI
367srcs += '82802ab.c'
368srcs += 'at45db.c'
369srcs += 'edi.c'
370srcs += 'en29lv640b.c'
371srcs += 'flashchips.c'
372srcs += 'flashrom.c'
373srcs += 'fmap.c'
374srcs += 'helpers.c'
375srcs += 'ich_descriptors.c'
376srcs += 'jedec.c'
377srcs += 'layout.c'
378srcs += 'libflashrom.c'
379srcs += 'opaque.c'
380srcs += 'print.c'
381srcs += 'programmer.c'
Thomas Heijligenbbfacff2021-03-31 20:40:01 +0200382srcs += 'programmer_table.c'
Richard Hughescb973682018-12-19 11:44:22 +0000383srcs += 'sfdp.c'
384srcs += 'spi25.c'
385srcs += 'spi25_statusreg.c'
David Hendricks349b5d22019-10-05 12:44:27 -0700386srcs += 'spi95.c'
Richard Hughescb973682018-12-19 11:44:22 +0000387srcs += 'spi.c'
388srcs += 'sst28sf040.c'
389srcs += 'sst49lfxxxc.c'
390srcs += 'sst_fwhub.c'
391srcs += 'stm50.c'
392srcs += 'udelay.c'
393srcs += 'w29ee011.c'
394srcs += 'w39.c'
Nikolai Artemievda1c8342021-10-21 00:58:12 +1100395srcs += 'writeprotect.c'
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +1100396srcs += 'writeprotect_ranges.c'
Richard Hughescb973682018-12-19 11:44:22 +0000397
398mapfile = 'libflashrom.map'
399vflag = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile)
Daniel Campello4bcc9a32021-03-17 18:03:28 -0600400flashrom = library(
Richard Hughescb973682018-12-19 11:44:22 +0000401 'flashrom',
402 sources : [
403 srcs,
404 ],
405 soversion : lt_current,
406 version : lt_version,
407 dependencies : [
408 deps,
409 ],
410 c_args : [
411 cargs,
412 ],
413 install : true,
414 link_args : vflag,
415 link_depends : mapfile,
416)
417
Mario Limonciellod954d5d2019-09-24 16:06:57 -0500418version = meson.project_version()
419#strip leading characters
420if version.startswith('v')
421 version = version.split('v')[1]
422endif
423if version.startswith('p')
424 version = version.split('p')[1]
425endif
426
Richard Hughescb973682018-12-19 11:44:22 +0000427pkgg = import('pkgconfig')
428pkgg.generate(
429 libraries : flashrom,
Mario Limonciellod954d5d2019-09-24 16:06:57 -0500430 version : version,
Mario Limonciello2a8d4392019-10-15 13:32:19 -0500431 name : 'flashrom',
432 filebase : 'flashrom',
433 description : 'library to interact with flashrom',
Richard Hughescb973682018-12-19 11:44:22 +0000434)
435
Richard Hughesdad3a162020-02-17 09:57:01 +0000436conf.set('VERSION', version)
Samuel R. Messner21bcfa92022-02-17 06:17:31 +0100437conf.set('MAN_DATE', run_command('util/getversion.sh', '--man-date').stdout().strip())
Richard Hughesdad3a162020-02-17 09:57:01 +0000438configure_file(
439 input : 'flashrom.8.tmpl',
440 output : 'flashrom.8',
441 configuration : conf,
442 install: true,
443 install_dir: join_paths(mandir, 'man8'),
444)
445
Richard Hughescb973682018-12-19 11:44:22 +0000446flashrom_dep = declare_dependency(
447 link_with : flashrom,
448 include_directories : include_directories('.'),
449 dependencies : deps
450)
451
Thomas Heijligen84e9c912021-06-01 16:22:14 +0200452if config_default_programmer_name != ''
453 cargs += '-DCONFIG_DEFAULT_PROGRAMMER_NAME=&programmer_' + config_default_programmer_name
454else
455 cargs += '-DCONFIG_DEFAULT_PROGRAMMER_NAME=NULL'
456endif
457
458cargs += '-DCONFIG_DEFAULT_PROGRAMMER_ARGS="' + config_default_programmer_args + '"'
459
Daniel Campellof7a84fd2021-03-16 17:17:14 -0600460if config_print_wiki
461 srcs += 'print_wiki.c'
462 cargs += '-DCONFIG_PRINT_WIKI=1'
463endif
464
Richard Hughescb973682018-12-19 11:44:22 +0000465# we can't just link_with libflashrom as we require all the internal symbols...
466executable(
467 'flashrom',
468 sources : [
469 srcs,
470 'cli_classic.c',
471 'cli_common.c',
472 'cli_output.c',
473 'flashrom.c',
474 ],
475 dependencies : [
476 deps,
477 ],
478 c_args : [
479 cargs,
Richard Hughescb973682018-12-19 11:44:22 +0000480 ],
481 install : true,
482 install_dir : sbindir,
483)
484
485subdir('util')