blob: ef001f8f01791bde4aead2452d041f4d2487e8d1 [file] [log] [blame]
project('ndctl', 'c',
version : '78',
license : [
'GPL-2.0',
'LGPL-2.1',
'CC0-1.0',
'MIT',
],
default_options : [
'c_std=gnu99',
'prefix=/usr',
'libdir=/usr/lib',
'sysconfdir=/etc',
'localstatedir=/var',
],
)
# rootprefixdir and rootlibdir setup copied from systemd:
rootprefixdir = get_option('rootprefix')
rootprefix_default = '/usr'
if rootprefixdir == ''
rootprefixdir = rootprefix_default
endif
rootbindir = join_paths(rootprefixdir, 'bin')
# join_paths ignores the preceding arguments if an absolute component is
# encountered, so this should canonicalize various paths when they are
# absolute or relative.
prefixdir = get_option('prefix')
if not prefixdir.startswith('/')
error('Prefix is not absolute: "@0@"'.format(prefixdir))
endif
if prefixdir != rootprefixdir and rootprefixdir != '/' and not prefixdir.strip('/').startswith(rootprefixdir.strip('/') + '/')
error('Prefix is not below root prefix (now rootprefix=@0@ prefix=@1@)'.format(
rootprefixdir, prefixdir))
endif
libdir = join_paths(prefixdir, get_option('libdir'))
rootlibdir = get_option('rootlibdir')
if rootlibdir == ''
rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
endif
datadir = prefixdir / get_option('datadir')
includedir = prefixdir / get_option('includedir')
pkgconfiglibdir = get_option('pkgconfiglibdir') != '' ? get_option('pkgconfiglibdir') : libdir / 'pkgconfig'
datadir = prefixdir / get_option('datadir')
includedir = prefixdir / get_option('includedir')
sysconfdir = get_option('sysconfdir')
pkgconfig_script = '''
sed -e s,@VERSION@,@0@,g
-e s,@prefix@,@1@,g
-e s,@exec_prefix@,@1@,g
-e s,@libdir@,@2@,g
-e s,@includedir@,@3@,g
'''.format(meson.project_version(), prefixdir, libdir, includedir).split()
cc_flags = [
'-Wchar-subscripts',
'-Wformat-security',
'-Wmissing-declarations',
'-Wmissing-prototypes',
'-Wnested-externs ',
'-Wshadow',
'-Wsign-compare',
'-Wstrict-prototypes',
'-Wtype-limits',
'-Wmaybe-uninitialized',
'-Wdeclaration-after-statement',
'-Wunused-result',
]
if get_option('optimization') != '0'
cc_flags += [ '-D_FORTIFY_SOURCE=2' ]
endif
cc = meson.get_compiler('c')
add_project_arguments(cc.get_supported_arguments(cc_flags), language : 'c')
project_source_root = meson.current_source_dir()
# Remove this after the conversion to meson has been completed
# Cleanup the leftover config.h files to avoid conflicts with the meson
# generated config.h
git = find_program('git', required : false)
env = find_program('env')
if git.found()
run_command('clean_config.sh',
env : 'GIT_DIR=@0@/.git'.format(project_source_root),
check : false,
)
endif
version_tag = get_option('version-tag')
if version_tag != ''
vcs_data = configuration_data()
vcs_data.set('VCS_TAG', version_tag)
version_h = configure_file(
configuration : vcs_data,
input : 'version.h.in',
output : 'version.h'
)
else
vcs_tagger = [
project_source_root + '/tools/meson-vcs-tag.sh',
project_source_root,
meson.project_version()
]
version_h = vcs_tag(
input : 'version.h.in',
output : 'version.h',
command: vcs_tagger
)
endif
if git.found()
all_files = run_command(
env, '-u', 'GIT_WORK_TREE',
git, '--git-dir=@0@/.git'.format(project_source_root),
'ls-files', ':/*.[ch]',
check : false)
if all_files.returncode() == 0
all_files = files(all_files.stdout().split())
custom_target(
'tags',
output : 'tags',
command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
run_target(
'ctags',
command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
endif
endif
versiondep = declare_dependency(
compile_args: ['-include', 'version.h'],
sources: version_h
)
kmod = dependency('libkmod')
libudev = dependency('libudev')
uuid = dependency('uuid')
json = dependency('json-c')
if get_option('libtracefs').enabled()
traceevent = dependency('libtraceevent')
tracefs = dependency('libtracefs', version : '>=1.2.0')
endif
if get_option('docs').enabled()
if get_option('asciidoctor').enabled()
asciidoc = find_program('asciidoctor', required : true)
else
asciidoc = find_program('asciidoc', required : true)
xmlto = find_program('xmlto', required : true)
endif
endif
if get_option('systemd').enabled()
systemd = dependency('systemd', required : true)
systemdunitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir')
udev = dependency('udev', required : true)
udevdir = udev.get_pkgconfig_variable('udevdir')
udevrulesdir = udevdir / 'rules.d'
endif
cc = meson.get_compiler('c')
# keyutils lacks pkgconfig
keyutils = cc.find_library('keyutils', required : get_option('keyutils'))
# iniparser lacks pkgconfig and its header files are either at '/usr/include' or '/usr/include/iniparser'
# Use the path provided by user via meson configure -Diniparserdir=<somepath>
# if thats not provided then try searching for 'iniparser.h' in default system include path
# and if that not found then as a last resort try looking at '/usr/include/iniparser'
iniparser_headers = ['iniparser.h', 'dictionary.h']
message('Looking for iniparser include headers', iniparser_headers)
iniparserdir = include_directories(includedir / get_option('iniparserdir'), is_system:true)
iniparser = cc.find_library('iniparser', required : (get_option('iniparserdir') != '') ,
has_headers :iniparser_headers ,header_include_directories : iniparserdir)
if not iniparser.found()
iniparserdir = include_directories(includedir / 'iniparser', is_system:true)
iniparser = cc.find_library('iniparser', required : true, has_headers : iniparser_headers,
header_include_directories : iniparserdir)
endif
iniparser = declare_dependency(include_directories: iniparserdir, dependencies:iniparser)
conf = configuration_data()
check_headers = [
['HAVE_DLFCN_H', 'dlfcn.h'],
['HAVE_INTTYPES_H', 'inttypes.h'],
['HAVE_KEYUTILS_H', 'keyutils.h'],
['HAVE_LINUX_VERSION_H', 'linux/version.h'],
['HAVE_MEMORY_H', 'memory.h'],
['HAVE_STDINT_H', 'stdint.h'],
['HAVE_STDLIB_H', 'stdlib.h'],
['HAVE_STRINGS_H', 'strings.h'],
['HAVE_STRING_H', 'string.h'],
['HAVE_SYS_STAT_H', 'sys/stat.h'],
['HAVE_SYS_TYPES_H', 'sys/types.h'],
['HAVE_UNISTD_H', 'unistd.h'],
]
foreach h : check_headers
if cc.has_header(h.get(1))
conf.set(h.get(0), 1)
endif
endforeach
map_sync_symbols = [
[ 'signal.h', 'BUS_MCEERR_AR' ],
[ 'linux/mman.h', 'MAP_SHARED_VALIDATE' ],
[ 'linux/mman.h', 'MAP_SYNC' ],
]
count = 0
foreach symbol : map_sync_symbols
if cc.has_header_symbol(symbol[0], symbol[1])
conf.set('HAVE_DECL_@0@'.format(symbol[1].to_upper()), 1)
count = count + 1
endif
endforeach
poison_enabled = false
if get_option('poison').enabled() and count == 3
poison_enabled = true
endif
conf.set('ENABLE_POISON', poison_enabled)
conf.set('ENABLE_KEYUTILS', get_option('keyutils').enabled())
conf.set('ENABLE_TEST', get_option('test').enabled())
conf.set('ENABLE_DESTRUCTIVE', get_option('destructive').enabled())
conf.set('ENABLE_LOGGING', get_option('logging').enabled())
conf.set('ENABLE_DEBUG', get_option('dbg').enabled())
conf.set('ENABLE_LIBTRACEFS', get_option('libtracefs').enabled())
typeof_code = '''
void func() {
struct {
char a[16];
} x;
typeof(x) y;
char static_assert[2 * (sizeof(x) == sizeof(y)) - 1];
}
'''
if cc.compiles(typeof_code)
conf.set('HAVE_TYPEOF', 1)
conf.set('HAVE_STATEMENT_EXPR', 1)
endif
if target_machine.endian() == 'big'
conf.set('HAVE_BIG_ENDIAN', 1)
else
conf.set('HAVE_LITTLE_ENDIAN', 1)
endif
conf.set('_GNU_SOURCE', true)
conf.set_quoted('PREFIX', get_option('prefix'))
conf.set_quoted('NDCTL_MAN_PATH', get_option('mandir'))
foreach ident : ['secure_getenv', '__secure_getenv']
conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
endforeach
conf.set10('HAVE_JSON_U64',
cc.has_function('json_object_new_uint64',
prefix : '''#include <json-c/json.h>''',
dependencies : json,
)
)
ndctlconf_dir = sysconfdir / 'ndctl.conf.d'
ndctlconf = ndctlconf_dir / 'monitor.conf'
conf.set_quoted('NDCTL_CONF_FILE', ndctlconf)
conf.set_quoted('NDCTL_CONF_DIR', ndctlconf_dir)
ndctlkeys_dir = sysconfdir / 'ndctl' / 'keys'
conf.set_quoted('NDCTL_KEYS_DIR', ndctlkeys_dir)
daxctlconf_dir = sysconfdir / 'daxctl.conf.d'
daxctlconf = daxctlconf_dir / 'dax.conf'
conf.set_quoted('DAXCTL_CONF_DIR', daxctlconf_dir)
conf.set_quoted('DAXCTL_MODPROBE_DATA', datadir / 'daxctl/daxctl.conf')
conf.set_quoted('DAXCTL_MODPROBE_INSTALL', sysconfdir / 'modprobe.d/daxctl.conf')
config_h = configure_file(
input : 'config.h.meson',
output : 'config.h',
configuration : conf
)
add_project_arguments('-include', 'config.h', language : 'c')
LIBNDCTL_CURRENT=27
LIBNDCTL_REVISION=2
LIBNDCTL_AGE=21
LIBDAXCTL_CURRENT=6
LIBDAXCTL_REVISION=2
LIBDAXCTL_AGE=5
LIBCXL_CURRENT=6
LIBCXL_REVISION=0
LIBCXL_AGE=5
root_inc = include_directories(['.', 'ndctl', ])
ccan = static_library('ccan',
[ 'ccan/str/str.c', 'ccan/list/list.c' ],
)
ccan_dep = declare_dependency(link_with : ccan)
subdir('daxctl/lib')
subdir('ndctl/lib')
subdir('cxl/lib')
subdir('util')
subdir('ndctl')
subdir('daxctl')
subdir('cxl')
if get_option('docs').enabled()
subdir('Documentation/ndctl')
subdir('Documentation/daxctl')
subdir('Documentation/cxl')
endif
subdir('test')
subdir('contrib')
# only support spec file generation from git builds
if version_tag == ''
subdir('rhel')
subdir('sles')
endif