aboutsummaryrefslogtreecommitdiff
path: root/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build287
1 files changed, 287 insertions, 0 deletions
diff --git a/meson.build b/meson.build
new file mode 100644
index 000000000..73c13582b
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,287 @@
+#
+# OUTLINE:
+#
+# The top-level meson.build file (this file) handles general logic for build options,
+# generation of config.h (which is put in the build directory, not the source root
+# like the previous, autoconf-based build system did), the mechanism for header
+# generation, and the few global C++ compiler arguments that are added to all targets in Lix.
+#
+# src/meson.build coordinates each of Lix's subcomponents (the lib dirs in ./src),
+# which each have their own meson.build. Lix's components depend on each other,
+# so each of `src/lib{util,store,fetchers,expr,main,cmd}/meson.build` rely on variables
+# set in earlier `meson.build` files. Each of these also defines the install targets for
+# their headers.
+#
+# src/meson.build also collects the miscellaneous source files that are in further subdirectories
+# that become part of the final Nix command (things like `src/nix-build/*.cc`).
+#
+# Finally, src/nix/meson.build defines the Nix command itself, relying on all prior meson files.
+
+project('lix', 'cpp',
+ version : run_command('bash', '-c', 'echo -n $(cat ./.version)$VERSION_SUFFIX', check : true).stdout().strip(),
+ default_options : [
+ 'cpp_std=c++2a',
+ # TODO(Qyriad): increase the warning level
+ 'warning_level=1',
+ 'debug=true',
+ 'optimization=2',
+ ],
+)
+
+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',
+ 'libdir',
+ 'includedir',
+ # 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
+
+cxx = meson.get_compiler('cpp')
+
+host_system = host_machine.cpu_family() + '-' + host_machine.system()
+message('canonical Nix system name:', host_system)
+
+is_linux = host_machine.system() == 'linux'
+is_x64 = host_machine.cpu_family() == 'x86_64'
+
+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 only makes sense on x86_64
+cpuid_required = is_x64 ? get_option('cpuid') : false
+cpuid = dependency('libcpuid', 'cpuid', required : cpuid_required)
+configdata += {
+ 'HAVE_LIBCPUID': cpuid.found().to_int(),
+}
+deps += cpuid
+
+# seccomp only makes sense on Linux
+seccomp_required = is_linux ? get_option('seccomp-sandboxing') : false
+seccomp = dependency('libseccomp', 'seccomp', required : seccomp_required)
+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 : false)
+if aws_sdk.found()
+ # The AWS pkg-config adds -std=c++11.
+ # https://github.com/aws/aws-sdk-cpp/issues/2673
+ 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 : false)
+if aws_s3.found()
+ # The AWS pkg-config adds -std=c++11.
+ # https://github.com/aws/aws-sdk-cpp/issues/2673
+ aws_s3 = aws_s3.partial_dependency(
+ compile_args : false,
+ includes : true,
+ link_args : true,
+ links : true,
+ sources : true,
+ )
+ deps += aws_s3
+endif
+
+configdata += {
+ 'ENABLE_S3': aws_s3.found().to_int(),
+}
+
+sqlite = dependency('sqlite3', 'sqlite', version : '>=3.6.19', required : true)
+deps += sqlite
+
+sodium = dependency('libsodium', 'sodium', required : true)
+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
+
+rapidcheck = dependency('rapidcheck', required : false)
+deps += rapidcheck
+
+gtest = dependency('gtest', required : false)
+deps += gtest
+
+#
+# Build-time tools
+#
+bash = find_program('bash')
+
+# Used to workaround https://github.com/mesonbuild/meson/issues/2320 in src/nix/meson.build.
+installcmd = find_program('install')
+
+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, native : false)
+if not busybox.found() and host_machine.system() == 'linux' and sandbox_shell_required
+ 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 our sandbox).
+
+lsof = find_program('lsof')
+bison = find_program('bison')
+flex = find_program('flex')
+
+# 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
+#
+
+run_command('ln', '-s',
+ meson.project_build_root() / '__nothing_link_target',
+ meson.project_build_root() / '__nothing_symlink',
+ check : true,
+)
+can_link_symlink = run_command('ln',
+ meson.project_build_root() / '__nothing_symlink',
+ meson.project_build_root() / '__nothing_hardlink',
+ check : false,
+).returncode() == 0
+run_command('rm', '-f',
+ meson.project_build_root() / '__nothing_symlink',
+ meson.project_build_root() / '__nothing_hardlink',
+ check : true,
+)
+summary('can hardlink to symlink', can_link_symlink, bool_yn : true)
+configdata += { 'CAN_LINK_SYMLINK': can_link_symlink.to_int() }
+
+
+# Check for each of these functions, and create a define like `#define HAVE_LCHOWN 1`.
+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
+
+config_h = 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',
+)
+
+install_headers(config_h, subdir : 'nix')
+
+add_project_arguments(
+ # TODO(Qyriad): Yes this is how the autoconf+Make system did it.
+ # It would be nice for our headers to be idempotent instead.
+ '-include', 'config.h',
+ '-Wno-deprecated-declarations',
+ '-Wimplicit-fallthrough',
+ '-Werror=switch',
+ '-Werror=switch-enum',
+ language : 'cpp',
+)
+
+add_project_link_arguments('-pthread', language : 'cpp')
+if cxx.get_linker_id() in ['ld.bfd', 'ld.gold']
+ add_project_link_arguments('-Wl,--no-copy-dt-needed-entries', language : 'cpp')
+endif
+
+subdir('src')