Skip to content

Commit 782df67

Browse files
committed
nix: use Nix Flake from NBS repo to provide Nim
This way we can avoid rebuilding Nim every time we build packages. Compilation of `libwaku` with Nim: 9 minutes Compilation of `libwaku` without Nim: 5 minutes Notably this upgrades: - Nim from 2.2.4 to 2.2.8. - Zerokit from 0.9.0 to 1.0.0. Also added CODEOWNERS file for CI and Nix configuration. Depends on: status-im/nimbus-build-system#112 Signed-off-by: Jakub Sokołowski <jakub@status.im>
1 parent c7e0cc0 commit 782df67

13 files changed

Lines changed: 100 additions & 188 deletions

File tree

.github/CODEOWNERS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Changes to Nix and CI require approval from DevOps team
2+
Makefile @logos-messaging/devops
3+
/ci/ @logos-messaging/devops
4+
/.github/ @logos-messaging/devops
5+
/nix/ @logos-messaging/devops
6+
/flake.nix @logos-messaging/devops
7+
/flake.lock @logos-messaging/devops

.github/workflows/ci-nix.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ jobs:
1919
- libwaku
2020
- libwaku-android-arm64
2121
- wakucanary
22+
- liblogosdelivery
2223

2324
exclude:
2425
# Android SDK limitation
@@ -39,10 +40,10 @@ jobs:
3940
with:
4041
submodules: recursive
4142

42-
- name: 'Run Nix build for {{ matrix.nixpkg }}'
43+
- name: 'Run Nix build for ${{ matrix.nixpkg }}'
4344
shell: bash
4445
run: nix build -L '.?submodules=1#${{ matrix.nixpkg }}'
4546

4647
- name: 'Show result contents'
4748
shell: bash
48-
run: find result -type f
49+
run: find result/ -type f

flake.lock

Lines changed: 28 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
nixpkgs.url = "github:NixOS/nixpkgs/0ef228213045d2cdb5a169a95d63ded38670b293";
1313
# WARNING: Remember to update commit and use 'nix flake update' to update flake.lock.
1414
zerokit = {
15-
url = "git+https://github.com/vacp2p/zerokit?rev=3160d9504d07791f2fc9b610948a6cf9a58ed488";
15+
url = "git+file:./vendor/zerokit";
16+
inputs.nixpkgs.follows = "nixpkgs";
17+
};
18+
nimbusBuildSystem = {
19+
url = "git+file:./vendor/nimbus-build-system?submodules=1";
1620
inputs.nixpkgs.follows = "nixpkgs";
1721
};
1822
};
1923

20-
outputs = { self, nixpkgs, zerokit }:
24+
outputs = { self, nixpkgs, zerokit, nimbusBuildSystem }:
2125
let
2226
stableSystems = [
2327
"x86_64-linux" "aarch64-linux"
@@ -47,42 +51,30 @@
4751

4852
in rec {
4953
packages = forAllSystems (system: let
50-
pkgs = pkgsFor.${system};
51-
in rec {
52-
libwaku-android-arm64 = pkgs.callPackage ./nix/default.nix {
53-
inherit stableSystems;
54+
nim = nimbusBuildSystem.packages.${system}.nim;
55+
buildTargets = pkgsFor.${system}.callPackage ./nix/default.nix {
56+
inherit stableSystems nim;
5457
src = self;
58+
zerokitRln = zerokit.packages.${system}.rln;
59+
};
60+
in rec {
61+
libwaku-android-arm64 = buildTargets.override {
5562
targets = ["libwaku-android-arm64"];
5663
abidir = "arm64-v8a";
5764
zerokitRln = zerokit.packages.${system}.rln-android-arm64;
5865
};
5966

60-
libwaku = pkgs.callPackage ./nix/default.nix {
61-
inherit stableSystems;
62-
src = self;
63-
targets = ["libwaku"];
64-
zerokitRln = zerokit.packages.${system}.rln;
65-
};
66-
67-
wakucanary = pkgs.callPackage ./nix/default.nix {
68-
inherit stableSystems;
69-
src = self;
70-
targets = ["wakucanary"];
71-
zerokitRln = zerokit.packages.${system}.rln;
72-
};
73-
74-
liblogosdelivery = pkgs.callPackage ./nix/default.nix {
75-
inherit stableSystems;
76-
src = self;
77-
targets = ["liblogosdelivery"];
78-
zerokitRln = zerokit.packages.${system}.rln;
79-
};
67+
libwaku = buildTargets.override { targets = ["libwaku"]; };
68+
wakucanary = buildTargets.override { targets = ["wakucanary"]; };
69+
liblogosdelivery = buildTargets.override { targets = ["liblogosdelivery"]; };
8070

8171
default = libwaku;
8272
});
8373

8474
devShells = forAllSystems (system: {
85-
default = pkgsFor.${system}.callPackage ./nix/shell.nix {};
75+
default = pkgsFor.${system}.callPackage ./nix/shell.nix {
76+
inherit (nimbusBuildSystem.packages.${system}) nim;
77+
};
8678
});
8779
};
8880
}

nix/checksums.nix

Lines changed: 0 additions & 12 deletions
This file was deleted.

nix/csources.nix

Lines changed: 0 additions & 12 deletions
This file was deleted.

nix/default.nix

Lines changed: 33 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
{
22
pkgs,
33
src ? ../.,
4-
targets ? ["libwaku-android-arm64"],
4+
# Nimbus-build-system package.
5+
nim ? null,
6+
# Options: 0,1,2
57
verbosity ? 1,
6-
useSystemNim ? true,
7-
quickAndDirty ? true,
8-
stableSystems ? [
9-
"x86_64-linux" "aarch64-linux"
10-
],
8+
# Make targets
9+
targets ? ["libwaku-android-arm64"],
10+
# These are the only platforms tested in CI and considered stable.
11+
stableSystems ? ["x86_64-linux" "aarch64-linux"],
1112
abidir ? null,
1213
zerokitRln,
1314
}:
@@ -17,24 +18,33 @@ assert pkgs.lib.assertMsg ((src.submodules or true) == true)
1718

1819
let
1920
inherit (pkgs) stdenv lib writeScriptBin callPackage;
21+
inherit (lib) any match substring optionals optionalString;
2022

21-
androidManifest = "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"com.example.mylibrary\" />";
23+
# Check if build is for android platform.
24+
containsAndroid = s: (match ".*android.*" s) != null;
25+
isAndroidBuild = any containsAndroid targets;
2226

2327
tools = pkgs.callPackage ./tools.nix {};
2428
version = tools.findKeyValue "^version = \"([a-f0-9.-]+)\"$" ../waku.nimble;
2529
revision = lib.substring 0 8 (src.rev or src.dirtyRev or "00000000");
26-
copyLibwaku = lib.elem "libwaku" targets;
27-
copyLiblogosdelivery = lib.elem "liblogosdelivery" targets;
28-
copyWakunode2 = lib.elem "wakunode2" targets;
29-
hasKnownInstallTarget = copyLibwaku || copyLiblogosdelivery || copyWakunode2;
30+
31+
androidManifest = "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"com.example.mylibrary\" />";
3032

3133
in stdenv.mkDerivation {
3234
pname = "logos-messaging-nim";
3335
version = "${version}-${revision}";
3436

3537
inherit src;
3638

37-
# Runtime dependencies
39+
env = {
40+
# Disable CPU optimizations that make binary not portable.
41+
NIMFLAGS = "-d:disableMarchNative";
42+
# Optional variables required for Android builds
43+
ANDROID_SDK_ROOT = optionalString isAndroidBuild pkgs.androidPkgs.sdk;
44+
ANDROID_NDK_HOME = optionalString isAndroidBuild pkgs.androidPkgs.ndk;
45+
};
46+
47+
# Dependencies that should exist in the runtime environment.
3848
buildInputs = with pkgs; [
3949
openssl gmp zip
4050
];
@@ -44,100 +54,37 @@ in stdenv.mkDerivation {
4454
# Fix for Nim compiler calling 'git rev-parse' and 'lsb_release'.
4555
fakeGit = writeScriptBin "git" "echo ${version}";
4656
in with pkgs; [
47-
cmake which zerokitRln nim-unwrapped-2_2 fakeGit
48-
] ++ lib.optionals stdenv.isDarwin [
57+
nim cmake which zerokitRln fakeGit
58+
] ++ optionals stdenv.isDarwin [
4959
pkgs.darwin.cctools gcc # Necessary for libbacktrace
5060
];
5161

52-
# Environment variables required for Android builds
53-
ANDROID_SDK_ROOT = "${pkgs.androidPkgs.sdk}";
54-
ANDROID_NDK_HOME = "${pkgs.androidPkgs.ndk}";
55-
NIMFLAGS = "-d:disableMarchNative -d:git_revision_override=${revision}";
56-
XDG_CACHE_HOME = "/tmp";
57-
5862
makeFlags = targets ++ [
5963
"V=${toString verbosity}"
60-
"QUICK_AND_DIRTY_COMPILER=${if quickAndDirty then "1" else "0"}"
61-
"QUICK_AND_DIRTY_NIMBLE=${if quickAndDirty then "1" else "0"}"
62-
"USE_SYSTEM_NIM=${if useSystemNim then "1" else "0"}"
6364
"LIBRLN_FILE=${zerokitRln}/lib/librln.${if abidir != null then "so" else "a"}"
6465
"POSTGRES=1"
66+
# Built from nimbus-build-system via flake.
67+
"USE_SYSTEM_NIM=1"
6568
];
6669

6770
configurePhase = ''
71+
# Avoid /tmp write errors.
72+
export XDG_CACHE_HOME=$TMPDIR/cache
6873
patchShebangs . vendor/nimbus-build-system > /dev/null
69-
70-
# build_nim.sh guards "rm -rf dist/checksums" with NIX_BUILD_TOP != "/build",
71-
# but on macOS the nix sandbox uses /private/tmp/... so the check fails and
72-
# dist/checksums (provided via preBuild) gets deleted. Fix the check to skip
73-
# the removal whenever NIX_BUILD_TOP is set (i.e. any nix build).
74-
substituteInPlace vendor/nimbus-build-system/scripts/build_nim.sh \
75-
--replace 'if [[ "''${NIX_BUILD_TOP}" != "/build" ]]; then' \
76-
'if [[ -z "''${NIX_BUILD_TOP}" ]]; then'
77-
7874
make nimbus-build-system-paths
7975
make nimbus-build-system-nimble-dir
8076
'';
8177

82-
# For the Nim v2.2.4 built with NBS we added sat and zippy
83-
preBuild = lib.optionalString (!useSystemNim) ''
84-
pushd vendor/nimbus-build-system/vendor/Nim
85-
mkdir dist
86-
mkdir -p dist/nimble/vendor/sat
87-
mkdir -p dist/nimble/vendor/checksums
88-
mkdir -p dist/nimble/vendor/zippy
89-
90-
cp -r ${callPackage ./nimble.nix {}}/. dist/nimble
91-
cp -r ${callPackage ./checksums.nix {}}/. dist/checksums
92-
cp -r ${callPackage ./csources.nix {}}/. csources_v2
93-
cp -r ${callPackage ./sat.nix {}}/. dist/nimble/vendor/sat
94-
cp -r ${callPackage ./checksums.nix {}}/. dist/nimble/vendor/checksums
95-
cp -r ${callPackage ./zippy.nix {}}/. dist/nimble/vendor/zippy
96-
chmod 777 -R dist/nimble csources_v2
97-
popd
98-
'';
99-
100-
installPhase = if abidir != null then ''
78+
installPhase = if isAndroidBuild then ''
10179
mkdir -p $out/jni
10280
cp -r ./build/android/${abidir}/* $out/jni/
10381
echo '${androidManifest}' > $out/jni/AndroidManifest.xml
10482
cd $out && zip -r libwaku.aar *
10583
'' else ''
106-
mkdir -p $out/bin $out/include
107-
108-
# Copy artifacts from build directory (created by Make during buildPhase)
109-
# Note: build/ is in the source tree, not result/ (which is a post-build symlink)
110-
if [ -d build ]; then
111-
${lib.optionalString copyLibwaku ''
112-
cp build/libwaku.{so,dylib,dll,a,lib} $out/bin/ 2>/dev/null || true
113-
''}
114-
115-
${lib.optionalString copyLiblogosdelivery ''
116-
cp build/liblogosdelivery.{so,dylib,dll,a,lib} $out/bin/ 2>/dev/null || true
117-
''}
118-
119-
${lib.optionalString copyWakunode2 ''
120-
cp build/wakunode2 $out/bin/ 2>/dev/null || true
121-
''}
122-
123-
${lib.optionalString (!hasKnownInstallTarget) ''
124-
cp build/lib*.{so,dylib,dll,a,lib} $out/bin/ 2>/dev/null || true
125-
''}
126-
fi
127-
128-
# Copy header files
129-
${lib.optionalString copyLibwaku ''
130-
cp library/libwaku.h $out/include/ 2>/dev/null || true
131-
''}
132-
133-
${lib.optionalString copyLiblogosdelivery ''
134-
cp liblogosdelivery/liblogosdelivery.h $out/include/ 2>/dev/null || true
135-
''}
136-
137-
${lib.optionalString (!hasKnownInstallTarget) ''
138-
cp library/libwaku.h $out/include/ 2>/dev/null || true
139-
cp liblogosdelivery/liblogosdelivery.h $out/include/ 2>/dev/null || true
140-
''}
84+
mkdir -p $out/bin $out/lib $out/include
85+
cp build/waku* $out/bin/ || true
86+
cp build/lib* $out/lib/ || true
87+
cp lib*/lib*.h $out/include/
14188
'';
14289

14390
meta = with pkgs.lib; {

nix/nimble.nix

Lines changed: 0 additions & 12 deletions
This file was deleted.

nix/sat.nix

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)