project( 'libmctp', 'c', meson_version: '>= 1.1', version: '0.11', default_options: [ 'debug=true', 'optimization=g', 'warning_level=2', 'werror=true', 'tests=' + (meson.is_subproject() ? 'disabled' : 'enabled'), ], ) sources = [ 'core.c', 'alloc.c', 'control.c', ] headers = [ 'libmctp.h', ] serial_sources = [ 'serial.c', 'crc-16-ccitt.c', ] serial_headers = [ 'libmctp-serial.h' ] astlpc_sources = [ 'astlpc.c', 'crc32.c', ] astlpc_headers = [ 'libmctp-astlpc.h', ] i2c_sources = [ 'i2c.c', ] i2c_headers = [ 'libmctp-i2c.h', ] control_sources = [ 'control.c', ] libmctp_sources = sources libmctp_headers = headers if get_option('bindings').contains('serial') libmctp_sources += serial_sources libmctp_headers += serial_headers endif if get_option('bindings').contains('astlpc') libmctp_sources += astlpc_sources libmctp_headers += astlpc_headers endif if get_option('bindings').contains('i2c') libmctp_sources += i2c_sources libmctp_headers += i2c_headers endif if get_option('control') libmctp_sources += control_sources endif compiler = meson.get_compiler('c') if not get_option('custom_alloc') and get_option('default_alloc').require( compiler.links(''' #include void main() { free(malloc(4096)); } ''')).allowed() add_project_arguments('-DMCTP_DEFAULT_ALLOC', language : 'c') endif if get_option('custom_alloc') add_project_arguments('-DMCTP_CUSTOM_ALLOC', language : 'c') endif if get_option('nolog') add_project_arguments('-DMCTP_NOLOG', language : 'c') else libmctp_sources += ['log.c'] endif feat_fileio = get_option('fileio').require( compiler.links(''' #include #include void main() { poll(NULL, 0, -1); } ''')) if feat_fileio.allowed() add_project_arguments('-DMCTP_HAVE_FILEIO', language : 'c') endif if get_option('syslog').require( compiler.links(''' #include #include void check_vsyslog(int level, const char *fmt, ...) { va_list ap; va_start(ap, fmt); vsyslog(0, fmt, ap); va_end(ap); } void main() { check_vsyslog(0, "\n"); } ''')).allowed() add_project_arguments('-DMCTP_HAVE_SYSLOG', language : 'c') endif if get_option('stdio').require( compiler.links(''' #include #include void check_vsyslog(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } void main() { check_vsyslog("\n"); } ''')).allowed() add_project_arguments('-DMCTP_HAVE_STDIO', language : 'c') endif # pcap is necessary for mctp-demux-daemon to be functional pcap_dep = dependency('libpcap', required: false) systemd_dep = dependency('systemd', required: false) libsystemd_dep = dependency('libsystemd', required: false) libmctp_include_dir = include_directories('.', is_system: true) libmctp = library('mctp', libmctp_sources, include_directories: libmctp_include_dir, version: meson.project_version(), install: true, ) install_headers(libmctp_headers) if systemd_dep.found() unitdir = systemd_dep.get_variable(pkgconfig: 'systemdsystemunitdir') install_data('systemd/system/mctp-demux.service', install_dir: unitdir) install_data('systemd/system/mctp-demux.socket', install_dir: unitdir) endif import('pkgconfig').generate(libmctp, name: 'libmctp', description: 'MCTP protocol implementation', version: meson.project_version(), ) libmctp_dep = declare_dependency( include_directories: libmctp_include_dir, link_with: libmctp, ) # TODO: these should depend on the -internal.h headers so they rebuild # on changes, unclear how to do that. sizeof_mctp = compiler.sizeof('struct mctp', include_directories: libmctp_include_dir, prefix: '#include "core-internal.h"') sizeof_binding_i2c = compiler.sizeof('struct mctp_binding_i2c', include_directories: libmctp_include_dir, prefix: '#include "i2c-internal.h"') sizes_h = configure_file(configuration: { 'sizeof_struct_mctp': sizeof_mctp, 'sizeof_binding_i2c': sizeof_binding_i2c, }, input: 'libmctp-sizes.h.in', output: 'libmctp-sizes.h', ) install_headers(sizes_h) if feat_fileio.allowed() subdir('utils') endif if get_option('tests').allowed() subdir('tests') endif