forked from urbit/urbit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
default.nix
168 lines (124 loc) · 4.97 KB
/
default.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
/* Examples
Shared urbit and urbit-worker binaries:
$ nix-build -A urbit
Static urbit and urbit-worker binaries:
$ nix-build -A urbit --arg enableStatic true
Note that on linux the previous command is equivalent to:
$ nix-build -A urbit --argstr crossSystem x86_64-unknown-linux-musl \
--arg enableStatic true
Static release tarball:
$ nix-build -A tarball --arg enableStatic true
Build a pill:
$ nix-build -A ivory.build
$ nix-build -A brass.build
$ nix-build -A solid.build
*/
# The build system where packages will be _built_.
{ system ? builtins.currentSystem
# The host system where packages will _run_.
, crossSystem ? null
# Additional sources.json overrides.
, sources ? { }
# Additional nixpkgs.config overrides.
, config ? { }
# Additional nixpkgs.overlays.
, overlays ? [ ]
# Overlays to apply to the last package set in cross compilation.
, crossOverlays ? [ ]
# Whether to use pkgs.pkgsStatic.* to obtain statically linked package
# dependencies - ie. when building fully-static libraries or executables.
, enableStatic ? false
# release channel (when static)
, verePace ? "" }:
let
pkgsNative = import ./nix/default.nix { inherit system; };
pkgsCross = import ./nix/default.nix {
inherit system sources config overlays crossOverlays;
# If we're running on linux and crossSystem is unspecified but
# enableStatic = true - set the crossSystem to musl64.
crossSystem =
if system == "x86_64-linux" && crossSystem == null && enableStatic then
"x86_64-unknown-linux-musl"
else
if system == "aarch64-linux" && crossSystem == null && enableStatic then
"aarch64-unknown-linux-musl"
else
crossSystem;
};
# Use nixpkgs' top-level/static overlay if enableStatic = true.
pkgsStatic = if enableStatic then pkgsCross.pkgsStatic else pkgsCross;
# Enrich the global package set with our local functions and packages.
# Cross vs static build dependencies can be selectively overridden for
# inputs like python etc.
callPackage =
pkgsNative.lib.callPackageWith (pkgsStatic // libLocal // pkgsLocal);
# Local library import-from-derivation functions such as fetchGitHubLFS, etc.
libLocal = pkgsNative.callPackage ./nix/lib { };
# Local vendored packages defined in ./pkg.
# For non-vendored nixpkgs specific package overrides, see ./nix/overlays.
pkgsLocal = {
ca-bundle = callPackage ./nix/pkgs/ca-bundle { };
ent = callPackage ./nix/pkgs/ent { };
libaes_siv = callPackage ./nix/pkgs/libaes_siv { inherit (pkgsNative) cmake; };
murmur3 = callPackage ./nix/pkgs/murmur3 { };
softfloat3 = callPackage ./nix/pkgs/softfloat3 { };
herb = callPackage ./nix/pkgs/herb { inherit (pkgsCross) python; };
arvo = callPackage ./nix/pkgs/arvo { };
ivory = callPackage ./nix/pkgs/pill/ivory.nix { };
brass = callPackage ./nix/pkgs/pill/brass.nix { };
solid = callPackage ./nix/pkgs/pill/solid.nix { };
marsSources = callPackage ./nix/pkgs/marsSources { };
urbit = callPackage ./nix/pkgs/urbit { inherit enableStatic verePace; };
urcrypt = callPackage ./nix/pkgs/urcrypt { inherit enableStatic; };
docker-image = callPackage ./nix/pkgs/docker-image { };
};
# Additional top-level packages and attributes exposed for convenience.
pkgsExtra = with pkgsLocal; rec {
# Expose packages with local customisations (like patches) for dev access.
inherit (pkgsStatic) libsigsegv lmdb;
urbit-debug = urbit.override { enableDebug = true; };
urbit-tests = libLocal.testFakeShip {
inherit arvo;
urbit = urbit-debug;
pill = solid.lfs;
};
ivory-ropsten = ivory.override { arvo = arvo.ropsten; };
brass-ropsten = brass.override { arvo = arvo.ropsten; };
# Create a .tgz of the primary binaries.
tarball = let
name = "urbit-v${urbit.version}-${urbit.system}";
in libLocal.makeReleaseTarball {
inherit name;
contents = {
"${name}/urbit" = "${urbit}/bin/urbit";
};
};
inherit (pkgsNative) skopeo;
# A convenience function for constructing a shell.nix for any of the
# pkgsLocal derivations by automatically propagating any dependencies
# to the nix-shell.
#
# Example:
#
# let
# pkgs = import ./default.nix { };
# in pkgs.shellFor {
# packages = ps: [
# ps.urbit
# ps.herb
# ];
# }
#
shellFor = { name, packages, ... }@attrs:
pkgsNative.mkShell ({
inputsFrom = packages pkgsLocal;
} // builtins.removeAttrs attrs [ "packages" ]);
};
# Ensure that in the case of cross-compilation we're not statically linking
# against glibc. This is typically a sign that crossSystem is misconfigured.
checkPlatform =
if enableStatic && pkgsCross.stdenv.hostPlatform.libc == "glibc" then
builtins.trace "warning: statically linking against glibc."
else
pkgsNative.lib.id;
in checkPlatform (pkgsLocal // pkgsExtra)