Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'flake.nix')
-rw-r--r--flake.nix234
1 files changed, 168 insertions, 66 deletions
diff --git a/flake.nix b/flake.nix
index 5672e62f..c230dc31 100644
--- a/flake.nix
+++ b/flake.nix
@@ -3,8 +3,16 @@
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+ flake-utils.url = "github:numtide/flake-utils";
rust-overlay = {
url = "github:oxalica/rust-overlay";
+ inputs = {
+ nixpkgs.follows = "nixpkgs";
+ flake-utils.follows = "flake-utils";
+ };
+ };
+ crane = {
+ url = "github:ipetkov/crane";
inputs.nixpkgs.follows = "nixpkgs";
};
};
@@ -12,82 +20,176 @@
outputs = {
self,
nixpkgs,
+ crane,
+ flake-utils,
rust-overlay,
...
- }: let
- inherit (nixpkgs) lib;
- eachSystem = lib.genAttrs lib.systems.flakeExposed;
- pkgsFor = eachSystem (system:
- import nixpkgs {
- localSystem.system = system;
- overlays = [(import rust-overlay) self.overlays.helix];
- });
- gitRev = self.rev or self.dirtyRev or null;
- in {
- packages = eachSystem (system: {
- inherit (pkgsFor.${system}) helix;
- /*
- The default Helix build. Uses the latest stable Rust toolchain, and unstable
- nixpkgs.
-
- The build inputs can be overridden with the following:
+ }:
+ flake-utils.lib.eachDefaultSystem (system: let
+ pkgs = import nixpkgs {
+ inherit system;
+ overlays = [(import rust-overlay)];
+ };
+ mkRootPath = rel:
+ builtins.path {
+ path = "${toString ./.}/${rel}";
+ name = rel;
+ };
+ filteredSource = let
+ pathsToIgnore = [
+ ".envrc"
+ ".ignore"
+ ".github"
+ ".gitignore"
+ "logo_dark.svg"
+ "logo_light.svg"
+ "rust-toolchain.toml"
+ "rustfmt.toml"
+ "runtime"
+ "screenshot.png"
+ "book"
+ "docs"
+ "README.md"
+ "CHANGELOG.md"
+ "shell.nix"
+ "default.nix"
+ "grammars.nix"
+ "flake.nix"
+ "flake.lock"
+ ];
+ ignorePaths = path: type: let
+ inherit (nixpkgs) lib;
+ # split the nix store path into its components
+ components = lib.splitString "/" path;
+ # drop off the `/nix/hash-source` section from the path
+ relPathComponents = lib.drop 4 components;
+ # reassemble the path components
+ relPath = lib.concatStringsSep "/" relPathComponents;
+ in
+ lib.all (p: ! (lib.hasPrefix p relPath)) pathsToIgnore;
+ in
+ builtins.path {
+ name = "helix-source";
+ path = toString ./.;
+ # filter out unnecessary paths
+ filter = ignorePaths;
+ };
+ makeOverridableHelix = old: config: let
+ grammars = pkgs.callPackage ./grammars.nix config;
+ runtimeDir = pkgs.runCommand "helix-runtime" {} ''
+ mkdir -p $out
+ ln -s ${mkRootPath "runtime"}/* $out
+ rm -r $out/grammars
+ ln -s ${grammars} $out/grammars
+ '';
+ helix-wrapped =
+ pkgs.runCommand
+ old.name
+ {
+ inherit (old) pname version;
+ meta = old.meta or {};
+ passthru =
+ (old.passthru or {})
+ // {
+ unwrapped = old;
+ };
+ nativeBuildInputs = [pkgs.makeWrapper];
+ makeWrapperArgs = config.makeWrapperArgs or [];
+ }
+ ''
+ cp -rs --no-preserve=mode,ownership ${old} $out
+ wrapProgram "$out/bin/hx" ''${makeWrapperArgs[@]} --set HELIX_RUNTIME "${runtimeDir}"
+ '';
+ in
+ helix-wrapped
+ // {
+ override = makeOverridableHelix old;
+ passthru =
+ helix-wrapped.passthru
+ // {
+ wrapper = old: makeOverridableHelix old config;
+ };
+ };
+ stdenv =
+ if pkgs.stdenv.isLinux
+ then pkgs.stdenv
+ else pkgs.clangStdenv;
+ rustFlagsEnv = pkgs.lib.optionalString stdenv.isLinux "-C link-arg=-fuse-ld=lld -C target-cpu=native -Clink-arg=-Wl,--no-rosegment";
+ rustToolchain = pkgs.pkgsBuildHost.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
+ craneLibMSRV = (crane.mkLib pkgs).overrideToolchain rustToolchain;
+ craneLibStable = (crane.mkLib pkgs).overrideToolchain pkgs.pkgsBuildHost.rust-bin.stable.latest.default;
+ commonArgs = {
+ inherit stdenv;
+ inherit (craneLibMSRV.crateNameFromCargoToml {cargoToml = ./helix-term/Cargo.toml;}) pname;
+ inherit (craneLibMSRV.crateNameFromCargoToml {cargoToml = ./Cargo.toml;}) version;
+ src = filteredSource;
+ # disable fetching and building of tree-sitter grammars in the helix-term build.rs
+ HELIX_DISABLE_AUTO_GRAMMAR_BUILD = "1";
+ buildInputs = [stdenv.cc.cc.lib];
+ # disable tests
+ doCheck = false;
+ meta.mainProgram = "hx";
+ };
+ cargoArtifacts = craneLibMSRV.buildDepsOnly commonArgs;
+ in {
+ packages = {
+ helix-unwrapped = craneLibStable.buildPackage (commonArgs
+ // {
+ cargoArtifacts = craneLibStable.buildDepsOnly commonArgs;
+ postInstall = ''
+ mkdir -p $out/share/applications $out/share/icons/hicolor/scalable/apps $out/share/icons/hicolor/256x256/apps
+ cp contrib/Helix.desktop $out/share/applications
+ cp logo.svg $out/share/icons/hicolor/scalable/apps/helix.svg
+ cp contrib/helix.png $out/share/icons/hicolor/256x256/apps
+ '';
+ });
+ helix = makeOverridableHelix self.packages.${system}.helix-unwrapped {};
+ default = self.packages.${system}.helix;
+ };
- packages.${system}.default.override { rustPlatform = newPlatform; };
+ checks = {
+ # Build the crate itself
+ inherit (self.packages.${system}) helix;
- Overriding a derivation attribute can be done as well:
+ clippy = craneLibMSRV.cargoClippy (commonArgs
+ // {
+ inherit cargoArtifacts;
+ cargoClippyExtraArgs = "--all-targets -- --deny warnings";
+ });
- packages.${system}.default.overrideAttrs { buildType = "debug"; };
- */
- default = self.packages.${system}.helix;
- });
- checks =
- lib.mapAttrs (system: pkgs: let
- # Get Helix's MSRV toolchain to build with by default.
- msrvToolchain = pkgs.pkgsBuildHost.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
- msrvPlatform = pkgs.makeRustPlatform {
- cargo = msrvToolchain;
- rustc = msrvToolchain;
- };
- in {
- helix = self.packages.${system}.helix.override {
- rustPlatform = msrvPlatform;
- };
- })
- pkgsFor;
+ fmt = craneLibMSRV.cargoFmt commonArgs;
- # Devshell behavior is preserved.
- devShells =
- lib.mapAttrs (system: pkgs: {
- default = let
- commonRustFlagsEnv = "-C link-arg=-fuse-ld=lld -C target-cpu=native --cfg tokio_unstable";
- platformRustFlagsEnv = lib.optionalString pkgs.stdenv.isLinux "-Clink-arg=-Wl,--no-rosegment";
- in
- pkgs.mkShell {
- inputsFrom = [self.checks.${system}.helix];
- nativeBuildInputs = with pkgs;
- [
- lld
- cargo-flamegraph
- rust-bin.nightly.latest.rust-analyzer
- ]
- ++ (lib.optional (stdenv.isx86_64 && stdenv.isLinux) cargo-tarpaulin)
- ++ (lib.optional stdenv.isLinux lldb);
- shellHook = ''
- export RUST_BACKTRACE="1"
- export RUSTFLAGS="''${RUSTFLAGS:-""} ${commonRustFlagsEnv} ${platformRustFlagsEnv}"
- '';
- };
- })
- pkgsFor;
+ doc = craneLibMSRV.cargoDoc (commonArgs
+ // {
+ inherit cargoArtifacts;
+ });
- overlays = {
- helix = final: prev: {
- helix = final.callPackage ./default.nix {inherit gitRev;};
+ test = craneLibMSRV.cargoTest (commonArgs
+ // {
+ inherit cargoArtifacts;
+ });
};
- default = self.overlays.helix;
+ devShells.default = pkgs.mkShell {
+ inputsFrom = builtins.attrValues self.checks.${system};
+ nativeBuildInputs = with pkgs;
+ [lld_13 cargo-flamegraph rust-analyzer]
+ ++ (lib.optional (stdenv.isx86_64 && stdenv.isLinux) pkgs.cargo-tarpaulin)
+ ++ (lib.optional stdenv.isLinux pkgs.lldb)
+ ++ (lib.optional stdenv.isDarwin pkgs.darwin.apple_sdk.frameworks.CoreFoundation);
+ shellHook = ''
+ export HELIX_RUNTIME="$PWD/runtime"
+ export RUST_BACKTRACE="1"
+ export RUSTFLAGS="''${RUSTFLAGS:-""} ${rustFlagsEnv}"
+ '';
+ };
+ })
+ // {
+ overlays.default = final: prev: {
+ inherit (self.packages.${final.system}) helix;
+ };
};
- };
+
nixConfig = {
extra-substituters = ["https://helix.cachix.org"];
extra-trusted-public-keys = ["helix.cachix.org-1:ejp9KQpR1FBI2onstMQ34yogDm4OgU2ru6lIwPvuCVs="];