2024-03-10 04:29:51 +01:00
|
|
|
project('lix', 'cpp',
|
|
|
|
version : run_command('bash', '-c', 'echo -n $(cat ./.version)$VERSION_SUFFIX', check : true).stdout().strip(),
|
|
|
|
default_options : [
|
|
|
|
'cpp_std=c++20',
|
2024-03-18 16:22:28 +01:00
|
|
|
# TODO(Qyriad): increase the warning level
|
2024-03-10 04:29:51 +01:00
|
|
|
'warning_level=1',
|
|
|
|
'debug=true',
|
|
|
|
'optimization=2',
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
2024-03-18 16:22:28 +01:00
|
|
|
fs = import('fs')
|
|
|
|
|
|
|
|
prefix = get_option('prefix')
|
|
|
|
# For each of these paths, assume that it is relative to the prefix unless
|
|
|
|
# it is already an absolute path (which is the default for store-dir, state-dir, and log-dir).
|
|
|
|
path_opts = [
|
|
|
|
# Meson built-ins.
|
|
|
|
'datadir',
|
|
|
|
'sysconfdir',
|
|
|
|
'bindir',
|
|
|
|
'mandir',
|
|
|
|
# Homecooked Lix directories.
|
|
|
|
'store-dir',
|
|
|
|
'state-dir',
|
|
|
|
'log-dir',
|
|
|
|
]
|
|
|
|
foreach optname : path_opts
|
|
|
|
varname = optname.replace('-', '_')
|
|
|
|
path = get_option(optname)
|
|
|
|
if fs.is_absolute(path)
|
|
|
|
set_variable(varname, path)
|
|
|
|
else
|
|
|
|
set_variable(varname, prefix / path)
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
2024-03-10 04:29:51 +01:00
|
|
|
cxx = meson.get_compiler('cpp')
|
|
|
|
|
|
|
|
host_system = host_machine.cpu_family() + '-' + host_machine.system()
|
|
|
|
message('canonical Nix system name:', host_system)
|
|
|
|
|
|
|
|
all_sources = { }
|
|
|
|
all_deps = { }
|
|
|
|
|
|
|
|
deps = [ ]
|
|
|
|
configdata = { }
|
|
|
|
|
|
|
|
#
|
|
|
|
# Dependencies
|
|
|
|
#
|
|
|
|
|
|
|
|
boehm = dependency('bdw-gc', required : get_option('gc'))
|
|
|
|
if boehm.found()
|
|
|
|
deps += boehm
|
|
|
|
endif
|
|
|
|
configdata += {
|
|
|
|
'HAVE_BOEHMGC': boehm.found().to_int(),
|
|
|
|
}
|
|
|
|
|
|
|
|
boost = dependency('boost', required : true, modules : ['context', 'coroutine', 'container'])
|
|
|
|
deps += boost
|
|
|
|
|
|
|
|
cpuid = dependency('libcpuid', 'cpuid', required : get_option('cpuid'))
|
|
|
|
configdata += {
|
|
|
|
'HAVE_LIBCPUID': cpuid.found().to_int(),
|
|
|
|
}
|
|
|
|
deps += cpuid
|
|
|
|
|
|
|
|
seccomp = dependency('libseccomp', 'seccomp', required : get_option('seccomp-sandboxing'))
|
|
|
|
configdata += {
|
|
|
|
'HAVE_SECCOMP': seccomp.found().to_int(),
|
|
|
|
}
|
|
|
|
|
|
|
|
libarchive = dependency('libarchive', required : true)
|
|
|
|
deps += libarchive
|
|
|
|
|
|
|
|
brotli = [
|
|
|
|
dependency('libbrotlicommon', required : true),
|
|
|
|
dependency('libbrotlidec', required : true),
|
|
|
|
dependency('libbrotlienc', required : true),
|
|
|
|
]
|
|
|
|
deps += brotli
|
|
|
|
|
|
|
|
openssl = dependency('libcrypto', 'openssl', required : true)
|
|
|
|
deps += openssl
|
|
|
|
|
|
|
|
aws_sdk = dependency('aws-cpp-sdk-core', required : true)
|
|
|
|
if aws_sdk.found()
|
|
|
|
# The AWS pkg-config adds -std=c++11.
|
|
|
|
aws_sdk = aws_sdk.partial_dependency(
|
|
|
|
compile_args : false,
|
|
|
|
includes : true,
|
|
|
|
link_args : true,
|
|
|
|
links : true,
|
|
|
|
sources : true,
|
|
|
|
)
|
|
|
|
deps += aws_sdk
|
|
|
|
s = aws_sdk.version().split('.')
|
|
|
|
configdata += {
|
|
|
|
'AWS_VERSION_MAJOR': s[0].to_int(),
|
|
|
|
'AWS_VERSION_MINOR': s[1].to_int(),
|
|
|
|
'AWS_VERSION_PATCH': s[2].to_int(),
|
|
|
|
}
|
|
|
|
aws_sdk_transfer = dependency('aws-cpp-sdk-transfer', required : true).partial_dependency(
|
|
|
|
compile_args : false,
|
|
|
|
includes : true,
|
|
|
|
link_args : true,
|
|
|
|
links : true,
|
|
|
|
sources : true,
|
|
|
|
)
|
|
|
|
endif
|
|
|
|
aws_s3 = dependency('aws-cpp-sdk-s3', required : true)
|
|
|
|
if aws_s3.found()
|
|
|
|
# The AWS pkg-config adds -std=c++11.
|
|
|
|
aws_s3 = aws_s3.partial_dependency(
|
|
|
|
compile_args : false,
|
|
|
|
includes : true,
|
|
|
|
link_args : true,
|
|
|
|
links : true,
|
|
|
|
sources : true,
|
|
|
|
)
|
|
|
|
deps += aws_s3
|
|
|
|
endif
|
|
|
|
|
|
|
|
sqlite = dependency('sqlite3', 'sqlite', version : '>=3.6.19', required : true)
|
|
|
|
deps += sqlite
|
|
|
|
|
2024-03-18 16:22:28 +01:00
|
|
|
sodium = dependency('libsodium', 'sodium', required : true)
|
2024-03-10 04:29:51 +01:00
|
|
|
deps += sodium
|
|
|
|
|
|
|
|
curl = dependency('libcurl', 'curl', required : true)
|
|
|
|
deps += curl
|
|
|
|
|
|
|
|
editline = dependency('libeditline', 'editline', version : '>=1.14', required : true)
|
|
|
|
deps += editline
|
|
|
|
|
|
|
|
lowdown = dependency('lowdown', version : '>=0.9.0', required : true)
|
|
|
|
deps += lowdown
|
|
|
|
|
2024-03-18 16:22:28 +01:00
|
|
|
rapidcheck = dependency('rapidcheck', required : false)
|
|
|
|
deps += rapidcheck
|
|
|
|
|
|
|
|
gtest = dependency('gtest', required : false)
|
|
|
|
deps += gtest
|
|
|
|
|
2024-03-10 04:29:51 +01:00
|
|
|
#
|
|
|
|
# Build-time tools
|
|
|
|
#
|
|
|
|
bash = find_program('bash')
|
2024-03-18 16:22:28 +01:00
|
|
|
sandbox_shell = get_option('sandbox-shell')
|
|
|
|
# Consider it required if we're on Linux and the user explicitly specified a non-default value.
|
|
|
|
sandbox_shell_required = sandbox_shell != 'busybox' and host_machine.system() == 'linux'
|
|
|
|
# NOTE(Qyriad): package.nix puts busybox in buildInputs for Linux.
|
|
|
|
# Most builds should not require setting this.
|
|
|
|
busybox = find_program(sandbox_shell, required : sandbox_shell_required)
|
|
|
|
if not busybox.found() and host_machine.system() == 'linux'
|
|
|
|
warning('busybox not found and other sandbox shell was specified')
|
|
|
|
warning('a sandbox shell is recommended on Linux -- configure with -Dsandbox-shell=/path/to/shell to set')
|
|
|
|
endif
|
|
|
|
# FIXME(Qyriad): the autoconf system checks that busybox has the "standalone" feature, indicating
|
|
|
|
# that busybox sh won't run busybox applets as builtins (which would break out sandbox).
|
2024-03-10 04:29:51 +01:00
|
|
|
lsof = find_program('lsof')
|
|
|
|
|
|
|
|
# This is how Nix does generated headers...
|
|
|
|
# FIXME(Qyriad): do we really need to use the shell for this?
|
|
|
|
gen_header = generator(
|
|
|
|
bash,
|
|
|
|
arguments : [
|
|
|
|
'-c',
|
|
|
|
'echo \'R"__NIX_STR(\' | cat - @INPUT@ && echo \')__NIX_STR"\'',
|
|
|
|
],
|
|
|
|
capture : true,
|
|
|
|
output : '@PLAINNAME@.gen.hh',
|
|
|
|
)
|
|
|
|
|
|
|
|
#
|
|
|
|
# Configuration
|
|
|
|
#
|
|
|
|
|
|
|
|
# FIXME(Qyriad): at least do this in the build directory
|
|
|
|
run_command('ln', '-s', 'bla', 'tmp_link', check : true)
|
|
|
|
can_link_symlink = run_command('ln', 'tmp_link', 'tmp_link2', check : false).returncode() == 0
|
|
|
|
run_command('rm', '-f', 'tmp_link', 'tmp_link2', check : true)
|
|
|
|
message('possible to create a link to a symlink:', can_link_symlink)
|
|
|
|
configdata += { 'CAN_LINK_SYMLINK': can_link_symlink.to_int() }
|
|
|
|
|
|
|
|
check_headers = [
|
|
|
|
# I can't use dictionaries here as they can only contain identifier-strings.
|
|
|
|
['aws/s3/S3Client.h', aws_s3]
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach headerspec : check_headers
|
|
|
|
key = headerspec[0]
|
|
|
|
value = headerspec[1]
|
|
|
|
define_name = 'HAVE_' + key.underscorify().to_upper()
|
|
|
|
define_value = cxx.check_header(key, dependencies : value).to_int()
|
|
|
|
configdata += { define_name: define_value }
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
check_funcs = [
|
|
|
|
'lchown',
|
|
|
|
'lutimes',
|
|
|
|
'pipe2',
|
|
|
|
'posix_fallocate',
|
|
|
|
'statvfs',
|
|
|
|
'strsignal',
|
|
|
|
'sysconf',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach funcspec : check_funcs
|
|
|
|
define_name = 'HAVE_' + funcspec.underscorify().to_upper()
|
|
|
|
define_value = cxx.has_function(funcspec).to_int()
|
|
|
|
configdata += {
|
|
|
|
define_name: define_value,
|
|
|
|
}
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
has_pubsetbuf = cxx.compiles('''
|
|
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
static char buf[1024];
|
|
|
|
decltype(cerr.rdbuf()->pubsetbuf(buf, sizeof(buf))) _;
|
|
|
|
''')
|
|
|
|
message('have function "\x1b[1mstd::basic_streambuf::pubsetbuf\x1b[0m" :', has_pubsetbuf)
|
|
|
|
configdata += {
|
|
|
|
'HAVE_PUBSETBUF': has_pubsetbuf.to_int(),
|
|
|
|
}
|
|
|
|
|
|
|
|
configdata += {
|
|
|
|
'ENABLE_S3': aws_s3.found().to_int(),
|
|
|
|
}
|
|
|
|
|
|
|
|
configure_file(
|
|
|
|
configuration : {
|
|
|
|
'PACKAGE_NAME': '"' + meson.project_name() + '"',
|
|
|
|
'PACKAGE_VERSION': '"' + meson.project_version() + '"',
|
|
|
|
'PACKAGE_TARNAME': '"' + meson.project_name() + '"',
|
|
|
|
'PACKAGE_STRING': '"' + meson.project_name() + ' ' + meson.project_version() + '"',
|
|
|
|
'HAVE_STRUCT_DIRENT_D_TYPE': 1, # FIXME: actually check this for solaris
|
|
|
|
'SYSTEM': '"' + host_system + '"',
|
|
|
|
} + configdata,
|
|
|
|
output : 'config.h',
|
|
|
|
)
|
|
|
|
|
|
|
|
add_project_arguments(
|
|
|
|
# TODO(Qyriad): Yes this is how the autoconf+Make system did it.
|
|
|
|
# I would love to remove this.
|
|
|
|
'-include', 'config.h',
|
|
|
|
'-Wno-deprecated-declarations',
|
2024-03-18 16:22:28 +01:00
|
|
|
'-Wimplicit-fallthrough',
|
|
|
|
'-Werror=switch',
|
|
|
|
'-Werror=switch-enum',
|
2024-03-10 04:29:51 +01:00
|
|
|
language : 'cpp',
|
|
|
|
)
|
|
|
|
|
|
|
|
add_project_link_arguments(
|
2024-03-18 16:22:28 +01:00
|
|
|
'-pthread',
|
|
|
|
# FIXME(Qyriad): autoconf did this only if not Darwin, Solaris, or FreeBSD
|
|
|
|
# (...so only if Linux?)
|
2024-03-10 04:29:51 +01:00
|
|
|
'-Wl,--no-copy-dt-needed-entries',
|
|
|
|
language : 'cpp',
|
|
|
|
)
|
|
|
|
|
|
|
|
subdir('src')
|