about summary refs log tree commit diff
path: root/third_party
diff options
context:
space:
mode:
authorp01arst0rm <polar@ever3st.com>2019-10-21T16·57+0100
committerVincent Ambo <tazjin@google.com>2020-05-17T14·55+0100
commit055139ac6aaecc7193972b65d2bcca022969c61d (patch)
tree3fb9b6c3aee1a06a40ee3edda1c41ff7df95a9ab /third_party
parentc455f7a987fff8fef459d340865368b1da28cecd (diff)
feat(3p/nix): added meson support r/726
(cherry picked from commit 086a81b7a5bbe1fc022efb5935ff68f6ad71ddaf)
Diffstat (limited to 'third_party')
-rw-r--r--third_party/nix/.gitignore1
-rwxr-xr-xthird_party/nix/bootstrap-ac.sh4
-rwxr-xr-xthird_party/nix/bootstrap-meson.sh8
-rw-r--r--third_party/nix/corepkgs/meson.build58
-rw-r--r--third_party/nix/doc/manual/meson.build5
-rw-r--r--third_party/nix/doc/meson.build13
-rw-r--r--third_party/nix/m4/ax_boost_base.m4302
-rw-r--r--third_party/nix/meson.build541
-rw-r--r--third_party/nix/meson_options.txt192
-rw-r--r--third_party/nix/misc/launchd/meson.build19
-rw-r--r--third_party/nix/misc/meson.build13
-rw-r--r--third_party/nix/misc/systemd/meson.build26
-rw-r--r--third_party/nix/misc/systemv/meson.build8
-rw-r--r--third_party/nix/misc/upstart/meson.build26
-rw-r--r--third_party/nix/scripts/meson.build74
-rw-r--r--third_party/nix/src/libexpr/meson.build130
-rw-r--r--third_party/nix/src/libmain/meson.build79
-rw-r--r--third_party/nix/src/libstore/meson.build170
-rw-r--r--third_party/nix/src/libstore/remote-store.cc2
-rw-r--r--third_party/nix/src/libutil/meson.build106
-rw-r--r--third_party/nix/src/libutil/util.cc4
-rw-r--r--third_party/nix/src/meson.build48
-rwxr-xr-xthird_party/nix/src/nix-build/nix-build.cc2
-rw-r--r--third_party/nix/src/nix/main.cc3
-rw-r--r--third_party/nix/src/nix/meson.build152
-rw-r--r--third_party/nix/src/resolve-system-dependencies/meson.build58
-rw-r--r--third_party/nix/tests/meson.build5
27 files changed, 2045 insertions, 4 deletions
diff --git a/third_party/nix/.gitignore b/third_party/nix/.gitignore
index b75c5d4890..6009737eec 100644
--- a/third_party/nix/.gitignore
+++ b/third_party/nix/.gitignore
@@ -9,6 +9,7 @@ perl/Makefile.config
 /nix.spec
 /stamp-h1
 /svn-revision
+/build-gcc
 /libtool
 
 /corepkgs/config.nix
diff --git a/third_party/nix/bootstrap-ac.sh b/third_party/nix/bootstrap-ac.sh
new file mode 100755
index 0000000000..e3e2593516
--- /dev/null
+++ b/third_party/nix/bootstrap-ac.sh
@@ -0,0 +1,4 @@
+#! /bin/sh -e
+rm -f aclocal.m4
+mkdir -p config
+exec autoreconf -vfi
diff --git a/third_party/nix/bootstrap-meson.sh b/third_party/nix/bootstrap-meson.sh
new file mode 100755
index 0000000000..4515789d6f
--- /dev/null
+++ b/third_party/nix/bootstrap-meson.sh
@@ -0,0 +1,8 @@
+#! /usr/bin/env bash
+
+rm -rf build*
+meson build-gcc
+
+cd build-gcc
+ninja -j2
+
diff --git a/third_party/nix/corepkgs/meson.build b/third_party/nix/corepkgs/meson.build
new file mode 100644
index 0000000000..57add8d65f
--- /dev/null
+++ b/third_party/nix/corepkgs/meson.build
@@ -0,0 +1,58 @@
+# Nix corepkgs build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+
+corepkgs_data = files(
+    join_paths(meson.source_root(), 'corepkgs/buildenv.nix'),
+    join_paths(meson.source_root(), 'corepkgs/derivation.nix'),
+    join_paths(meson.source_root(), 'corepkgs/fetchurl.nix'),
+    join_paths(meson.source_root(), 'corepkgs/imported-drv-to-derivation.nix'),
+    join_paths(meson.source_root(), 'corepkgs/unpack-channel.nix'))
+
+
+
+
+
+# targets
+#============================================================================
+
+
+config_nix = configuration_data()
+config_nix.set('bash', bash.path())
+config_nix.set('coreutils', coreutils)
+config_nix.set('bzip2', bzip2.path())
+config_nix.set('gzip', gzip.path())
+config_nix.set('xz', xz.path())
+config_nix.set('tar', tar.path())
+config_nix.set('tarFlags', '')
+config_nix.set('tr', tr.path())
+config_nix.set('bindir', bindir)
+config_nix.set('prefix', prefix)
+config_nix.set('libexecdir', libexecdir)
+config_nix.set('localstatedir', localstatedir)
+config_nix.set('sysconfdir', sysconfdir)
+config_nix.set('storedir', nixstoredir)
+
+
+
+
+
+# build
+#============================================================================
+
+
+corepkgs_data += configure_file(
+    input : 'config.nix.in',
+    output : 'config.nix',
+    configuration : config_nix)
+
+install_data(
+    corepkgs_data,
+    install_mode : 'rwxr-xr-x',
+    install_dir : join_paths(datadir, 'nix/corepkgs'))
diff --git a/third_party/nix/doc/manual/meson.build b/third_party/nix/doc/manual/meson.build
new file mode 100644
index 0000000000..42e0695a9a
--- /dev/null
+++ b/third_party/nix/doc/manual/meson.build
@@ -0,0 +1,5 @@
+# nix manual build file
+#============================================================================
+
+
+# TODO: generate the manual
diff --git a/third_party/nix/doc/meson.build b/third_party/nix/doc/meson.build
new file mode 100644
index 0000000000..6d90b784a5
--- /dev/null
+++ b/third_party/nix/doc/meson.build
@@ -0,0 +1,13 @@
+# nix doc build file
+#============================================================================
+
+doc_dirs = [
+  'manual'
+]
+
+if  (not get_option('disable_doc_gen'))
+    xsltproc = find_program('xsltproc', required : true)
+    foreach dir : doc_dirs
+        subdir(dir)
+    endforeach
+endif
\ No newline at end of file
diff --git a/third_party/nix/m4/ax_boost_base.m4 b/third_party/nix/m4/ax_boost_base.m4
new file mode 100644
index 0000000000..16fa69b41f
--- /dev/null
+++ b/third_party/nix/m4/ax_boost_base.m4
@@ -0,0 +1,302 @@
+# ===========================================================================
+#      https://www.gnu.org/software/autoconf-archive/ax_boost_base.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# DESCRIPTION
+#
+#   Test for the Boost C++ libraries of a particular version (or newer)
+#
+#   If no path to the installed boost library is given the macro searchs
+#   under /usr, /usr/local, /opt and /opt/local and evaluates the
+#   $BOOST_ROOT environment variable. Further documentation is available at
+#   <http://randspringer.de/boost/index.html>.
+#
+#   This macro calls:
+#
+#     AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
+#
+#   And sets:
+#
+#     HAVE_BOOST
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
+#   Copyright (c) 2009 Peter Adolphs
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 47
+
+# example boost program (need to pass version)
+m4_define([_AX_BOOST_BASE_PROGRAM],
+          [AC_LANG_PROGRAM([[
+#include <boost/version.hpp>
+]],[[
+(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))]));
+]])])
+
+AC_DEFUN([AX_BOOST_BASE],
+[
+AC_ARG_WITH([boost],
+  [AS_HELP_STRING([--with-boost@<:@=ARG@:>@],
+    [use Boost library from a standard location (ARG=yes),
+     from the specified location (ARG=<path>),
+     or disable it (ARG=no)
+     @<:@ARG=yes@:>@ ])],
+    [
+     AS_CASE([$withval],
+       [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""],
+       [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""],
+       [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"])
+    ],
+    [want_boost="yes"])
+
+
+AC_ARG_WITH([boost-libdir],
+  [AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
+    [Force given directory for boost libraries.
+     Note that this will override library path detection,
+     so use this parameter only if default library detection fails
+     and you know exactly where your boost libraries are located.])],
+  [
+   AS_IF([test -d "$withval"],
+         [_AX_BOOST_BASE_boost_lib_path="$withval"],
+    [AC_MSG_ERROR([--with-boost-libdir expected directory name])])
+  ],
+  [_AX_BOOST_BASE_boost_lib_path=""])
+
+BOOST_LDFLAGS=""
+BOOST_CPPFLAGS=""
+AS_IF([test "x$want_boost" = "xyes"],
+      [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])])
+AC_SUBST(BOOST_CPPFLAGS)
+AC_SUBST(BOOST_LDFLAGS)
+])
+
+
+# convert a version string in $2 to numeric and affect to polymorphic var $1
+AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[
+  AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"])
+  _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'`
+  _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'`
+  AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"],
+        [AC_MSG_ERROR([You should at least specify libboost major version])])
+  _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'`
+  AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"],
+        [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"])
+  _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
+  AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"],
+        [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"])
+  _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+  $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor`
+  AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET)
+])
+
+dnl Run the detection of boost should be run only if $want_boost
+AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[
+    _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1])
+    succeeded=no
+
+
+    AC_REQUIRE([AC_CANONICAL_HOST])
+    dnl On 64-bit systems check for system libraries in both lib64 and lib.
+    dnl The former is specified by FHS, but e.g. Debian does not adhere to
+    dnl this (as it rises problems for generic multi-arch support).
+    dnl The last entry in the list is chosen by default when no libraries
+    dnl are found, e.g. when only header-only libraries are installed!
+    AS_CASE([${host_cpu}],
+      [x86_64],[libsubdirs="lib64 libx32 lib lib64"],
+      [mips*64*],[libsubdirs="lib64 lib32 lib lib64"],
+      [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64],[libsubdirs="lib64 lib lib64"],
+      [libsubdirs="lib"]
+    )
+
+    dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
+    dnl them priority over the other paths since, if libs are found there, they
+    dnl are almost assuredly the ones desired.
+    AS_CASE([${host_cpu}],
+      [i?86],[multiarch_libsubdir="lib/i386-${host_os}"],
+      [multiarch_libsubdir="lib/${host_cpu}-${host_os}"]
+    )
+
+    dnl first we check the system location for boost libraries
+    dnl this location ist chosen if boost libraries are installed with the --layout=system option
+    dnl or if you install boost with RPM
+    AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[
+        AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"])
+         AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[
+           AC_MSG_RESULT([yes])
+           BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
+           for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
+                AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"])
+                AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[
+                        AC_MSG_RESULT([yes])
+                        BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
+                        break;
+                ],
+      [AC_MSG_RESULT([no])])
+           done],[
+      AC_MSG_RESULT([no])])
+    ],[
+        if test X"$cross_compiling" = Xyes; then
+            search_libsubdirs=$multiarch_libsubdir
+        else
+            search_libsubdirs="$multiarch_libsubdir $libsubdirs"
+        fi
+        for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
+            if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
+                for libsubdir in $search_libsubdirs ; do
+                    if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
+                done
+                BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
+                BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
+                break;
+            fi
+        done
+    ])
+
+    dnl overwrite ld flags if we have required special directory with
+    dnl --with-boost-libdir parameter
+    AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"],
+          [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"])
+
+    AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)])
+    CPPFLAGS_SAVED="$CPPFLAGS"
+    CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+    export CPPFLAGS
+
+    LDFLAGS_SAVED="$LDFLAGS"
+    LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
+    export LDFLAGS
+
+    AC_REQUIRE([AC_PROG_CXX])
+    AC_LANG_PUSH(C++)
+        AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
+        AC_MSG_RESULT(yes)
+    succeeded=yes
+    found_system=yes
+        ],[
+        ])
+    AC_LANG_POP([C++])
+
+
+
+    dnl if we found no boost with system layout we search for boost libraries
+    dnl built and installed without the --layout=system option or for a staged(not installed) version
+    if test "x$succeeded" != "xyes" ; then
+        CPPFLAGS="$CPPFLAGS_SAVED"
+        LDFLAGS="$LDFLAGS_SAVED"
+        BOOST_CPPFLAGS=
+        if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
+            BOOST_LDFLAGS=
+        fi
+        _version=0
+        if test -n "$_AX_BOOST_BASE_boost_path" ; then
+            if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
+                for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
+                    _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
+                    V_CHECK=`expr $_version_tmp \> $_version`
+                    if test "x$V_CHECK" = "x1" ; then
+                        _version=$_version_tmp
+                    fi
+                    VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
+                    BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
+                done
+                dnl if nothing found search for layout used in Windows distributions
+                if test -z "$BOOST_CPPFLAGS"; then
+                    if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
+                        BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
+                    fi
+                fi
+                dnl if we found something and BOOST_LDFLAGS was unset before
+                dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here.
+                if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
+                    for libsubdir in $libsubdirs ; do
+                        if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
+                    done
+                    BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
+                fi
+            fi
+        else
+            if test "x$cross_compiling" != "xyes" ; then
+                for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
+                    if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
+                        for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
+                            _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
+                            V_CHECK=`expr $_version_tmp \> $_version`
+                            if test "x$V_CHECK" = "x1" ; then
+                                _version=$_version_tmp
+                                best_path=$_AX_BOOST_BASE_boost_path
+                            fi
+                        done
+                    fi
+                done
+
+                VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
+                BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
+                if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
+                    for libsubdir in $libsubdirs ; do
+                        if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
+                    done
+                    BOOST_LDFLAGS="-L$best_path/$libsubdir"
+                fi
+            fi
+
+            if test -n "$BOOST_ROOT" ; then
+                for libsubdir in $libsubdirs ; do
+                    if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
+                done
+                if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
+                    version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
+                    stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
+                        stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
+                    V_CHECK=`expr $stage_version_shorten \>\= $_version`
+                    if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
+                        AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
+                        BOOST_CPPFLAGS="-I$BOOST_ROOT"
+                        BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
+                    fi
+                fi
+            fi
+        fi
+
+        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+        export CPPFLAGS
+        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
+        export LDFLAGS
+
+        AC_LANG_PUSH(C++)
+            AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
+            AC_MSG_RESULT(yes)
+        succeeded=yes
+        found_system=yes
+            ],[
+            ])
+        AC_LANG_POP([C++])
+    fi
+
+    if test "x$succeeded" != "xyes" ; then
+        if test "x$_version" = "x0" ; then
+            AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option.  If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
+        else
+            AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
+        fi
+        # execute ACTION-IF-NOT-FOUND (if present):
+        ifelse([$3], , :, [$3])
+    else
+        AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
+        # execute ACTION-IF-FOUND (if present):
+        ifelse([$2], , :, [$2])
+    fi
+
+    CPPFLAGS="$CPPFLAGS_SAVED"
+    LDFLAGS="$LDFLAGS_SAVED"
+
+])
diff --git a/third_party/nix/meson.build b/third_party/nix/meson.build
new file mode 100644
index 0000000000..2d1a481bc6
--- /dev/null
+++ b/third_party/nix/meson.build
@@ -0,0 +1,541 @@
+# Nix project build file
+#============================================================================
+
+
+
+
+# init
+#============================================================================
+
+
+# init project
+#-------------------------------------------------
+project(
+    'nix',
+    'cpp',
+    
+    default_options : [
+        'cpp_std=c++17',
+        'warning_level=3'
+    ],
+    version : run_command('cat', './.version').stdout().strip(),
+    license : 'MIT'
+)
+
+# init compiler 
+#-------------------------------------------------
+cpp = meson.get_compiler('cpp')
+
+add_project_arguments('-g', '-Wdeprecated', '-Wno-non-virtual-dtor', '-include', 'config.h', language : 'cpp')
+add_project_link_arguments(get_option('ldflags'), language: 'cpp')
+
+
+cmake = import('cmake')
+pkg = import('pkgconfig')
+
+
+
+
+# init configuration
+#-------------------------------------------------
+config_h = configuration_data()
+
+config_h.set(
+    'HAVE_CXX17', 1,
+    description : 'define if the compiler supports basic C++17 syntax')
+
+package_name = meson.project_name()
+config_h.set_quoted(
+    'PACKAGE_NAME', package_name,
+    description : 'Define to the full name of this package.'
+    )
+
+package_tarname = meson.project_name()
+config_h.set_quoted(
+    'PACKAGE_TARNAME', package_tarname,
+    description : 'Define to the one symbol short name of this package.')
+
+package_version = meson.project_version()
+config_h.set_quoted(
+    'PACKAGE_VERSION', package_version,
+    description : 'Define to the version of this package.')
+
+package_string = '@0@ @1@'.format(package_name, package_version)
+config_h.set_quoted(
+    'PACKAGE_STRING', package_string,
+    description : 'Define to the full name and version of this package.')
+
+package_url = 'https://nixos.org/nix/'
+config_h.set_quoted(
+    'PACKAGE_URL', package_url,
+    description : 'Define to the home page for this package.')
+
+package_bug_url = 'https://github.com/nixos/nix/issues'
+config_h.set_quoted(
+    'PACKAGE_BUGREPORT', package_bug_url,
+    description : 'Define to the address where bug reports for this package should be sent.')
+
+
+
+
+# env
+#============================================================================
+
+
+# set install directories
+#-------------------------------------------------
+prefix = get_option('prefix')
+libdir = join_paths(prefix, get_option('libdir'))
+bindir = join_paths(prefix, get_option('bindir'))
+datadir = join_paths(prefix, get_option('datadir'))
+sysconfdir = join_paths(prefix, get_option('sysconfdir'))
+libexecdir = join_paths(prefix, get_option('libexecdir'))
+mandir = join_paths(prefix, get_option('mandir'))
+includedir = join_paths(prefix, get_option('includedir'))
+
+# set nix directories
+#-------------------------------------------------
+
+# State should be stored in /nix/var, unless the user overrides it explicitly.
+if get_option('normal_var')
+    localstatedir = '/nix/var'
+else
+    localstatedir =  join_paths(prefix, get_option('localstatedir'))
+endif
+
+nixstoredir = get_option('nixstoredir')
+
+profiledir =  join_paths(sysconfdir, 'profile.d')
+
+# Construct a Nix system name (like "i686-linux").
+#-------------------------------------------------
+machine_name = host_machine.cpu()
+sys_name = host_machine.system().to_lower()
+
+cpu_archs = ['x86_64', 'armv6', 'armv7', '']
+
+foreach cpu : cpu_archs 
+    if (host_machine.cpu().contains(cpu))
+        if cpu.contains('armv')
+            machine_name = cpu + '1'
+        else
+            machine_name = cpu
+        endif
+        break
+    endif
+endforeach
+
+system= '"' + machine_name + '-' + sys_name + '"'
+message('system name: ' + system)
+config_h.set(
+    'SYSTEM', system,
+    description : 'platform identifier (`cpu-os`)')
+
+
+# Check whether the store optimiser can optimise symlinks.
+#-------------------------------------------------
+gen_header = '''
+ln -s bla tmp_link
+if ln tmp_link tmp_link2 2> /dev/null; then
+    echo 1
+else
+    echo 0
+fi
+'''
+
+
+run_command('sh', '-c', 'rm tmp_link*') 
+can_link_symlink = run_command('sh', '-c', gen_header).stdout().strip()
+if can_link_symlink.to_int() == 1
+    run_command('sh', '-c', 'rm tmp_link*') 
+endif 
+
+config_h.set('CAN_LINK_SYMLINK', can_link_symlink,
+description : 'Whether link() works on symlinks')
+
+
+
+# checking headers
+#============================================================================
+
+if (cpp.has_header('sys/stat.h'))
+    config_h.set(
+        'HAVE_SYS_STAT_H', 1,
+        description : 'Define to 1 if you have the <sys/stat.h> header file.')
+endif
+
+if (cpp.has_header('sys/types.h'))
+    config_h.set(
+        'HAVE_SYS_TYPES_H', 1,
+        description : 'Define to 1 if you have the <sys/types.h> header file.')
+endif
+
+if (cpp.has_header('sys/dir.h'))
+    config_h.set(
+        'HAVE_DIR_H', 1,
+        description : 'Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR`')
+endif
+
+if (cpp.has_header('sys/ndir.h'))
+    config_h.set(
+        'HAVE_NDIR_H', 1,
+        description : 'Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR`')
+endif
+
+if (cpp.has_header('dirent.h'))
+    config_h.set(
+        'HAVE_DIRENT_H', 1,
+        description : 'Define to 1 if you have the <dirent.h> header file, and it defines `DIR`')
+endif
+
+if (cpp.has_header('locale.h'))
+    config_h.set(
+        'HAVE_LOCALE', 1,
+        description : 'Define to 1 if you have the <locale.h> header file.')
+endif
+
+if (cpp.has_header('unistd.h'))
+    config_h.set(
+        'HAVE_UNISTD_H', 1,
+        description: 'Define to 1 if you have the <unistd.h> header file.')
+endif
+
+if (cpp.has_header('stdint.h'))
+    config_h.set(
+        'HAVE_STDINT_H', 1,
+        description: 'Define to 1 if you have the <stdint.h> header file.')
+endif
+
+if (cpp.has_header('stdlib.h'))
+    config_h.set(
+        'HAVE_STDLIB_H', 1,
+        description: 'Define to 1 if you have the <stdlib.h> header file.')
+endif
+
+if (cpp.has_header('strings.h'))
+    config_h.set(
+        'HAVE_STRINGS_H', 1,
+        description: 'Define to 1 if you have the <strings.h> header file.')
+endif
+
+if (cpp.has_header('string.h'))
+    config_h.set(
+        'HAVE_STRING_H', 1,
+        description: 'Define to 1 if you have the <strings.h> header file.')
+endif
+
+if (cpp.has_header('bzlib.h'))
+    config_h.set(
+        'HAVE_BZLIB_H', 1,
+        description : 'Define to 1 if you have the <bzlib.h> header file.')
+endif
+
+if (cpp.has_header('inttypes.h'))
+    config_h.set(
+        'HAVE_INTTYPES_H', 1,
+        description : 'Define to 1 if you have the <inttypes.h> header file.')
+endif
+
+if (cpp.has_header('memory.h'))
+    config_h.set(
+        'HAVE_MEMORY_H', 1,
+        description : 'Define to 1 if you have the <memory.h> header file.')
+endif
+
+if (cpp.has_header('editline.h'))
+    config_h.set(
+        'HAVE_EDITLINE_H', 1,
+        description : 'Define to 1 if you have the <editline.h> header file.')
+else
+    error('Nix requires editline.h; however the header was not found.')
+endif
+
+
+
+
+# checking functions
+#============================================================================
+
+
+if (cpp.has_function('lutimes'))
+    config_h.set(
+        'HAVE_LUTIMES', 1,
+        description : 'Define to 1 if you have the `lutimes` function.')
+endif
+
+if (cpp.has_function('lchown'))
+    config_h.set(
+        'HAVE_LCHOWN', 1,
+        description : 'Define to 1 if you have the `lchown` function.')
+endif
+
+if (cpp.has_function('pipe2'))
+    config_h.set(
+        'HAVE_PIPE2', 1,
+        description : 'Define to 1 if you have the `pipe2` function.')
+endif
+
+if (cpp.has_function('posix_fallocate'))
+    config_h.set(
+        'HAVE_POSIX_FALLOCATE', 1,
+        description : 'Define to 1 if you have the `posix_fallocate` function.')
+endif
+
+if (cpp.has_function('setresuid'))
+    config_h.set(
+        'HAVE_SETRESUID', 1,
+        description : 'Define to 1 if you have the `setresuid` function.')
+endif
+
+if (cpp.has_function('setreuid'))
+    config_h.set(
+        'HAVE_SETREUID', 1,
+        description : 'Define to 1 if you have the `setreuid` function.')
+endif
+
+if (cpp.has_function('statvfs'))
+    config_h.set(
+        'HAVE_STATVFS', 1,
+        description : 'Define to 1 if you have the `statvfs` function.')
+endif
+
+if (cpp.has_function('strsignal'))
+    config_h.set(
+        'HAVE_STRSIGNAL', 1,
+        description : 'Define to 1 if you have the `strsignal` function.')
+endif
+
+if (cpp.has_function('sysconf'))
+    config_h.set(
+        'HAVE_SYSCONF', 1,
+        description : 'Define to 1 if you have the `sysconf` function.')
+endif
+
+pubsetbuff_c = '''
+    #include <iostream>
+    using namespace std;
+    static char buf[1024];
+    void func() {
+    cerr.rdbuf()->pubsetbuf(buf, sizeof(buf));
+    }'''
+
+if meson.get_compiler('cpp').compiles(
+    pubsetbuff_c,
+    name : 'pubsetbuf'
+  )
+    config_h.set(
+        'HAVE_PUBSETBUF', 1,
+        description : 'Define to 1 if you have the `pubsetbuf` function.')
+endif
+
+# required dependancies
+#============================================================================
+
+
+# look for required programs
+#--------------------------------------------------
+cat = find_program('cat', required : true)
+bash = find_program('bash', required : true)
+echo = find_program('echo', required : true)
+patch = find_program('patch', required : true)
+xmllint = find_program('xmllint', required : true)
+flex = find_program('flex', required : true)
+bison = find_program('bison', required : true)
+sed = find_program('sed', required : true)
+tar = find_program('tar', required : true)
+bzip2 = find_program('bzip2', required : true)
+gzip = find_program('gzip', required : true)
+xz = find_program('xz', required : true)
+dot = find_program('dot', required : true)
+lsof = find_program('lsof', required : true)
+tr = find_program('tr', required : true)
+coreutils = run_command('dirname', cat.path()).stdout().strip()
+
+
+# Look for boost, a required dependency.
+#--------------------------------------------------
+boost_dep = declare_dependency(
+    dependencies : [
+        cpp.find_library('libboost_system', dirs : libdir),
+        cpp.find_library('libboost_context', dirs : libdir),
+        cpp.find_library('libboost_thread', dirs : libdir)],
+    link_args :  get_option('boost_link_args'))
+
+if (boost_dep.found())
+    config_h.set('HAVE_BOOST', 1, description : 'define if the Boost library is available.')
+endif
+
+
+# Look for liblzma, a required dependency.
+#--------------------------------------------------
+liblzma_dep = declare_dependency(
+    dependencies: dependency('liblzma'),
+    link_args :  get_option('lzma_link_args'))
+
+
+# Look for libbrotli{enc,dec}.
+#--------------------------------------------------
+libbrotli_dep = declare_dependency(
+    dependencies: [
+        dependency('libbrotlienc'),
+        dependency('libbrotlidec')],
+    link_args :  get_option('brotli_link_args'))
+
+
+# Look for OpenSSL, a required dependency.
+#--------------------------------------------------
+openssl_dep = declare_dependency(
+    dependencies: cpp.find_library('libssl', dirs : libdir),
+    link_args :  get_option('openssl_link_args'))
+
+
+# Look for SQLite, a required dependency.
+#--------------------------------------------------
+sqlite3_dep = declare_dependency(
+    dependencies : dependency('sqlite3', version : '>= 3.6.19'),
+    link_args : get_option('sqlite3_link_args'))
+
+
+# Look for libcurl, a required dependency.
+#--------------------------------------------------
+libcurl_dep = declare_dependency(
+    dependencies : dependency('libcurl'),
+    link_args :  get_option('curl_link_args'))
+
+
+# Look for pthread, a required dependency.
+#--------------------------------------------------
+pthread_dep = declare_dependency(
+    dependencies : dependency('threads'),
+    link_args :  get_option('pthread_link_args'))
+
+
+# Look for libdl, a required dependency.
+#--------------------------------------------------
+libdl_dep = declare_dependency(
+    dependencies : cpp.find_library('dl', dirs : libdir),
+    link_args :  get_option('dl_link_args'))
+
+
+# Look for libbz2, a required dependency.
+#--------------------------------------------------
+libbz2_dep = declare_dependency(
+    dependencies : cpp.find_library('bz2', dirs : libdir),
+    link_args :  get_option('bz2_link_args'))
+
+
+# Look for editline, a required dependency.
+#--------------------------------------------------
+# NOTE: The the libeditline.pc file was added only in libeditline >= 1.15.2, see 
+# https://github.com/troglobit/editline/commit/0a8f2ef4203c3a4a4726b9dd1336869cd0da8607,
+# but e.g. Ubuntu 16.04 has an older version, so we fall back to searching for
+# editline.h when the pkg-config approach fails.
+
+editline_dep = declare_dependency(
+    dependencies : cpp.find_library('libeditline'),
+    link_args :  get_option('editline_link_args'))
+
+if not (
+    cpp.has_function(
+        'read_history',
+        prefix : '#include <stdio.h>\n#include "editline.h"',
+        args : '-lreadline'))
+    warning('Nix requires libeditline; However, required functions do not work. Maybe ' +\
+    'it is too old? >= 1.14 is required.')
+endif
+
+
+
+
+# Optional dependancies
+#============================================================================
+
+
+# Look for libsodium, an optional dependency.
+#--------------------------------------------------
+if (get_option('with_libsodium'))
+    libsodium_dep = declare_dependency(
+        dependencies : cpp.find_library('libsodium', dirs : libdir),
+        link_args :  get_option('sodium_link_args'))
+    config_h.set('HAVE_SODIUM', 1, description : 'Whether to use libsodium for cryptography.')
+else
+    libsodium_dep = declare_dependency()
+endif
+
+
+# Look for Boehm garbage collector, an optional dependency.
+#--------------------------------------------------
+if (get_option('with_gc'))
+    gc_dep = declare_dependency(
+        dependencies : dependency('bdw-gc'),
+        link_args :  get_option('sodium_link_args'))
+    config_h.set(
+        'HAVE_BOEHMGC', 1,
+        description : 'Whether to use the Boehm garbage collector.')
+else
+    gc_dep = declare_dependency()
+endif
+
+# Look for aws-cpp-sdk-s3.
+#--------------------------------------------------
+if (get_option('with_s3'))
+  enable_s3 = meson.get_compiler('cpp').check_header('aws/s3/S3Client.h')
+  
+  aws_version = meson.get_compiler('cpp').get_define(
+    'AWS_SDK_VERSION_STRING',
+    prefix : '#include <aws/core/VersionConfig.h>'
+  ).strip('"').split('.')
+  
+  conf_data.set('ENABLE_S3', 1, description : 'Whether to enable S3 support via aws-sdk-cpp.')
+  conf_data.set('AWS_VERSION_MAJOR', aws_version[0], description : 'Major version of aws-sdk-cpp.')
+  conf_data.set('AWS_VERSION_MINOR', aws_version[1], description : 'Minor version of aws-sdk-cpp.')
+endif
+
+
+
+
+# OS Specific checks 
+#============================================================================
+# Look for libsecppomp, required for Linux sandboxing.
+libseccomp_dep = ''
+if sys_name.contains('linux')
+    libseccomp_dep = dependency('libseccomp', version : '>= 2.3.1', required: false)
+    if not (libseccomp_dep.found())
+        error('Nix requires libseccomp on a linux host system')
+    endif
+    config_h.set(
+        'HAVE_SECCOMP', 1,
+        description : 'Whether seccomp is available and should be used for sandboxing.')    
+endif
+
+if (sys_name.contains('freebsd'))
+    add_project_arguments('-D_GNU_SOURCE', language : 'cpp')
+    config_h.set('_GNU_SOURCE', 1)  
+endif
+
+if (sys_name.contains('sunos'))
+    # Solaris requires -lsocket -lnsl for network functions 
+endif
+
+
+
+
+# build
+#============================================================================
+
+conf = configure_file(
+    output : 'config.h',
+    configuration : config_h)
+
+install_headers(
+    conf,
+    install_dir : join_paths(includedir, 'nix'))
+
+src_inc = [include_directories('.', 'src')]
+
+subdir('src')
+subdir('scripts')
+subdir('corepkgs')
+subdir('misc')
+subdir('doc')
+subdir('tests')
diff --git a/third_party/nix/meson_options.txt b/third_party/nix/meson_options.txt
new file mode 100644
index 0000000000..2c8bb676d4
--- /dev/null
+++ b/third_party/nix/meson_options.txt
@@ -0,0 +1,192 @@
+# Nix project build options
+#============================================================================
+
+# dirs
+#============================================================================
+
+
+option(
+    'nixstoredir',
+    type : 'string',
+    value : '/nix/store',
+    description : 'path of the Nix store (defaults to /nix/store)')
+
+# compiler args
+#============================================================================
+
+option(
+    'ldflags',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-L/usr/lib',
+        '-L/lib'],
+    description : 'Link flags')
+
+option(
+    'cflags',
+    type : 'array',
+    value : [
+        '-O3'],
+    description : 'C build flags')
+
+option(
+    'cxxflags',
+    type : 'array',
+    value : [
+        '-O3'],
+    description : 'CXX build flags')
+
+
+
+
+# link args
+#============================================================================
+
+option(
+    'boost_link_args', 
+    type : 'array', 
+    value : [
+        '-L/usr/lib64',
+        '-lboost_system',
+        '-lboost_context',
+        '-lboost_thread'], 
+    description : 'link args for boost')
+
+option(
+    'brotli_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-lbrotlienc',
+        '-lbrotlidec'],
+    description : 'link args for libbrotli')
+
+option(
+    'bz2_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-lbz2'],
+    description : 'link args for libbz2')
+
+option(
+    'curl_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-lcurl'],
+    description : 'link args for libcurl')
+
+option(
+    'dl_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-ldl'],
+    description : 'link args for libdl')
+
+option(
+    'editline_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-leditline'],
+    description : 'link args for editline_link_args')
+
+option(
+    'lzma_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-llzma'],
+    description : 'link args for liblzma')
+
+option(
+    'openssl_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-lcrypto'],
+    description : 'link args for openssl')
+
+option(
+    'pthread_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-pthread'],
+    description : 'link args for pthread')
+
+option(
+    'sodium_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-lsodium'],
+    description : 'link args for libsodium')
+
+option(
+    'sqlite3_link_args',
+    type : 'array',
+    value : [
+        '-L/usr/local/lib',
+        '-lsqlite3'],
+    description : 'link args for sqlite3')
+
+
+
+
+# optional dependancies
+#============================================================================
+
+option(
+    'with_gc',
+    type : 'boolean',
+    value : 'false',
+    description : 'build nix with Boehm garbage collector')
+
+option(
+    'with_libsodium',
+    type : 'boolean',
+    value : 'true',
+    description : 'build nix with shared libs')
+
+option(
+    'with_s3',
+    type : 'boolean',
+    value : 'false',
+    description : 'build nix with s3')
+
+option(
+    'with_coreutils_bin',
+    type : 'string',
+    description : 'path of cat, mkdir, etc.')
+
+
+
+# misc
+#============================================================================
+option(
+    'disable_doc_gen',
+    type : 'boolean',
+    value : 'false',
+    description : 'disable documentation generation')
+
+option(
+    'build_shared_libs',
+    type : 'boolean',
+    value : 'false',
+    description : 'build nix with shared libs')
+
+option(
+    'sandbox_shell',
+    type : 'string',
+    value : '/usr/bin/busybox',
+    description : 'path of a statically-linked shell to use as /bin/sh in sandboxes')
+
+option(
+    'normal_var',
+    type : 'boolean',
+    value : 'true',
+    description : 'Whether to use `/nix/var` or the user-overridable `localstatedir`.')
diff --git a/third_party/nix/misc/launchd/meson.build b/third_party/nix/misc/launchd/meson.build
new file mode 100644
index 0000000000..c7f362cdf2
--- /dev/null
+++ b/third_party/nix/misc/launchd/meson.build
@@ -0,0 +1,19 @@
+# nix launchd build file
+#============================================================================
+
+if (sys_name.contains('darwin'))
+
+    launchd_data = []
+
+    org_nixos_nix_dameon_plist = configuration_data()
+    org_nixos_nix_dameon_plist.set('bindir', bindir)
+
+    launchd_data += configure_file(
+        input : 'org.nixos.nix-daemon.plist.in',
+        output : 'org.nixos.nix-daemon.plist',
+        configuration : org_nixos_nix_dameon_plist)
+
+    install_data(
+        corepkgs_data,
+        install_dir : join_paths(prefix, 'Library/LaunchDaemons'))
+endif
diff --git a/third_party/nix/misc/meson.build b/third_party/nix/misc/meson.build
new file mode 100644
index 0000000000..0d53faf278
--- /dev/null
+++ b/third_party/nix/misc/meson.build
@@ -0,0 +1,13 @@
+# nix src build file
+#============================================================================
+
+misc_dirs = [
+  'launchd',
+  'systemd',
+  'systemv',
+  'upstart'
+]
+
+foreach dir : misc_dirs
+    subdir(dir)
+endforeach
diff --git a/third_party/nix/misc/systemd/meson.build b/third_party/nix/misc/systemd/meson.build
new file mode 100644
index 0000000000..588f0b3d9d
--- /dev/null
+++ b/third_party/nix/misc/systemd/meson.build
@@ -0,0 +1,26 @@
+# nix systemd build file
+#============================================================================
+
+if (sys_name.contains('linux'))
+
+    systemd_data = []
+
+    systemd_nix_daemon = configuration_data()
+    systemd_nix_daemon.set('bindir', bindir)
+    systemd_nix_daemon.set('storedir', nixstoredir)
+    systemd_nix_daemon.set('localstatedir', localstatedir)
+
+    systemd_data += configure_file(
+        input : 'nix-daemon.socket.in',
+        output : 'nix-daemon.socket',
+        configuration : systemd_nix_daemon)
+
+    systemd_data += configure_file(
+        input : 'nix-daemon.service.in',
+        output : 'nix-daemon.service',
+        configuration : systemd_nix_daemon)
+
+    install_data(
+        systemd_data,
+        install_dir : join_paths(prefix, 'lib/systemd/system'))
+endif
diff --git a/third_party/nix/misc/systemv/meson.build b/third_party/nix/misc/systemv/meson.build
new file mode 100644
index 0000000000..275714bf77
--- /dev/null
+++ b/third_party/nix/misc/systemv/meson.build
@@ -0,0 +1,8 @@
+# nix systemd build file
+#============================================================================
+
+systemv_data = []
+
+# install_data(
+#     systemv_data,
+#     install_dir : join_paths(prefix, 'lib/systemd/system'))
diff --git a/third_party/nix/misc/upstart/meson.build b/third_party/nix/misc/upstart/meson.build
new file mode 100644
index 0000000000..24731addd4
--- /dev/null
+++ b/third_party/nix/misc/upstart/meson.build
@@ -0,0 +1,26 @@
+# ifeq ($(OS), Linux)
+
+#   $(foreach n, nix-daemon.conf, $(eval $(call install-file-in, $(d)/$(n), $(sysconfdir)/init, 0644)))
+
+# endif
+
+
+# nix systemd build file
+#============================================================================
+
+if (sys_name.contains('linux'))
+
+    upstart_data = []
+
+    upstart_nix_daemon = configuration_data()
+    upstart_nix_daemon.set('bindir', bindir)
+
+    upstart_data += configure_file(
+        input : 'nix-daemon.conf.in',
+        output : 'nix-daemon.conf',
+        configuration : upstart_nix_daemon)
+
+    install_data(
+        upstart_data,
+        install_dir : join_paths(sysconfdir, 'init'))
+endif
diff --git a/third_party/nix/scripts/meson.build b/third_party/nix/scripts/meson.build
new file mode 100644
index 0000000000..8787a185d0
--- /dev/null
+++ b/third_party/nix/scripts/meson.build
@@ -0,0 +1,74 @@
+# Nix corepkgs build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+scripts_data = files(
+    join_paths(meson.source_root(), 'scripts/install-darwin-multi-user.sh'),
+    join_paths(meson.source_root(), 'scripts/install-multi-user.sh'))
+
+
+
+
+
+# targets
+#============================================================================
+
+nix_profile_sh = configuration_data()
+nix_profile_sh.set('localstatedir', localstatedir)
+nix_profile_sh.set('coreutils', coreutils)
+
+nix_http_export_cgi = configuration_data()
+nix_http_export_cgi.set('bindir', bindir)
+nix_http_export_cgi.set('localstatedir', localstatedir)
+nix_http_export_cgi.set('coreutils', coreutils)
+nix_http_export_cgi.set('gzip', gzip.path())
+
+nix_reduce_build = configuration_data()
+nix_reduce_build.set('bash', bash.path())
+nix_reduce_build.set('bindir', bindir)
+nix_reduce_build.set('localstatedir', localstatedir)
+
+
+# TODO: make these work
+nix_install = configuration_data()
+nix_install.set('nixVersion', package_version)
+nix_install.set('binaryTarball_x86_64-linux', '')
+nix_install.set('binaryTarball_i686-linux', '')
+nix_install.set('binaryTarball_aarch64-linux', '')
+nix_install.set('binaryTarball_x86_64-darwin', '')
+
+
+
+
+# build
+#============================================================================
+
+scripts_data += configure_file(
+    input : 'nix-profile.sh.in',
+    output : 'nix.sh',
+    configuration : nix_profile_sh)
+
+scripts_data += configure_file(
+    input : 'nix-profile-daemon.sh.in',
+    output : 'nix-daemon.sh',
+    configuration : nix_profile_sh)
+
+scripts_data += configure_file(
+    input : 'nix-http-export.cgi.in',
+    output : 'nix-http-export.cgi',
+    configuration : nix_http_export_cgi)
+
+scripts_data += configure_file(
+    input : 'nix-reduce-build.in',
+    output : 'nix-reduce-build',
+    configuration : nix_reduce_build)
+
+install_data(
+    scripts_data,
+    install_mode : 'rwxr-xr-x',
+    install_dir : profiledir)
diff --git a/third_party/nix/src/libexpr/meson.build b/third_party/nix/src/libexpr/meson.build
new file mode 100644
index 0000000000..a5371a251c
--- /dev/null
+++ b/third_party/nix/src/libexpr/meson.build
@@ -0,0 +1,130 @@
+# Nix lib expr build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+src_inc += include_directories('.', 'primops')
+
+libexpr_src = files(
+    join_paths(meson.source_root(), 'src/libexpr/primops/context.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/primops/fetchGit.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/primops/fetchMercurial.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/primops/fromTOML.cc'),
+
+    join_paths(meson.source_root(), 'src/libexpr/attr-path.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/attr-set.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/common-eval-args.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/eval.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/get-drvs.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/json-to-value.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/names.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/nixexpr.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/primops.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/value-to-json.cc'),
+    join_paths(meson.source_root(), 'src/libexpr/value-to-xml.cc'))
+
+libexpr_headers = files(
+    join_paths(meson.source_root(), 'src/libexpr/attr-path.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/attr-set.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/common-eval-args.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/eval.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/eval-inline.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/function-trace.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/get-drvs.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/json-to-value.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/names.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/nixexpr.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/primops.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/symbol-table.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/value.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/value-to-json.hh'),
+    join_paths(meson.source_root(), 'src/libexpr/value-to-xml.hh'))
+
+
+
+
+# dependancies
+#============================================================================
+
+libexpr_dep_list = [
+    libdl_dep,
+    libsodium_dep]
+
+if sys_name == 'freebsd'
+    libexpr_dep_list += libdl_dep
+endif
+
+
+
+
+# Link args
+#============================================================================
+
+libexpr_link_list = [
+    libutil_lib,
+    libstore_lib,
+    libmain_lib]
+
+libexpr_link_args = []
+
+
+
+
+# compiler args
+#============================================================================
+
+libexpr_cxx_args = []
+
+
+
+
+# targets
+#============================================================================
+
+libexpr_src += custom_target(
+    'parser_tab.[cchh]',
+    output : [
+        'parser-tab.cc',
+        'parser-tab.hh'],
+    input : 'parser.y',
+    command : [
+        bison,
+        '-v',
+        '--output=@OUTPUT0@',
+        '@INPUT@',
+        '-d'])
+
+libexpr_src += custom_target(
+    'lexer_tab.[cchh]',
+    output : ['lexer-tab.cc', 'lexer-tab.hh'],
+    input : 'lexer.l',
+    command : [
+        flex,
+        '--outfile=@OUTPUT0@',
+        '--header-file=@OUTPUT1@',
+        '@INPUT@'])
+
+
+
+
+# build
+#============================================================================
+
+libexpr_lib = library(
+    'nixexpr',
+    install : true,
+    install_mode : 'rwxr-xr-x',
+    install_dir : libdir,
+    include_directories : src_inc,
+    link_with : libexpr_link_list,
+    sources : libexpr_src,
+    link_args : libexpr_link_args,
+    dependencies : libexpr_dep_list)
+
+install_headers(
+    libexpr_headers,
+    install_dir : join_paths(includedir, 'nix'))
diff --git a/third_party/nix/src/libmain/meson.build b/third_party/nix/src/libmain/meson.build
new file mode 100644
index 0000000000..ec510ee2e5
--- /dev/null
+++ b/third_party/nix/src/libmain/meson.build
@@ -0,0 +1,79 @@
+# Nix lib store build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+src_inc += include_directories('.')
+
+libmain_src = files(
+    join_paths(meson.source_root(), 'src/libmain/common-args.cc'),
+    join_paths(meson.source_root(), 'src/libmain/shared.cc'),
+    join_paths(meson.source_root(), 'src/libmain/stack.cc'))
+
+libmain_headers = files(
+    join_paths(meson.source_root(), 'src/libmain/common-args.hh'),
+    join_paths(meson.source_root(), 'src/libmain/shared.hh'))
+
+
+
+
+# dependancies
+#============================================================================
+
+libmain_dep_list = [
+    pthread_dep,
+    openssl_dep,
+    libsodium_dep]
+
+
+
+
+
+# Link args
+#============================================================================
+
+libmain_link_list = [
+    libutil_lib,
+    libstore_lib
+]
+
+libmain_link_args = []
+
+
+
+
+# compiler args
+#============================================================================
+
+libstore_cxx_args = []
+
+
+
+
+# targets
+#============================================================================
+
+
+
+
+# build
+#============================================================================
+
+libmain_lib = library(
+    'nixmain',
+    install : true,
+    install_mode : 'rwxr-xr-x',
+    install_dir : libdir,
+    include_directories : src_inc,
+    link_with : libmain_link_list,
+    sources : libmain_src,
+    link_args : libmain_link_args,
+    dependencies : libmain_dep_list)
+
+install_headers(
+    libmain_headers,
+    install_dir : join_paths(includedir, 'nix'))
diff --git a/third_party/nix/src/libstore/meson.build b/third_party/nix/src/libstore/meson.build
new file mode 100644
index 0000000000..28ae0fdb27
--- /dev/null
+++ b/third_party/nix/src/libstore/meson.build
@@ -0,0 +1,170 @@
+# Nix lib store build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+src_inc += include_directories('.')
+
+libstore_src = files(
+    join_paths(meson.source_root(), 'src/libstore/binary-cache-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/build.cc'),
+    join_paths(meson.source_root(), 'src/libstore/crypto.cc'),
+    join_paths(meson.source_root(), 'src/libstore/derivations.cc'),
+    join_paths(meson.source_root(), 'src/libstore/download.cc'),
+    join_paths(meson.source_root(), 'src/libstore/export-import.cc'),
+    join_paths(meson.source_root(), 'src/libstore/gc.cc'),
+    join_paths(meson.source_root(), 'src/libstore/globals.cc'),
+    join_paths(meson.source_root(), 'src/libstore/http-binary-cache-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/legacy-ssh-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/local-binary-cache-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/local-fs-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/local-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/machines.cc'),
+    join_paths(meson.source_root(), 'src/libstore/misc.cc'),
+    join_paths(meson.source_root(), 'src/libstore/nar-accessor.cc'),
+    join_paths(meson.source_root(), 'src/libstore/nar-info.cc'),
+    join_paths(meson.source_root(), 'src/libstore/nar-info-disk-cache.cc'),
+    join_paths(meson.source_root(), 'src/libstore/optimise-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/parsed-derivations.cc'),
+    join_paths(meson.source_root(), 'src/libstore/pathlocks.cc'),
+    join_paths(meson.source_root(), 'src/libstore/profiles.cc'),
+    join_paths(meson.source_root(), 'src/libstore/references.cc'),
+    join_paths(meson.source_root(), 'src/libstore/remote-fs-accessor.cc'),
+    join_paths(meson.source_root(), 'src/libstore/remote-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/s3-binary-cache-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/sqlite.cc'),
+    join_paths(meson.source_root(), 'src/libstore/ssh.cc'),
+    join_paths(meson.source_root(), 'src/libstore/ssh-store.cc'),
+    join_paths(meson.source_root(), 'src/libstore/store-api.cc'),
+    join_paths(meson.source_root(), 'src/libstore/builtins/buildenv.cc'),
+    join_paths(meson.source_root(), 'src/libstore/builtins/fetchurl.cc'))
+
+libstore_headers = files(
+    join_paths(meson.source_root(), 'src/libstore/binary-cache-store.hh'),
+    join_paths(meson.source_root(), 'src/libstore/builtins.hh'),
+    join_paths(meson.source_root(), 'src/libstore/crypto.hh'),
+    join_paths(meson.source_root(), 'src/libstore/derivations.hh'),
+    join_paths(meson.source_root(), 'src/libstore/download.hh'),
+    join_paths(meson.source_root(), 'src/libstore/fs-accessor.hh'),
+    join_paths(meson.source_root(), 'src/libstore/globals.hh'),
+    join_paths(meson.source_root(), 'src/libstore/local-store.hh'),
+    join_paths(meson.source_root(), 'src/libstore/machines.hh'),
+    join_paths(meson.source_root(), 'src/libstore/nar-accessor.hh'),
+    join_paths(meson.source_root(), 'src/libstore/nar-info-disk-cache.hh'),
+    join_paths(meson.source_root(), 'src/libstore/nar-info.hh'),
+    join_paths(meson.source_root(), 'src/libstore/parsed-derivations.hh'),
+    join_paths(meson.source_root(), 'src/libstore/pathlocks.hh'),
+    join_paths(meson.source_root(), 'src/libstore/profiles.hh'),
+    join_paths(meson.source_root(), 'src/libstore/references.hh'),
+    join_paths(meson.source_root(), 'src/libstore/remote-fs-accessor.hh'),
+    join_paths(meson.source_root(), 'src/libstore/remote-store.hh'),
+    join_paths(meson.source_root(), 'src/libstore/s3-binary-cache-store.hh'),
+    join_paths(meson.source_root(), 'src/libstore/s3.hh'),
+    join_paths(meson.source_root(), 'src/libstore/serve-protocol.hh'),
+    join_paths(meson.source_root(), 'src/libstore/sqlite.hh'),
+    join_paths(meson.source_root(), 'src/libstore/ssh.hh'),
+    join_paths(meson.source_root(), 'src/libstore/store-api.hh'),
+    join_paths(meson.source_root(), 'src/libstore/worker-protocol.hh'))
+
+libstore_data = files(
+    join_paths(meson.source_root(), 'src/libstore/sandbox-defaults.sb'),
+    join_paths(meson.source_root(), 'src/libstore/sandbox-minimal.sb'),
+    join_paths(meson.source_root(), 'src/libstore/sandbox-network.sb'))
+
+# dependancies
+#============================================================================
+
+libstore_dep_list = [
+    libbz2_dep,
+    libcurl_dep,
+    libdl_dep,
+    pthread_dep,
+    sqlite3_dep,
+    libsodium_dep
+]
+
+if sys_name.contains('linux')
+    libstore_dep_list += libseccomp_dep
+endif
+
+if sys_name.contains('freebsd')
+    libstore_dep_list += libdl_dep
+endif
+
+
+
+
+# Link args
+#============================================================================
+
+libstore_link_list = [
+    libutil_lib]
+
+libstore_link_args = []
+
+
+
+
+# compiler args
+#============================================================================
+
+libstore_cxx_args = [
+    '-DNIX_PREFIX="@0@" '.format(prefix),
+    '-DNIX_STORE_DIR="@0@" '.format(nixstoredir),
+    '-DNIX_DATA_DIR="@0@" '.format(datadir),
+    '-DNIX_STATE_DIR="@0@" '.format(join_paths(localstatedir, 'nix')),
+    '-DNIX_LOG_DIR="@0@" '.format(join_paths(localstatedir, 'log/nix')),
+    '-DNIX_CONF_DIR="@0@" '.format(join_paths(sysconfdir, 'nix')),
+    '-DNIX_LIBEXEC_DIR="@0@" '.format(libexecdir),
+    '-DNIX_BIN_DIR="@0@" '.format(bindir),
+    '-DNIX_MAN_DIR="@0@" '.format(mandir),
+    '-DSANDBOX_SHELL="@0@" '.format(get_option('sandbox_shell')),
+    '-DLSOF="@0@" '.format(lsof)]
+
+
+
+
+# targets
+#============================================================================
+
+gen_header = '''
+  echo 'R"foo(' >> "$1"
+  cat @INPUT@ >> "$1"
+  echo ')foo"' >> "$1"
+'''
+
+libstore_src += custom_target(
+  'schema.sql.gen.hh',
+  output : 'schema.sql.gen.hh',
+  input : 'schema.sql',
+  command : [bash, '-c', gen_header, 'sh', '@OUTPUT@'])
+
+
+
+
+# build
+#============================================================================
+
+libstore_lib = library(
+    'nixstore',
+    install : true,
+    install_mode : 'rwxr-xr-x',
+    install_dir : libdir,
+    include_directories : src_inc,
+    link_with : libstore_link_list,
+    sources : libstore_src,
+    cpp_args : libstore_cxx_args,
+    link_args : libstore_link_args,
+    dependencies : libstore_dep_list)
+
+install_headers(
+    libstore_headers,
+    install_dir : join_paths(includedir, 'nix'))
+
+install_data(
+    libstore_data,
+    install_dir : join_paths(datadir, 'nix/sandbox'))
diff --git a/third_party/nix/src/libstore/remote-store.cc b/third_party/nix/src/libstore/remote-store.cc
index f34369d8fe..e21f3449b0 100644
--- a/third_party/nix/src/libstore/remote-store.cc
+++ b/third_party/nix/src/libstore/remote-store.cc
@@ -229,7 +229,7 @@ struct ConnectionHandle
 
     ~ConnectionHandle()
     {
-        if (!daemonException && std::uncaught_exception()) {
+        if (!daemonException && std::uncaught_exceptions()) {
             handle.markBad();
             debug("closing daemon connection because of an exception");
         }
diff --git a/third_party/nix/src/libutil/meson.build b/third_party/nix/src/libutil/meson.build
new file mode 100644
index 0000000000..c6eec21c5a
--- /dev/null
+++ b/third_party/nix/src/libutil/meson.build
@@ -0,0 +1,106 @@
+# Nix lib store build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+src_inc += include_directories('.')
+
+libutil_src = files(
+    join_paths(meson.source_root(), 'src/libutil/affinity.cc'),
+    join_paths(meson.source_root(), 'src/libutil/archive.cc'),
+    join_paths(meson.source_root(), 'src/libutil/args.cc'),
+    join_paths(meson.source_root(), 'src/libutil/compression.cc'),
+    join_paths(meson.source_root(), 'src/libutil/config.cc'),
+    join_paths(meson.source_root(), 'src/libutil/hash.cc'),
+    join_paths(meson.source_root(), 'src/libutil/json.cc'),
+    join_paths(meson.source_root(), 'src/libutil/logging.cc'),
+    join_paths(meson.source_root(), 'src/libutil/serialise.cc'),
+    join_paths(meson.source_root(), 'src/libutil/thread-pool.cc'),
+    join_paths(meson.source_root(), 'src/libutil/util.cc'),
+    join_paths(meson.source_root(), 'src/libutil/xml-writer.cc'))
+
+libutil_headers = files(
+    join_paths(meson.source_root(), 'src/libutil/affinity.hh'),
+    join_paths(meson.source_root(), 'src/libutil/archive.hh'),
+    join_paths(meson.source_root(), 'src/libutil/args.hh'),
+    join_paths(meson.source_root(), 'src/libutil/compression.hh'),
+    join_paths(meson.source_root(), 'src/libutil/config.hh'),
+    join_paths(meson.source_root(), 'src/libutil/finally.hh'),
+    join_paths(meson.source_root(), 'src/libutil/hash.hh'),
+    join_paths(meson.source_root(), 'src/libutil/istringstream_nocopy.hh'),
+    join_paths(meson.source_root(), 'src/libutil/json.hh'),
+    join_paths(meson.source_root(), 'src/libutil/lazy.hh'),
+    join_paths(meson.source_root(), 'src/libutil/logging.hh'),
+    join_paths(meson.source_root(), 'src/libutil/lru-cache.hh'),
+    join_paths(meson.source_root(), 'src/libutil/monitor-fd.hh'),
+    join_paths(meson.source_root(), 'src/libutil/pool.hh'),
+    join_paths(meson.source_root(), 'src/libutil/ref.hh'),
+    join_paths(meson.source_root(), 'src/libutil/serialise.hh'),
+    join_paths(meson.source_root(), 'src/libutil/sync.hh'),
+    join_paths(meson.source_root(), 'src/libutil/thread-pool.hh'),
+    join_paths(meson.source_root(), 'src/libutil/types.hh'),
+    join_paths(meson.source_root(), 'src/libutil/util.hh'),
+    join_paths(meson.source_root(), 'src/libutil/xml-writer.hh')
+)
+
+
+
+# dependancies
+#============================================================================
+
+libutil_dep_list = [
+    boost_dep,
+    libbz2_dep,
+    liblzma_dep,
+    libbrotli_dep,
+    openssl_dep,
+    pthread_dep,
+    libsodium_dep]
+
+
+
+
+# Link args
+#============================================================================
+
+libutil_link_list = []
+
+libutil_link_args = []
+
+
+
+
+# compiler args
+#============================================================================
+
+libutil_cxx_args = []
+
+
+
+
+# targets
+#============================================================================
+
+
+
+
+# build
+#============================================================================
+
+libutil_lib = library(
+    'nixutil',
+    install : true,
+    install_mode : 'rwxr-xr-x',
+    install_dir : libdir,
+    include_directories : src_inc,
+    sources : libutil_src,
+    link_args : libutil_link_args,
+    dependencies : libutil_dep_list)
+
+install_headers(
+    libutil_headers,
+    install_dir : join_paths(includedir, 'nix'))
diff --git a/third_party/nix/src/libutil/util.cc b/third_party/nix/src/libutil/util.cc
index ad8cc1894c..0552747321 100644
--- a/third_party/nix/src/libutil/util.cc
+++ b/third_party/nix/src/libutil/util.cc
@@ -33,7 +33,7 @@
 #endif
 
 
-extern char * * environ;
+extern char * * environ __attribute__((weak));
 
 
 namespace nix {
@@ -1179,7 +1179,7 @@ void _interrupted()
     /* Block user interrupts while an exception is being handled.
        Throwing an exception while another exception is being handled
        kills the program! */
-    if (!interruptThrown && !std::uncaught_exception()) {
+    if (!interruptThrown && !std::uncaught_exceptions()) {
         interruptThrown = true;
         throw Interrupted("interrupted by the user");
     }
diff --git a/third_party/nix/src/meson.build b/third_party/nix/src/meson.build
new file mode 100644
index 0000000000..9961b0938f
--- /dev/null
+++ b/third_party/nix/src/meson.build
@@ -0,0 +1,48 @@
+# nix src build file
+#============================================================================
+
+src_dirs = [
+  'libutil',
+  'libstore',
+  'libmain',
+  'libexpr',
+  'nix',
+  'resolve-system-dependencies'
+]
+
+foreach dir : src_dirs
+    subdir(dir)
+endforeach
+
+
+
+libstore_config = pkg.generate(
+    libstore_lib,
+    libraries : [
+        libutil_lib],
+    version : meson.project_version(),
+    name : 'Nix',
+    subdirs : ['nix/'],
+    filebase : 'nix-store',
+    extra_cflags : '-std=c++17',
+    description : 'Nix Package Manager.')
+
+libmain_config = pkg.generate(
+    libmain_lib,
+    version : meson.project_version(),
+    name : 'Nix',
+    subdirs : ['nix/'],
+    filebase : 'nix-main',
+    extra_cflags : '-std=c++17',
+    description : 'Nix Package Manager.')
+
+libexpr_config = pkg.generate(
+    libexpr_lib,
+    libraries : [
+        libstore_lib],
+    version : meson.project_version(),
+    name : 'Nix',
+    subdirs : ['nix/'],
+    filebase : 'nix-expr',
+    extra_cflags : '-std=c++17',
+    description : 'Nix Package Manager.')
diff --git a/third_party/nix/src/nix-build/nix-build.cc b/third_party/nix/src/nix-build/nix-build.cc
index 33ad28704a..90b63d0ba5 100755
--- a/third_party/nix/src/nix-build/nix-build.cc
+++ b/third_party/nix/src/nix-build/nix-build.cc
@@ -21,7 +21,7 @@
 using namespace nix;
 using namespace std::string_literals;
 
-extern char * * environ;
+extern char * * environ __attribute__((weak));
 
 /* Recreate the effect of the perl shellwords function, breaking up a
  * string into arguments like a shell word, including escapes
diff --git a/third_party/nix/src/nix/main.cc b/third_party/nix/src/nix/main.cc
index c683d86df4..bfc0a3def0 100644
--- a/third_party/nix/src/nix/main.cc
+++ b/third_party/nix/src/nix/main.cc
@@ -13,6 +13,9 @@
 
 #include <sys/types.h>
 #include <sys/socket.h>
+
+#include <netinet/in.h>
+
 #include <ifaddrs.h>
 #include <netdb.h>
 #include <netinet/in.h>
diff --git a/third_party/nix/src/nix/meson.build b/third_party/nix/src/nix/meson.build
new file mode 100644
index 0000000000..be7ccb1a28
--- /dev/null
+++ b/third_party/nix/src/nix/meson.build
@@ -0,0 +1,152 @@
+# Nix exec build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+src_inc += include_directories('.')
+
+nix_src = files(
+    join_paths(meson.source_root(), 'src/nix/add-to-store.cc'),
+    join_paths(meson.source_root(), 'src/nix/build.cc'),
+    join_paths(meson.source_root(), 'src/nix/cat.cc'),
+    join_paths(meson.source_root(), 'src/nix/command.cc'),
+    join_paths(meson.source_root(), 'src/nix/copy.cc'),
+    join_paths(meson.source_root(), 'src/nix/doctor.cc'),
+    join_paths(meson.source_root(), 'src/nix/dump-path.cc'),
+    join_paths(meson.source_root(), 'src/nix/edit.cc'),
+    join_paths(meson.source_root(), 'src/nix/eval.cc'),
+    join_paths(meson.source_root(), 'src/nix/hash.cc'),
+    join_paths(meson.source_root(), 'src/nix/installables.cc'),
+    join_paths(meson.source_root(), 'src/nix/legacy.cc'),
+    join_paths(meson.source_root(), 'src/nix/log.cc'),
+    join_paths(meson.source_root(), 'src/nix/ls.cc'),
+    join_paths(meson.source_root(), 'src/nix/main.cc'),
+    join_paths(meson.source_root(), 'src/nix/optimise-store.cc'),
+    join_paths(meson.source_root(), 'src/nix/path-info.cc'),
+    join_paths(meson.source_root(), 'src/nix/ping-store.cc'),
+    join_paths(meson.source_root(), 'src/nix/progress-bar.cc'),
+    join_paths(meson.source_root(), 'src/nix/repl.cc'),
+    join_paths(meson.source_root(), 'src/nix/run.cc'),
+    join_paths(meson.source_root(), 'src/nix/search.cc'),
+    join_paths(meson.source_root(), 'src/nix/show-config.cc'),
+    join_paths(meson.source_root(), 'src/nix/show-derivation.cc'),
+    join_paths(meson.source_root(), 'src/nix/sigs.cc'),
+    join_paths(meson.source_root(), 'src/nix/upgrade-nix.cc'),
+    join_paths(meson.source_root(), 'src/nix/verify.cc'),
+    join_paths(meson.source_root(), 'src/nix/why-depends.cc'),
+
+    join_paths(meson.source_root(), 'src/build-remote/build-remote.cc'),
+    join_paths(meson.source_root(), 'src/nix-build/nix-build.cc'),
+    join_paths(meson.source_root(), 'src/nix-channel/nix-channel.cc'),
+    join_paths(meson.source_root(), 'src/nix-collect-garbage/nix-collect-garbage.cc'),
+    join_paths(meson.source_root(), 'src/nix-copy-closure/nix-copy-closure.cc'),
+    join_paths(meson.source_root(), 'src/nix-daemon/nix-daemon.cc'),
+    join_paths(meson.source_root(), 'src/nix-env/nix-env.cc'),
+    join_paths(meson.source_root(), 'src/nix-env/user-env.cc'),
+    join_paths(meson.source_root(), 'src/nix-instantiate/nix-instantiate.cc'),
+    join_paths(meson.source_root(), 'src/nix-prefetch-url/nix-prefetch-url.cc'),
+    join_paths(meson.source_root(), 'src/nix-store/dotgraph.cc'),
+    join_paths(meson.source_root(), 'src/nix-store/graphml.cc'),
+    join_paths(meson.source_root(), 'src/nix-store/nix-store.cc'))
+
+nix_ln_src = [
+    [ bindir, 'nix-build' ],
+    [ bindir, 'nix-channel' ],
+    [ bindir, 'nix-collect-garbage' ],
+    [ bindir, 'nix-copy-closure' ],
+    [ bindir, 'nix-daemon' ],
+    [ bindir, 'nix-env' ],
+    [ bindir, 'nix-hash' ],
+    [ bindir, 'nix-instantiate' ],
+    [ bindir, 'nix-prefetch-url' ],
+    [ bindir, 'nix-shell' ],
+    [ bindir, 'nix-store' ],
+    [ join_paths(libexecdir, 'nix'), 'build-remote' ]]
+
+nix_headers = files (
+    join_paths(meson.source_root(), 'src/nix/command.hh'),
+    join_paths(meson.source_root(), 'src/nix/legacy.hh'),
+    join_paths(meson.source_root(), 'src/nix/progress-bar.hh'),
+    join_paths(meson.source_root(), 'src/nix-env/user-env.hh'),
+    join_paths(meson.source_root(), 'src/nix-store/dotgraph.hh'),
+    join_paths(meson.source_root(), 'src/nix-store/graphml.hh'))
+
+# dependancies
+#============================================================================
+
+nix_dep_list = [
+    pthread_dep,
+    libdl_dep,
+    boost_dep,
+    editline_dep,
+    libsodium_dep]
+
+
+
+
+
+# Link args
+#============================================================================
+
+nix_link_list = [
+    libutil_lib,
+    libstore_lib,
+    libmain_lib,
+    libexpr_lib
+]
+
+nix_link_args = []
+
+
+
+
+# compiler args
+#============================================================================
+
+nix_cxx_args = []
+
+
+
+
+# targets
+#============================================================================
+
+
+
+
+# build
+#============================================================================
+
+nix_bin = executable(
+    'nix',
+    install : true,
+    install_mode : 'rwxr-xr-x',
+    install_dir : bindir,
+    include_directories : src_inc,
+    sources : nix_src,
+    link_with : nix_link_list,
+    dependencies : nix_dep_list)
+
+
+# meson does not yet support installing symlink files.
+# this is a simple workaround
+foreach name : nix_ln_src
+    meson.add_install_script(
+        'ln',
+        '-sf',
+        join_paths(bindir, 'nix'),
+        name[1])
+    meson.add_install_script(
+        'cp',
+        '-r',
+        name[1],
+        join_paths(name[0], name[1]))   
+endforeach
+
+install_headers(
+    nix_headers,
+    install_dir : join_paths(includedir, 'nix'))
diff --git a/third_party/nix/src/resolve-system-dependencies/meson.build b/third_party/nix/src/resolve-system-dependencies/meson.build
new file mode 100644
index 0000000000..afabed15e1
--- /dev/null
+++ b/third_party/nix/src/resolve-system-dependencies/meson.build
@@ -0,0 +1,58 @@
+# Nix exec build file
+#============================================================================
+
+
+
+
+# src files
+#============================================================================
+
+nix_src = files(
+    join_paths(meson.source_root(),
+    'src/resolve-system-dependencies/resolve-system-dependencies.cc'))
+
+
+
+# dependancies
+#============================================================================
+
+sys_deps_dep_list = []
+
+
+
+
+# Link args
+#============================================================================
+
+sys_deps_link_args = []
+
+
+
+
+# compiler args
+#============================================================================
+
+sys_deps_cxx_args = []
+
+
+
+
+# targets
+#============================================================================
+
+
+
+
+# build
+#============================================================================
+
+if sys_name == 'darwin'
+    sys_deps_bin = executable(
+        'resolve-system-dependencies',
+        install : true,
+        install_dir : bindir,
+        include_directories : src_inc,
+        sources : nix_src,
+        link_args : sys_deps_link_args,
+        dependencies : sys_deps_dep_list)
+endif
\ No newline at end of file
diff --git a/third_party/nix/tests/meson.build b/third_party/nix/tests/meson.build
new file mode 100644
index 0000000000..c45e00f3ac
--- /dev/null
+++ b/third_party/nix/tests/meson.build
@@ -0,0 +1,5 @@
+# nix doc build file
+#============================================================================
+
+
+# TODO: all of this :|
\ No newline at end of file