diff --git a/flake.nix b/flake.nix index 94bd7e7..99847b2 100644 --- a/flake.nix +++ b/flake.nix @@ -63,6 +63,13 @@ }; }; + flake = { + templates.rust = { + description = "Crane + Fenix flake with mold for faster local builds."; + path = ./templates/rust; + }; + }; + # Define your clan # See: https://docs.clan.lol/reference/nix-api/buildclan/ clan = { diff --git a/templates/rust/.gitignore b/templates/rust/.gitignore new file mode 100644 index 0000000..d38c33a --- /dev/null +++ b/templates/rust/.gitignore @@ -0,0 +1,24 @@ +# Created by https://www.toptal.com/developers/gitignore/api/rust,direnv +# Edit at https://www.toptal.com/developers/gitignore?templates=rust,direnv + +### direnv ### +.direnv +.envrc + +### Rust ### +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +# Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# End of https://www.toptal.com/developers/gitignore/api/rust,direnv diff --git a/templates/rust/flake.nix b/templates/rust/flake.nix new file mode 100644 index 0000000..2511ce7 --- /dev/null +++ b/templates/rust/flake.nix @@ -0,0 +1,69 @@ +{ + inputs = { + crane.url = "github:ipetkov/crane"; + crane.inputs.nixpkgs.follows = "nixpkgs"; + fenix.url = "github:nix-community/fenix"; + fenix.inputs.nixpkgs.follows = "nixpkgs"; + flake-utils.url = "github:numtide/flake-utils"; + nixpkgs.url = "nixpkgs/nixos-unstable"; + }; + + outputs = { + crane, + flake-utils, + nixpkgs, + ... + } @ inputs: + flake-utils.lib.eachDefaultSystem ( + system: let + inherit (pkgs) lib; + pkgs = import nixpkgs {inherit system;}; + fenix = inputs.fenix.packages.${system}; + craneLib = crane.lib.${system}.overrideToolchain toolchain.toolchain; + mkSrc = extraPaths: + with lib.fileset; let + root = ./.; + rustFiles = fromSource (craneLib.cleanCargoSource root); + fileset = union rustFiles (unions extraPaths); + in + toSource {inherit root fileset;}; + + ## Customize here ## + toolchain = fenix.complete; # or fenix.stable; + stdenv = pkgs.stdenvAdapters.useMoldLinker pkgs.stdenv; + in { + packages.default = craneLib.buildPackage { + inherit stdenv; + src = mkSrc []; + strictDeps = true; + buildInputs = + [ + # Add additional build inputs here + ] + ++ lib.optionals pkgs.stdenv.isDarwin [ + # Additional darwin specific inputs can be set here + pkgs.libiconv + ]; + # Additional environment variables can be set directly + # MY_CUSTOM_VAR = "some value"; + }; + + devShells.default = + pkgs.mkShell.override {inherit stdenv;} + { + nativeBuildInputs = with pkgs; + [ + # Add additional build inputs here + ] + ++ (with toolchain; [ + cargo + clippy + rustfmt + rustc + fenix.rust-analyzer + ]); + RUST_SRC_PATH = "${toolchain.rust-src}/lib/rustlib/src/rust/library"; + }; + } + ); +}