forked from project-oak/oak
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathflake.nix
190 lines (190 loc) · 6.48 KB
/
flake.nix
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
{
description = "oak";
inputs = {
systems.url = "github:nix-systems/x86_64-linux";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
flake-utils.inputs.systems.follows = "systems";
rust-overlay.url = "github:oxalica/rust-overlay";
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
rust-overlay.inputs.flake-utils.follows = "flake-utils";
crane.url = "github:ipetkov/crane";
crane.inputs.nixpkgs.follows = "nixpkgs";
crane.inputs.rust-overlay.follows = "rust-overlay";
};
outputs = { self, systems, nixpkgs, flake-utils, rust-overlay, crane }:
(flake-utils.lib.eachDefaultSystem
(system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [
rust-overlay.overlays.default
];
config = {
android_sdk.accept_license = true; # accept all of the sdk licenses
allowUnfree = true; # needed to get android stuff to compile
};
};
androidSdk =
(pkgs.androidenv.composeAndroidPackages {
platformVersions = [ "30" ];
buildToolsVersions = [ "30.0.0" ];
includeEmulator = false;
includeNDK = false;
includeSources = false;
includeSystemImages = false;
}).androidsdk;
rustToolchain =
pkgs.rust-bin.nightly.latest.default.override {
extensions = [
"clippy"
"llvm-tools-preview"
"rust-analyzer"
"rust-src"
"rustfmt"
];
targets = [
"wasm32-unknown-unknown"
"x86_64-unknown-linux-musl"
"x86_64-unknown-none"
];
};
craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;
src = ./.;
# Build xtask as a package so that we can use it in the devShell and cache it in the
# future, without rebuilding it every time.
xtask = craneLib.buildPackage {
inherit src;
pname = "xtask";
version = "0.1.0";
cargoExtraArgs = "--package=xtask";
buildInputs = [
pkgs.protobuf
];
};
# Build the dependencies of xtask as a package so that we can use it in the devShell and
# cache it in the future, without rebuilding it every time.
cargoDeps = craneLib.buildDepsOnly {
inherit src;
pname = "cargodeps";
version = "0.1.0";
cargoExtraArgs = "--package=xtask";
};
in
{
packages = { };
formatter = pkgs.nixpkgs-fmt;
# We define a recursive set of shells, so that we can easily create a shell with a subset
# of the dependencies for specific CI steps, without having to pull everything all the time.
#
# To add a new dependency, you can search it on https://search.nixos.org/packages and add its
# name to one of the shells defined below.
devShells = rec {
# Base shell with shared dependencies.
base = with pkgs; mkShell {
packages = [
just
ps
which
];
shellHook = ''
source .xtask_bash_completion
'';
};
# Minimal shell with only the dependencies needed to run the Rust tests.
rust = with pkgs; mkShell {
inputsFrom = [
base
];
packages = [
(rust-bin.selectLatestNightlyWith (toolchain: rustToolchain))
cargo-deadlinks
cargo-binutils
cargo-deny
cargo-fuzz
cargo-nextest
cargo-udeps
cargo-vet
protobuf
systemd
qemu_kvm
python312
];
};
# Minimal shell with only the dependencies needed to run the format and check-format
# steps.
lint = with pkgs; mkShell {
packages = [
bazel-buildtools
cargo-deadlinks
clang-tools
hadolint
nixpkgs-fmt
nodePackages.markdownlint-cli
nodePackages.prettier
nodePackages.prettier-plugin-toml
shellcheck
];
shellHook = ''
export NODE_PATH=${nodePackages.prettier-plugin-toml}/lib/node_modules:$NODE_PATH
'';
};
# Minimal shell with only the dependencies needed to run the bazel steps.
bazelShell = with pkgs; mkShell {
shellHook = ''
export ANDROID_HOME="${androidSdk}/libexec/android-sdk"
export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/28.0.3/aapt2";
'';
packages = [
jdk11_headless
bazel
androidSdk
bazel-buildtools
];
};
# Shell for building Oak Containers kernel and system image. This is not included in the
# default shell because it is not needed as part of the CI.
containers = with pkgs; mkShell {
inputsFrom = [
base
rust
];
packages = [
bc
bison
cpio
curl
docker
elfutils
flex
libelf
perl
glibc
glibc.static
ncurses
netcat
umoci
];
};
# Shell for most CI steps (i.e. without contaniners support).
ci = pkgs.mkShell {
inputsFrom = [
rust
bazelShell
lint
];
};
# By default create a shell with all the inputs.
default = pkgs.mkShell {
packages = [ ];
inputsFrom = [
containers
rust
bazelShell
lint
];
};
};
}));
}