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:
parent
a624cb3510
commit
f5ae10de78
6 changed files with 235 additions and 128 deletions
49
.github/workflows/nix.yml
vendored
49
.github/workflows/nix.yml
vendored
|
|
@ -9,11 +9,33 @@ on:
|
||||||
- main
|
- main
|
||||||
|
|
||||||
jobs:
|
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
|
runs-on: ubuntu-latest
|
||||||
name: nix-build
|
name: "build"
|
||||||
environment: cachix
|
environment: cachix
|
||||||
timeout-minutes: 15
|
timeout-minutes: 25
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
|
|
@ -29,6 +51,25 @@ jobs:
|
||||||
name: zellij
|
name: zellij
|
||||||
# If you chose API tokens for write access OR if you have a private cache
|
# If you chose API tokens for write access OR if you have a private cache
|
||||||
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||||
- run: nix flake check --print-build-logs --show-trace
|
|
||||||
- run: nix build
|
- 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
|
- run: nix develop --profile devShell
|
||||||
|
|
|
||||||
17
flake.lock
generated
17
flake.lock
generated
|
|
@ -1,5 +1,21 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"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-compat": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|
@ -49,6 +65,7 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"crate2nix": "crate2nix",
|
||||||
"flake-compat": "flake-compat",
|
"flake-compat": "flake-compat",
|
||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
|
|
|
||||||
127
flake.nix
127
flake.nix
|
|
@ -10,130 +10,9 @@
|
||||||
rust-overlay.inputs.flake-utils.follows = "flake-utils";
|
rust-overlay.inputs.flake-utils.follows = "flake-utils";
|
||||||
flake-compat.url = "github:edolstra/flake-compat";
|
flake-compat.url = "github:edolstra/flake-compat";
|
||||||
flake-compat.flake = false;
|
flake-compat.flake = false;
|
||||||
|
crate2nix.url = "github:kolloch/crate2nix";
|
||||||
|
crate2nix.flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, rust-overlay, nixpkgs, flake-utils, flake-compat }:
|
outputs = { ... } @ args: import ./nix args;
|
||||||
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;
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
30
nix/crate2nix.nix
Normal file
30
nix/crate2nix.nix
Normal 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
129
nix/default.nix
Normal 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
11
nix/devShell.nix
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
{ mkShell
|
||||||
|
, buildInputs
|
||||||
|
, nativeBuildInputs
|
||||||
|
}:
|
||||||
|
|
||||||
|
mkShell {
|
||||||
|
name = "zj-dev-env";
|
||||||
|
inherit buildInputs nativeBuildInputs;
|
||||||
|
### Environment Variables
|
||||||
|
RUST_BACKTRACE = 1;
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue