| 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 <stdlib.h> |
| 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 <poll.h> |
| #include <unistd.h> |
| 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 <stdarg.h> |
| #include <syslog.h> |
| 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 <stdarg.h> |
| #include <stdio.h> |
| 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 |