2025-02-16 12:16:19 +01:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
2025-02-16 12:15:45 +01:00
|
|
|
################################################################################
|
|
|
|
project(
|
2025-02-16 12:16:55 +01:00
|
|
|
'nvme-cli', ['c'],
|
2025-02-16 12:20:48 +01:00
|
|
|
meson_version: '>= 0.50.0',
|
2025-02-16 12:16:19 +01:00
|
|
|
license: 'GPL-2.0-only',
|
2025-02-16 12:28:30 +01:00
|
|
|
version: '2.11',
|
2025-02-16 12:15:45 +01:00
|
|
|
default_options: [
|
|
|
|
'c_std=gnu99',
|
2025-02-16 12:26:52 +01:00
|
|
|
'buildtype=debugoptimized',
|
2025-02-16 12:20:48 +01:00
|
|
|
'prefix=/usr/local',
|
2025-02-16 12:15:45 +01:00
|
|
|
'warning_level=1',
|
2025-02-16 12:23:16 +01:00
|
|
|
'sysconfdir=etc',
|
2025-02-16 12:24:13 +01:00
|
|
|
'wrap_mode=nofallback',
|
2025-02-16 12:15:45 +01:00
|
|
|
]
|
|
|
|
)
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
cc = meson.get_compiler('c')
|
|
|
|
|
|
|
|
prefixdir = get_option('prefix')
|
|
|
|
datadir = join_paths(prefixdir, get_option('datadir'))
|
|
|
|
mandir = join_paths(prefixdir, get_option('mandir'))
|
|
|
|
sbindir = join_paths(prefixdir, get_option('sbindir'))
|
|
|
|
sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
|
|
|
|
|
|
|
|
udevrulesdir = join_paths(prefixdir, get_option('udevrulesdir'))
|
|
|
|
dracutrulesdir = join_paths(prefixdir, get_option('dracutrulesdir'))
|
|
|
|
systemddir = join_paths(prefixdir, get_option('systemddir'))
|
2025-02-16 12:24:13 +01:00
|
|
|
rundir = join_paths(prefixdir, get_option('rundir'))
|
2025-02-16 12:15:45 +01:00
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
conf = configuration_data()
|
|
|
|
requires = ''
|
|
|
|
|
2025-02-16 12:16:19 +01:00
|
|
|
version_tag = get_option('version-tag')
|
|
|
|
if version_tag != ''
|
|
|
|
conf.set('GIT_VERSION', '"@0@"'.format(version_tag))
|
|
|
|
else
|
2025-02-16 12:24:13 +01:00
|
|
|
r = run_command('scripts/meson-vcs-tag.sh',
|
2025-02-16 12:16:19 +01:00
|
|
|
meson.current_source_dir(),
|
|
|
|
meson.project_version(),
|
|
|
|
check: true)
|
|
|
|
conf.set('GIT_VERSION', '"@0@"'.format(r.stdout().strip()))
|
|
|
|
endif
|
|
|
|
|
2025-02-16 12:15:45 +01:00
|
|
|
conf.set('SYSCONFDIR', '"@0@"'.format(sysconfdir))
|
2025-02-16 12:24:13 +01:00
|
|
|
conf.set('RUNDIR', '"@0@"'.format(rundir))
|
2025-02-16 12:15:45 +01:00
|
|
|
|
2025-02-16 12:16:19 +01:00
|
|
|
# Check for libnvme availability
|
2025-02-16 12:28:30 +01:00
|
|
|
libnvme_dep = dependency('libnvme', version: '>=1.11', required: true,
|
2025-02-16 12:16:19 +01:00
|
|
|
fallback : ['libnvme', 'libnvme_dep'])
|
2025-02-16 12:18:36 +01:00
|
|
|
libnvme_mi_dep = dependency('libnvme-mi', required: true,
|
|
|
|
fallback : ['libnvme', 'libnvme_mi_dep'])
|
2025-02-16 12:15:45 +01:00
|
|
|
|
|
|
|
# Check for libjson-c availability
|
2025-02-16 12:23:16 +01:00
|
|
|
if get_option('json-c').disabled()
|
|
|
|
json_c_dep = dependency('', required: false)
|
2025-02-16 12:16:19 +01:00
|
|
|
else
|
2025-02-16 12:24:13 +01:00
|
|
|
json_c_dep = dependency('json-c', required: get_option('json-c'), version: '>=0.13',
|
2025-02-16 12:23:16 +01:00
|
|
|
fallback : ['json-c', 'json_c_dep'])
|
|
|
|
if json_c_dep.version().version_compare('>=0.14')
|
|
|
|
conf.set('CONFIG_JSONC_14', true, description: 'Is json-c at least 0.14?')
|
|
|
|
requires = 'Requires: json-c >= 0.14'
|
|
|
|
else
|
|
|
|
requires = 'Requires: json-c >= 0.13'
|
|
|
|
endif
|
2025-02-16 12:15:45 +01:00
|
|
|
endif
|
2025-02-16 12:23:16 +01:00
|
|
|
conf.set('CONFIG_JSONC', json_c_dep.found(), description: 'Is json-c available?')
|
2025-02-16 12:16:19 +01:00
|
|
|
|
2025-02-16 12:15:45 +01:00
|
|
|
# Set the nvme-cli version
|
|
|
|
conf.set('NVME_VERSION', '"' + meson.project_version() + '"')
|
|
|
|
|
2025-02-16 12:20:48 +01:00
|
|
|
conf.set10('DEFAULT_PDC_ENABLED', get_option('pdc-enabled'))
|
|
|
|
|
2025-02-16 12:15:45 +01:00
|
|
|
# local (cross-compilable) implementations of ccan configure steps
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_BUILTIN_TYPES_COMPATIBLE_P',
|
|
|
|
cc.compiles(
|
|
|
|
'''int main(void) {
|
|
|
|
return __builtin_types_compatible_p(int, long);
|
|
|
|
}
|
|
|
|
''',
|
|
|
|
name: '__builtin_type_compatible_p'
|
|
|
|
),
|
|
|
|
description: 'Is __builtin_types_compatible_p available?'
|
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_TYPEOF',
|
|
|
|
cc.compiles(
|
|
|
|
'''int main(void) {
|
|
|
|
int a = 1;
|
|
|
|
typeof(a) b;
|
|
|
|
b = a;
|
|
|
|
}
|
|
|
|
''',
|
|
|
|
name: 'typeof'
|
|
|
|
),
|
|
|
|
description: 'Is typeof available?'
|
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_BYTESWAP_H',
|
|
|
|
cc.compiles(
|
|
|
|
'''#include <byteswap.h>''',
|
|
|
|
name: 'byteswap.h'
|
|
|
|
),
|
|
|
|
description: 'Is byteswap.h include-able?'
|
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_BSWAP_64',
|
|
|
|
cc.links(
|
|
|
|
'''#include <byteswap.h>
|
|
|
|
int main(void) {
|
|
|
|
return bswap_64(0);
|
|
|
|
}
|
|
|
|
''',
|
|
|
|
name: 'bswap64'
|
|
|
|
),
|
|
|
|
description: 'Is bswap_64 available?'
|
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_LITTLE_ENDIAN',
|
2025-02-16 12:18:36 +01:00
|
|
|
host_machine.endian() == 'little',
|
2025-02-16 12:15:45 +01:00
|
|
|
description: 'Building for little-endian'
|
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_BIG_ENDIAN',
|
2025-02-16 12:18:36 +01:00
|
|
|
host_machine.endian() == 'big',
|
2025-02-16 12:15:45 +01:00
|
|
|
description: 'Building for big-endian'
|
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_ISBLANK',
|
|
|
|
cc.links(
|
|
|
|
'''#include <ctype.h>
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
return isblank(argv[0][0]);
|
|
|
|
}
|
|
|
|
''',
|
|
|
|
name: 'isblank'
|
|
|
|
),
|
|
|
|
description: 'Is isblank() available?'
|
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_SYS_RANDOM',
|
|
|
|
cc.compiles(
|
|
|
|
'''#include <sys/random.h>''',
|
|
|
|
name: 'sys/random.h'
|
|
|
|
),
|
|
|
|
description: 'Is sys/random.h(getrandom) include-able?'
|
|
|
|
)
|
2025-02-16 12:24:54 +01:00
|
|
|
conf.set10(
|
|
|
|
'HAVE_ATTRIBUTE_UNUSED',
|
|
|
|
cc.get_id() == 'clang',
|
|
|
|
description: 'Is compiler warning about unused static line function?'
|
|
|
|
)
|
2025-02-16 12:26:13 +01:00
|
|
|
conf.set10(
|
|
|
|
'HAVE_SED_OPAL',
|
|
|
|
cc.compiles(
|
|
|
|
'''#include <linux/sed-opal.h>''',
|
|
|
|
name: 'linux/sed-opal.h'
|
|
|
|
|
|
|
|
),
|
2025-02-16 12:26:52 +01:00
|
|
|
description: 'Is linux/sed-opal.h include-able?'
|
2025-02-16 12:26:13 +01:00
|
|
|
)
|
|
|
|
conf.set10(
|
|
|
|
'HAVE_KEY_TYPE',
|
|
|
|
cc.compiles(
|
|
|
|
'''
|
|
|
|
#include <linux/sed-opal.h>
|
|
|
|
int main(void) {
|
|
|
|
struct opal_key key;
|
|
|
|
key.key_type = OPAL_INCLUDED;
|
|
|
|
}
|
|
|
|
''',
|
|
|
|
name: 'key_type'
|
|
|
|
),
|
|
|
|
description: 'Does struct opal_key have a key_type field?'
|
|
|
|
)
|
2025-02-16 12:15:45 +01:00
|
|
|
|
2025-02-16 12:24:13 +01:00
|
|
|
if cc.has_function_attribute('fallthrough')
|
|
|
|
conf.set('fallthrough', '__attribute__((__fallthrough__))')
|
|
|
|
else
|
|
|
|
conf.set('fallthrough', 'do {} while (0) /* fallthrough */')
|
|
|
|
endif
|
|
|
|
|
2025-02-16 12:15:45 +01:00
|
|
|
configure_file(
|
|
|
|
output: 'config.h',
|
|
|
|
configuration: conf
|
|
|
|
)
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
libtype = get_option('default_library')
|
|
|
|
if libtype == 'static'
|
|
|
|
requires = ''
|
|
|
|
endif
|
|
|
|
|
|
|
|
substs = configuration_data()
|
|
|
|
substs.set('NAME', meson.project_name())
|
|
|
|
substs.set('VERSION', meson.project_version())
|
|
|
|
substs.set('LICENSE', meson.project_license()[0])
|
|
|
|
substs.set('UDEVRULESDIR', udevrulesdir)
|
|
|
|
substs.set('DRACUTRILESDIR', dracutrulesdir)
|
|
|
|
substs.set('REQUIRES', requires)
|
|
|
|
substs.set('DATADIR', datadir)
|
|
|
|
substs.set('MANDIR', mandir)
|
2025-02-16 12:24:13 +01:00
|
|
|
substs.set('RUNDIR', rundir)
|
2025-02-16 12:15:45 +01:00
|
|
|
substs.set('SBINDIR', sbindir)
|
|
|
|
substs.set('SYSCONFDIR', sysconfdir)
|
|
|
|
substs.set('SYSTEMDDIR', systemddir)
|
|
|
|
substs.set('SYSTEMCTL', get_option('systemctl'))
|
|
|
|
|
|
|
|
configure_file(
|
|
|
|
input: 'nvme.spec.in',
|
|
|
|
output: 'nvme.spec',
|
|
|
|
configuration: substs,
|
|
|
|
)
|
|
|
|
|
|
|
|
disc = configure_file(
|
|
|
|
input: 'etc/discovery.conf.in',
|
|
|
|
output: 'discovery.conf',
|
|
|
|
configuration: substs,
|
|
|
|
)
|
|
|
|
|
|
|
|
dracut_files = [
|
|
|
|
'70-nvmf-autoconnect.conf',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach file : dracut_files
|
|
|
|
configure_file(
|
|
|
|
input: 'nvmf-autoconnect/dracut-conf/' + file + '.in',
|
|
|
|
output: file,
|
|
|
|
configuration: substs,
|
|
|
|
)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
systemd_files = [
|
|
|
|
'nvmefc-boot-connections.service',
|
|
|
|
'nvmf-autoconnect.service',
|
2025-02-16 12:25:41 +01:00
|
|
|
'nvmf-connect-nbft.service',
|
2025-02-16 12:15:45 +01:00
|
|
|
'nvmf-connect.target',
|
|
|
|
'nvmf-connect@.service',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach file : systemd_files
|
|
|
|
configure_file(
|
|
|
|
input: 'nvmf-autoconnect/systemd/' + file + '.in',
|
|
|
|
output: file,
|
|
|
|
configuration: substs,
|
|
|
|
)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
udev_files = [
|
2025-02-16 12:25:41 +01:00
|
|
|
'65-persistent-net-nbft.rules',
|
2025-02-16 12:15:45 +01:00
|
|
|
'70-nvmf-autoconnect.rules',
|
2025-02-16 12:28:30 +01:00
|
|
|
'70-nvmf-keys.rules',
|
2025-02-16 12:25:41 +01:00
|
|
|
'71-nvmf-netapp.rules',
|
2025-02-16 12:15:45 +01:00
|
|
|
]
|
|
|
|
|
|
|
|
foreach file : udev_files
|
|
|
|
configure_file(
|
|
|
|
input: 'nvmf-autoconnect/udev-rules/' + file + '.in',
|
|
|
|
output: file,
|
|
|
|
configuration: substs,
|
|
|
|
)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
add_project_arguments(['-fomit-frame-pointer', '-D_GNU_SOURCE',
|
|
|
|
'-include', 'config.h'], language : 'c')
|
|
|
|
incdir = include_directories(['ccan'])
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
sources = [
|
2025-02-16 12:24:13 +01:00
|
|
|
'nbft.c',
|
2025-02-16 12:15:45 +01:00
|
|
|
'fabrics.c',
|
|
|
|
'nvme.c',
|
|
|
|
'nvme-models.c',
|
|
|
|
'nvme-print.c',
|
2025-02-16 12:24:13 +01:00
|
|
|
'nvme-print-stdout.c',
|
|
|
|
'nvme-print-binary.c',
|
2025-02-16 12:15:45 +01:00
|
|
|
'nvme-rpmb.c',
|
2025-02-16 12:18:36 +01:00
|
|
|
'nvme-wrap.c',
|
2025-02-16 12:15:45 +01:00
|
|
|
'plugin.c',
|
2025-02-16 12:18:36 +01:00
|
|
|
'libnvme-wrap.c',
|
2025-02-16 12:15:45 +01:00
|
|
|
]
|
2025-02-16 12:23:16 +01:00
|
|
|
if json_c_dep.found()
|
|
|
|
sources += [
|
|
|
|
'nvme-print-json.c',
|
|
|
|
]
|
|
|
|
endif
|
2025-02-16 12:15:45 +01:00
|
|
|
|
|
|
|
subdir('ccan')
|
|
|
|
subdir('plugins')
|
2025-02-16 12:20:48 +01:00
|
|
|
subdir('unit')
|
|
|
|
if get_option('nvme-tests')
|
|
|
|
subdir('tests')
|
|
|
|
endif
|
2025-02-16 12:15:45 +01:00
|
|
|
subdir('util')
|
|
|
|
subdir('Documentation')
|
|
|
|
|
|
|
|
executable(
|
|
|
|
'nvme',
|
|
|
|
sources,
|
2025-02-16 12:25:41 +01:00
|
|
|
dependencies: [ libnvme_dep, libnvme_mi_dep, json_c_dep ],
|
2025-02-16 12:16:19 +01:00
|
|
|
link_args: '-ldl',
|
2025-02-16 12:15:45 +01:00
|
|
|
include_directories: incdir,
|
|
|
|
install: true,
|
|
|
|
install_dir: sbindir
|
|
|
|
)
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
install_data('completions/bash-nvme-completion.sh',
|
|
|
|
rename: 'nvme',
|
|
|
|
install_dir: datadir + '/bash-completion/completions')
|
|
|
|
install_data('completions/_nvme',
|
|
|
|
install_dir: datadir + '/zsh/site-functions')
|
|
|
|
|
|
|
|
foreach file : dracut_files
|
|
|
|
install_data(meson.current_build_dir() + '/' + file,
|
|
|
|
install_dir: dracutrulesdir)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
foreach file : systemd_files
|
|
|
|
install_data(meson.current_build_dir() + '/' + file,
|
|
|
|
install_dir: systemddir)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
foreach file : udev_files
|
|
|
|
install_data(meson.current_build_dir() + '/' + file,
|
|
|
|
install_dir: udevrulesdir)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
install_data(disc,
|
|
|
|
install_dir: join_paths(sysconfdir, 'nvme'))
|
2025-02-16 12:23:16 +01:00
|
|
|
|
|
|
|
################################################################################
|
|
|
|
if meson.version().version_compare('>=0.53.0')
|
2025-02-16 12:24:13 +01:00
|
|
|
path_dict = {
|
2025-02-16 12:23:16 +01:00
|
|
|
'prefixdir': prefixdir,
|
|
|
|
'sysconfdir': sysconfdir,
|
|
|
|
'sbindir': sbindir,
|
|
|
|
'datadir': datadir,
|
|
|
|
'mandir': mandir,
|
|
|
|
'udevrulesdir': udevrulesdir,
|
|
|
|
'dracutrulesdir': dracutrulesdir,
|
2025-02-16 12:24:13 +01:00
|
|
|
'rundir': rundir,
|
2025-02-16 12:23:16 +01:00
|
|
|
'systemddir': systemddir,
|
|
|
|
'build location': meson.current_build_dir(),
|
|
|
|
}
|
2025-02-16 12:24:13 +01:00
|
|
|
summary(path_dict, section: 'Paths')
|
|
|
|
dep_dict = {
|
|
|
|
'json-c': json_c_dep.found(),
|
|
|
|
}
|
|
|
|
summary(dep_dict, section: 'Dependencies')
|
|
|
|
conf_dict = {
|
2025-02-16 12:27:38 +01:00
|
|
|
'git version': conf.get('GIT_VERSION'),
|
|
|
|
'pdc enabled': get_option('pdc-enabled'),
|
2025-02-16 12:24:13 +01:00
|
|
|
}
|
|
|
|
summary(conf_dict, section: 'Configuration')
|
2025-02-16 12:23:16 +01:00
|
|
|
endif
|