2020-07-25 03:03:42 +02:00
|
|
|
args@{
|
2021-04-10 18:05:16 +02:00
|
|
|
depot ? (import ../.. {})
|
|
|
|
, pkgs ? depot.third_party.nixpkgs
|
2020-07-25 03:03:42 +02:00
|
|
|
, lib
|
2020-07-18 00:05:31 +02:00
|
|
|
, buildType ? "release"
|
|
|
|
, ...
|
|
|
|
}:
|
2020-05-17 21:46:06 +02:00
|
|
|
|
|
|
|
let
|
|
|
|
aws-s3-cpp = pkgs.aws-sdk-cpp.override {
|
|
|
|
apis = ["s3" "transfer"];
|
|
|
|
customMemoryManagement = false;
|
|
|
|
};
|
|
|
|
|
2020-11-27 16:31:18 +01:00
|
|
|
src = let
|
|
|
|
srcDir = ./.;
|
|
|
|
# create relative paths for all the sources we are filtering
|
|
|
|
asRelative = path:
|
|
|
|
let
|
|
|
|
srcS = toString srcDir;
|
|
|
|
pathS = toString path;
|
|
|
|
in
|
|
|
|
if ! lib.hasPrefix srcS pathS then
|
|
|
|
throw "Path is outside of the working directory."
|
|
|
|
else
|
|
|
|
lib.removePrefix srcS pathS;
|
|
|
|
|
|
|
|
in builtins.filterSource (path: type:
|
|
|
|
# Strip out .nix files that are in the root of the repository. Changing
|
|
|
|
# the expression of tvix shouldn't cause a rebuild of tvix unless really
|
|
|
|
# required.
|
|
|
|
!(dirOf (asRelative path) == "/" && lib.hasSuffix ".nix" path) &&
|
|
|
|
|
|
|
|
# remove the proto files from the repo as those are compiled separately
|
|
|
|
!(lib.hasPrefix "src/proto" (asRelative path)) &&
|
|
|
|
|
|
|
|
# ignore result symlinks
|
|
|
|
!(type == "symlink" && lib.hasPrefix "result" (baseNameOf path))
|
|
|
|
) srcDir;
|
2020-07-05 21:02:10 +02:00
|
|
|
|
|
|
|
# Proto generation in CMake is theoretically possible, but that is
|
|
|
|
# very theoretical - this does it in Nix instead.
|
|
|
|
protoSrcs = pkgs.runCommand "nix-proto-srcs" {} ''
|
2020-11-27 16:31:18 +01:00
|
|
|
export PROTO_SRCS=${./src/proto}
|
2020-07-05 21:02:10 +02:00
|
|
|
mkdir -p $out/libproto
|
2021-04-10 18:05:16 +02:00
|
|
|
${depot.third_party.protobuf}/bin/protoc -I=$PROTO_SRCS \
|
2020-07-05 21:02:10 +02:00
|
|
|
--cpp_out=$out/libproto \
|
2021-04-10 18:05:16 +02:00
|
|
|
--plugin=protoc-gen-grpc=${depot.third_party.grpc}/bin/grpc_cpp_plugin \
|
|
|
|
--grpc_out=$out/libproto \
|
|
|
|
$PROTO_SRCS/*.proto
|
2020-07-05 21:02:10 +02:00
|
|
|
'';
|
2020-08-04 02:20:30 +02:00
|
|
|
|
|
|
|
# Derivation for busybox that just has the `busybox` binary in bin/, not all
|
|
|
|
# the symlinks, so cmake can find it
|
|
|
|
busybox = pkgs.runCommand "busybox" {} ''
|
|
|
|
mkdir -p $out/bin
|
|
|
|
cp ${pkgs.busybox}/bin/busybox $out/bin
|
|
|
|
'';
|
|
|
|
|
2021-10-07 21:57:09 +02:00
|
|
|
in lib.fix (self: pkgs.fullLlvm11Stdenv.mkDerivation {
|
2020-07-16 17:18:43 +02:00
|
|
|
pname = "tvix";
|
2020-05-17 22:25:50 +02:00
|
|
|
version = "2.3.4";
|
2020-07-05 21:02:10 +02:00
|
|
|
inherit src;
|
2020-05-17 21:46:06 +02:00
|
|
|
|
|
|
|
nativeBuildInputs = with pkgs; [
|
|
|
|
bison
|
2021-05-23 13:33:59 +02:00
|
|
|
clang-tools_11
|
2020-05-20 04:03:08 +02:00
|
|
|
cmake
|
2020-05-17 21:46:06 +02:00
|
|
|
libxml2
|
|
|
|
libxslt
|
2020-07-19 18:46:42 +02:00
|
|
|
pkgconfig
|
2020-05-22 23:58:04 +02:00
|
|
|
(import ./clangd.nix pkgs)
|
2020-05-17 21:46:06 +02:00
|
|
|
];
|
|
|
|
|
2021-04-10 23:20:55 +02:00
|
|
|
# TODO(tazjin): Some of these might only be required for native inputs
|
|
|
|
buildInputs = (with pkgs; [
|
2020-05-17 21:46:06 +02:00
|
|
|
aws-s3-cpp
|
|
|
|
brotli
|
|
|
|
bzip2
|
2020-07-05 21:02:10 +02:00
|
|
|
c-ares
|
2020-05-17 21:46:06 +02:00
|
|
|
curl
|
|
|
|
editline
|
|
|
|
flex
|
|
|
|
libseccomp
|
|
|
|
libsodium
|
2020-11-21 18:22:54 +01:00
|
|
|
systemd.dev
|
2020-05-17 21:46:06 +02:00
|
|
|
openssl
|
|
|
|
sqlite
|
|
|
|
xz
|
2021-04-10 23:20:55 +02:00
|
|
|
]) ++ (with depot.third_party; [
|
2021-04-10 18:05:16 +02:00
|
|
|
abseil_cpp
|
|
|
|
glog
|
|
|
|
grpc
|
|
|
|
protobuf
|
|
|
|
]);
|
2020-05-17 21:46:06 +02:00
|
|
|
|
2020-07-17 03:19:21 +02:00
|
|
|
doCheck = false;
|
|
|
|
doInstallCheck = true;
|
|
|
|
|
2020-09-06 23:44:06 +02:00
|
|
|
# Preserve debug symbols, for core dumps + other live debugging
|
|
|
|
dontStrip = true;
|
|
|
|
|
2021-04-10 23:20:55 +02:00
|
|
|
installCheckInputs = with depot.third_party; [
|
|
|
|
gtest
|
|
|
|
pkgs.fd
|
2020-07-19 06:36:22 +02:00
|
|
|
rapidcheck
|
|
|
|
];
|
|
|
|
|
2020-06-21 22:41:46 +02:00
|
|
|
propagatedBuildInputs = with pkgs; [
|
|
|
|
boost
|
|
|
|
];
|
|
|
|
|
2020-07-17 03:19:21 +02:00
|
|
|
configurePhase = ''
|
|
|
|
mkdir build
|
|
|
|
cd build
|
|
|
|
cmake .. \
|
|
|
|
-DCMAKE_INSTALL_PREFIX=$out \
|
2020-07-25 07:39:14 +02:00
|
|
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
2020-07-17 03:19:21 +02:00
|
|
|
-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF \
|
|
|
|
-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF \
|
2020-08-04 23:02:51 +02:00
|
|
|
-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON
|
2020-07-17 03:19:21 +02:00
|
|
|
'';
|
|
|
|
|
|
|
|
installCheckPhase = ''
|
|
|
|
export NIX_DATA_DIR=$out/share
|
2020-07-19 16:57:43 +02:00
|
|
|
export NIX_TEST_VAR=foo # this is required by a language test
|
2020-07-17 03:19:21 +02:00
|
|
|
make test
|
2020-07-19 18:46:42 +02:00
|
|
|
|
|
|
|
# Ensure formatting is coherent, but do this after the rest of the
|
|
|
|
# tests run so that developers get all the useful feedback
|
|
|
|
fd . $src -e hh -e cc | xargs clang-format --dry-run --Werror
|
2020-07-17 03:19:21 +02:00
|
|
|
'';
|
|
|
|
|
|
|
|
preBuild = ''
|
|
|
|
if [ -n "$NIX_BUILD_CORES" ]; then
|
|
|
|
makeFlags+="-j$NIX_BUILD_CORES "
|
|
|
|
makeFlags+="-l$NIX_BUILD_CORES "
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
|
2020-07-05 21:02:10 +02:00
|
|
|
# Forward the location of the generated Protobuf / gRPC files so
|
|
|
|
# that they can be included by CMake.
|
|
|
|
NIX_PROTO_SRCS = protoSrcs;
|
|
|
|
|
2020-07-23 20:55:47 +02:00
|
|
|
# Work around broken system header include flags in the cxx toolchain.
|
2021-05-23 13:33:59 +02:00
|
|
|
LIBCXX_INCLUDE = "${pkgs.llvmPackages_11.libcxx}/include/c++/v1";
|
2020-07-23 20:55:47 +02:00
|
|
|
|
2020-08-04 02:20:30 +02:00
|
|
|
SANDBOX_SHELL="${pkgs.busybox}/bin/busybox";
|
|
|
|
|
2020-05-17 21:46:06 +02:00
|
|
|
# Install the various symlinks to the Nix binary which users expect
|
|
|
|
# to exist.
|
|
|
|
postInstall = ''
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-build
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-channel
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-collect-garbage
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-copy-closure
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-env
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-hash
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-instantiate
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-prefetch-url
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-shell
|
|
|
|
ln -s $out/bin/nix $out/bin/nix-store
|
|
|
|
|
|
|
|
mkdir -p $out/libexec/nix
|
2020-05-17 22:25:50 +02:00
|
|
|
ln -s $out/bin/nix $out/libexec/nix/build-remote
|
2020-07-25 04:47:12 +02:00
|
|
|
|
|
|
|
# configuration variables for templated files
|
|
|
|
export storedir=/nix/store
|
2020-08-30 18:35:27 +02:00
|
|
|
export localstatedir=/nix/var
|
2020-07-25 04:47:12 +02:00
|
|
|
export bindir=$out/bin
|
|
|
|
|
|
|
|
mkdir -p $out/lib/systemd/system
|
|
|
|
substituteAll \
|
|
|
|
${src}/misc/systemd/nix-daemon.service.in \
|
|
|
|
$out/lib/systemd/system/nix-daemon.service
|
|
|
|
substituteAll \
|
|
|
|
${src}/misc/systemd/nix-daemon.socket.in \
|
|
|
|
$out/lib/systemd/system/nix-daemon.socket
|
2020-08-30 18:33:03 +02:00
|
|
|
|
|
|
|
mkdir -p $out/etc/profile.d
|
|
|
|
substituteAll \
|
|
|
|
${src}/scripts/nix-profile.sh.in $out/etc/profile.d/nix.sh
|
|
|
|
substituteAll \
|
|
|
|
${src}/scripts/nix-profile-daemon.sh.in $out/etc/profile.d/nix-daemon.sh
|
2020-05-17 21:46:06 +02:00
|
|
|
'';
|
|
|
|
|
|
|
|
# TODO(tazjin): integration test setup?
|
|
|
|
# TODO(tazjin): docs generation?
|
2020-07-25 03:03:42 +02:00
|
|
|
|
2020-07-25 03:30:42 +02:00
|
|
|
passthru = {
|
2020-08-02 02:20:18 +02:00
|
|
|
build-shell = self.overrideAttrs (up: rec {
|
|
|
|
run_clang_tidy = pkgs.writeShellScriptBin "run-clang-tidy" ''
|
|
|
|
test -f compile_commands.json || (echo "run from build output directory"; exit 1) || exit 1
|
|
|
|
${pkgs.jq}/bin/jq < compile_commands.json -r 'map(.file)|.[]' | grep -v '/generated/' | ${pkgs.parallel}/bin/parallel ${pkgs.clang-tools}/bin/clang-tidy -p compile_commands.json $@
|
|
|
|
'';
|
|
|
|
|
|
|
|
installCheckInputs = up.installCheckInputs ++ [run_clang_tidy];
|
|
|
|
|
2020-07-25 03:30:42 +02:00
|
|
|
shellHook = ''
|
2021-04-12 22:26:55 +02:00
|
|
|
export NIX_DATA_DIR="${toString depot.path}/third_party"
|
2020-07-25 03:30:42 +02:00
|
|
|
export NIX_TEST_VAR=foo
|
|
|
|
'';
|
|
|
|
});
|
|
|
|
test-vm = import ./test-vm.nix args;
|
|
|
|
};
|
|
|
|
})
|