blob: 704ba3f5fa66dd6a7ed1e93ef7bf61a4202159a9 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
args@{
pkgs ? (import ../.. {}).third_party
, lib
, buildType ? "release"
, depotPath ? ../..
, ...
}:
let
aws-s3-cpp = pkgs.aws-sdk-cpp.override {
apis = ["s3" "transfer"];
customMemoryManagement = false;
};
# TODO(tazjin): this is copied from the original derivation, but what
# is it for?
largeBoehm = pkgs.boehmgc.override {
enableLargeConfig = true;
};
src = ./.;
# Proto generation in CMake is theoretically possible, but that is
# very theoretical - this does it in Nix instead.
protoSrcs = pkgs.runCommand "nix-proto-srcs" {} ''
export PROTO_SRCS=${src + "/src/proto"}
mkdir -p $out/libproto
${pkgs.protobuf}/bin/protoc -I=$PROTO_SRCS \
--cpp_out=$out/libproto \
--plugin=protoc-gen-grpc=${pkgs.grpc}/bin/grpc_cpp_plugin --grpc_out=$out/libproto \
$PROTO_SRCS/*.proto
'';
in lib.fix (self: pkgs.llvmPackages.libcxxStdenv.mkDerivation {
pname = "tvix";
version = "2.3.4";
inherit src;
nativeBuildInputs = with pkgs; [
bison
clang-tools
cmake
libxml2
libxslt
pkgconfig
(import ./clangd.nix pkgs)
];
# TODO(tazjin): Some of these might only be required for native inputs
buildInputs = with pkgs; [
abseil_cpp
aws-s3-cpp
brotli
bzip2
c-ares
curl
editline
flex
glog
grpc
libseccomp
libsodium
openssl
protobuf
sqlite
xz
];
doCheck = false;
doInstallCheck = true;
installCheckInputs = with pkgs; [
fd
gtest
rapidcheck
];
propagatedBuildInputs = with pkgs; [
boost
largeBoehm
];
configurePhase = ''
mkdir build
cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=$out \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF \
-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF \
-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON
'';
installCheckPhase = ''
export NIX_DATA_DIR=$out/share
export NIX_TEST_VAR=foo # this is required by a language test
make test
# 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
'';
preBuild = ''
if [ -n "$NIX_BUILD_CORES" ]; then
makeFlags+="-j$NIX_BUILD_CORES "
makeFlags+="-l$NIX_BUILD_CORES "
fi
'';
# Forward the location of the generated Protobuf / gRPC files so
# that they can be included by CMake.
NIX_PROTO_SRCS = protoSrcs;
# Work around broken system header include flags in the cxx toolchain.
LIBCXX_INCLUDE = "${pkgs.llvmPackages.libcxx}/include/c++/v1";
# 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-daemon
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
ln -s $out/bin/nix $out/libexec/nix/build-remote
# configuration variables for templated files
export storedir=/nix/store
export localstatedir=/nix/var/nix
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
'';
# TODO(tazjin): integration test setup?
# TODO(tazjin): docs generation?
passthru = {
build-shell = self.overrideAttrs (_: {
shellHook = ''
export NIX_DATA_DIR="${toString depotPath}/third_party"
export NIX_TEST_VAR=foo
'';
});
test-vm = import ./test-vm.nix args;
};
})
|