blob: 28c01268922db5554ac7b669755d31a6788a5a1f [file] [log] [blame] [edit]
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