add(nix): add crate2nix (#1181)

* add(nix): add crate2nix

To have a better experience on ci, due to improved caching
of dependencies. Also organize file hierarchy slightly.

* ci(nix): manually check a default system

Is needed because `nix flake check` accidentally tries to build IFD.
This commit is contained in:
a-kenji 2022-03-06 14:28:54 +01:00 committed by GitHub
parent a624cb3510
commit f5ae10de78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 235 additions and 128 deletions

View File

@ -9,11 +9,33 @@ on:
- main
jobs:
nix:
#check:
#runs-on: ubuntu-latest
#name: "flake check"
#environment: cachix
#timeout-minutes: 5
#steps:
#- uses: actions/checkout@v3
#with:
## Nix Flakes doesn't work on shallow clones
#fetch-depth: 0
#- uses: cachix/install-nix-action@v16
#with:
#extra_nix_config: |
#experimental-features = nix-command flakes
#fetch-depth: 0
#- uses: cachix/cachix-action@v10
#with:
#name: zellij
## If you chose API tokens for write access OR if you have a private cache
#authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
#- run: nix flake check --print-build-logs --show-trace
build:
runs-on: ubuntu-latest
name: nix-build
name: "build"
environment: cachix
timeout-minutes: 15
timeout-minutes: 25
steps:
- uses: actions/checkout@v3
with:
@ -29,6 +51,25 @@ jobs:
name: zellij
# If you chose API tokens for write access OR if you have a private cache
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
- run: nix flake check --print-build-logs --show-trace
- run: nix build
develop:
runs-on: ubuntu-latest
name: develop
environment: cachix
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
with:
# Nix Flakes doesn't work on shallow clones
fetch-depth: 0
- uses: cachix/install-nix-action@v16
with:
extra_nix_config: |
experimental-features = nix-command flakes
fetch-depth: 0
- uses: cachix/cachix-action@v10
with:
name: zellij
# If you chose API tokens for write access OR if you have a private cache
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
- run: nix develop --profile devShell

View File

@ -1,5 +1,21 @@
{
"nodes": {
"crate2nix": {
"flake": false,
"locked": {
"lastModified": 1646322090,
"narHash": "sha256-Jtqd5Ory+1LgMMTY0tNJKd/U2mOiPRd/oYnuyTHE08o=",
"owner": "kolloch",
"repo": "crate2nix",
"rev": "c4a479172ebafdd3baf36aa274b2168b4fd42f40",
"type": "github"
},
"original": {
"owner": "kolloch",
"repo": "crate2nix",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
@ -49,6 +65,7 @@
},
"root": {
"inputs": {
"crate2nix": "crate2nix",
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",

127
flake.nix
View File

@ -10,130 +10,9 @@
rust-overlay.inputs.flake-utils.follows = "flake-utils";
flake-compat.url = "github:edolstra/flake-compat";
flake-compat.flake = false;
crate2nix.url = "github:kolloch/crate2nix";
crate2nix.flake = false;
};
outputs = { self, rust-overlay, nixpkgs, flake-utils, flake-compat }:
flake-utils.lib.eachSystem [
"aarch64-linux"
"aarch64-darwin"
"i686-linux"
"x86_64-darwin"
"x86_64-linux"
]
(system:
let
overlays = [ (import rust-overlay) ];
pkgs = import nixpkgs { inherit system overlays; };
name = "zellij";
pname = name;
root = toString ./.;
ignoreSource = [ ".git" "target" "example" ];
src = pkgs.nix-gitignore.gitignoreSource ignoreSource root;
rustToolchainToml = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain;
cargoLock = {
lockFile = (builtins.path { path = ./Cargo.lock; name = "Cargo.lock"; });
};
cargo = rustToolchainToml;
rustc = rustToolchainToml;
#env
RUST_BACKTRACE = 1;
buildInputs = [
rustToolchainToml
# in order to run tests
pkgs.openssl
];
nativeBuildInputs = [
# generates manpages
pkgs.mandown
pkgs.installShellFiles
pkgs.copyDesktopItems
# for openssl/openssl-sys
pkgs.pkg-config
];
devInputs = [
pkgs.cargo-make
pkgs.rust-analyzer
pkgs.nixpkgs-fmt
# optimizes wasm binaries
pkgs.binaryen
# used for snapshotting the e2e tests
pkgs.cargo-insta
];
in
rec {
packages.zellij =
(pkgs.makeRustPlatform { inherit cargo rustc; }).buildRustPackage {
inherit src name cargoLock buildInputs nativeBuildInputs;
preCheck = ''
HOME=$TMPDIR
'';
postInstall = ''
mandown ./docs/MANPAGE.md > ./zellij.1
installManPage ./zellij.1
# explicit behavior
$out/bin/zellij setup --generate-completion bash > ./completions.bash
installShellCompletion --bash --name ${pname}.bash ./completions.bash
$out/bin/zellij setup --generate-completion fish > ./completions.fish
installShellCompletion --fish --name ${pname}.fish ./completions.fish
$out/bin/zellij setup --generate-completion zsh > ./completions.zsh
installShellCompletion --zsh --name _${pname} ./completions.zsh
install -Dm644 ./assets/logo.png $out/share/icons/hicolor/scalable/apps/zellij.png
copyDesktopItems
'';
desktopItems = [
(pkgs.makeDesktopItem {
type = "Application";
inherit name;
desktopName = "zellij";
terminal = true;
genericName = "Terminal multiplexer";
comment = "Manage your terminal applications";
exec = "zellij";
icon = "zellij";
categories = [ "ConsoleOnly;System" ];
})
];
meta = with pkgs.lib; {
homepage = "https://github.com/zellij-org/zellij/";
description = "A terminal workspace with batteries included";
license = [ licenses.mit ];
};
};
defaultPackage = packages.zellij;
# nix run
apps.zellij = flake-utils.lib.mkApp { drv = packages.zellij; };
defaultApp = apps.zellij;
devShell = pkgs.mkShell {
name = "zellij-dev";
inherit buildInputs RUST_BACKTRACE;
nativeBuildInputs = nativeBuildInputs ++ devInputs;
};
});
outputs = { ... } @ args: import ./nix args;
}

30
nix/crate2nix.nix Normal file
View File

@ -0,0 +1,30 @@
{ pkgs
, crate2nix
, name
, src
, postInstall
, desktopItems
, meta
}:
let
inherit (import "${crate2nix}/tools.nix" { inherit pkgs; })
generatedCargoNix;
project = import
(generatedCargoNix {
inherit name src;
})
{
inherit pkgs;
buildRustCrateForPkgs = pkgs:
pkgs.buildRustCrate.override {
defaultCrateOverrides = pkgs.defaultCrateOverrides // {
inherit postInstall desktopItems meta;
# Crate dependency overrides go here
};
};
};
in
project.workspaceMembers.zellij.build

129
nix/default.nix Normal file
View File

@ -0,0 +1,129 @@
{ self
, nixpkgs
, rust-overlay
, flake-utils
, flake-compat
, crate2nix
}:
flake-utils.lib.eachSystem [
"aarch64-linux"
"aarch64-darwin"
"i686-linux"
"x86_64-darwin"
"x86_64-linux"
]
(system:
let
overlays = [ (import rust-overlay) ];
pkgs = import nixpkgs { inherit system overlays; };
name = "zellij";
pname = name;
root = toString ../.;
ignoreSource = [ ".git" "target" "example" ];
src = pkgs.nix-gitignore.gitignoreSource ignoreSource root;
rustToolchainToml = pkgs.rust-bin.fromRustupToolchainFile ../rust-toolchain;
cargoLock = {
lockFile = (builtins.path { path = ../Cargo.lock; name = "Cargo.lock"; });
};
cargo = rustToolchainToml;
rustc = rustToolchainToml;
buildInputs = [
rustToolchainToml
# in order to run tests
pkgs.openssl
];
nativeBuildInputs = [
# generates manpages
pkgs.mandown
pkgs.installShellFiles
pkgs.copyDesktopItems
# for openssl/openssl-sys
pkgs.pkg-config
];
devInputs = [
pkgs.cargo-make
pkgs.rust-analyzer
pkgs.nixpkgs-fmt
# optimizes wasm binaries
pkgs.binaryen
# used for snapshotting the e2e tests
pkgs.cargo-insta
];
postInstall = ''
mandown ./docs/MANPAGE.md > ./zellij.1
installManPage ./zellij.1
# explicit behavior
$out/bin/zellij setup --generate-completion bash > ./completions.bash
installShellCompletion --bash --name ${pname}.bash ./completions.bash
$out/bin/zellij setup --generate-completion fish > ./completions.fish
installShellCompletion --fish --name ${pname}.fish ./completions.fish
$out/bin/zellij setup --generate-completion zsh > ./completions.zsh
installShellCompletion --zsh --name _${pname} ./completions.zsh
install -Dm644 ./assets/logo.png $out/share/icons/hicolor/scalable/apps/zellij.png
copyDesktopItems
'';
desktopItems = [
(pkgs.makeDesktopItem {
type = "Application";
inherit name;
desktopName = "zellij";
terminal = true;
genericName = "Terminal multiplexer";
comment = "Manage your terminal applications";
exec = "zellij";
icon = "zellij";
categories = [ "ConsoleOnly;System" ];
})
];
meta = with pkgs.lib; {
homepage = "https://github.com/zellij-org/zellij/";
description = "A terminal workspace with batteries included";
license = [ licenses.mit ];
};
in
rec {
# crate2nix - better incremental builds, but uses ifd
packages.zellij = pkgs.callPackage ./crate2nix.nix {
inherit crate2nix name src desktopItems postInstall meta;
};
# native nixpkgs support - keep supported
packages.zellij-native =
(pkgs.makeRustPlatform { inherit cargo rustc; }).buildRustPackage {
inherit src name cargoLock
buildInputs nativeBuildInputs
postInstall desktopItems meta;
};
defaultPackage = packages.zellij;
# nix run
apps.zellij = flake-utils.lib.mkApp { drv = packages.zellij; };
defaultApp = apps.zellij;
devShell = pkgs.callPackage ./devShell.nix {
inherit buildInputs;
nativeBuildInputs = nativeBuildInputs ++ devInputs;
};
})

11
nix/devShell.nix Normal file
View File

@ -0,0 +1,11 @@
{ mkShell
, buildInputs
, nativeBuildInputs
}:
mkShell {
name = "zj-dev-env";
inherit buildInputs nativeBuildInputs;
### Environment Variables
RUST_BACKTRACE = 1;
}