Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'flake.nix')
| -rw-r--r-- | flake.nix | 234 |
1 files changed, 168 insertions, 66 deletions
@@ -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="]; |