Initial commit
This commit is contained in:
commit
e483f73dd4
12 changed files with 479 additions and 0 deletions
77
crane.nix
Normal file
77
crane.nix
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
craneFlake:
|
||||
{ config, lib, flake-parts-lib, ... }:
|
||||
let
|
||||
inherit (lib) mkOption types mkIf mkDefault mkMerge;
|
||||
inherit (flake-parts-lib) mkPerSystemOption;
|
||||
cfg = config.rust.crane;
|
||||
mkTcDefault = lib.mkOverride 900;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
rust.crane = {
|
||||
lib = mkOption {
|
||||
type = types.anything;
|
||||
default = craneFlake.lib;
|
||||
};
|
||||
};
|
||||
|
||||
perSystem = mkPerSystemOption {
|
||||
_file = ./crane.nix;
|
||||
options = {
|
||||
rust.crane = {
|
||||
toolchain = mkOption {
|
||||
type = types.nullOr types.package;
|
||||
default = null;
|
||||
};
|
||||
|
||||
cargo = mkOption {
|
||||
type = types.package;
|
||||
};
|
||||
|
||||
clippy = mkOption {
|
||||
type = types.package;
|
||||
};
|
||||
|
||||
rustc = mkOption {
|
||||
type = types.package;
|
||||
};
|
||||
|
||||
rustfmt = mkOption {
|
||||
type = types.package;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config.perSystem = psinputs@{ config, pkgs, system, inputs', ... }:
|
||||
let cfg' = config.rust.crane;
|
||||
in
|
||||
{
|
||||
config = mkMerge [
|
||||
{
|
||||
rust.crane.cargo = mkDefault pkgs.cargo;
|
||||
rust.crane.rustc = mkDefault pkgs.rustc;
|
||||
rust.crane.clippy = mkDefault pkgs.clippy;
|
||||
rust.crane.rustfmt = mkDefault pkgs.rustfmt;
|
||||
}
|
||||
|
||||
(mkIf (cfg'.toolchain != null) {
|
||||
rust.crane.cargo = mkTcDefault cfg'.toolchain;
|
||||
rust.crane.rustc = mkTcDefault cfg'.toolchain;
|
||||
rust.crane.clippy = mkTcDefault cfg'.toolchain;
|
||||
rust.crane.rustfmt = mkTcDefault cfg'.toolchain;
|
||||
})
|
||||
|
||||
{
|
||||
_module.args.craneLib = cfg.lib.${system}.overrideScope (_self: _super: {
|
||||
cargo = cfg'.cargo;
|
||||
clippy = cfg'.clippy;
|
||||
rustc = cfg'.rustc;
|
||||
rustfmt = cfg'.rustfmt;
|
||||
});
|
||||
}
|
||||
];
|
||||
|
||||
};
|
||||
}
|
||||
2
examples/.gitignore
vendored
Normal file
2
examples/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
flake.lock
|
||||
target/
|
||||
7
examples/crane/Cargo.lock
generated
Normal file
7
examples/crane/Cargo.lock
generated
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "rusty-hello"
|
||||
version = "0.1.0"
|
||||
8
examples/crane/Cargo.toml
Normal file
8
examples/crane/Cargo.toml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "rusty-hello"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
43
examples/crane/flake.nix
Normal file
43
examples/crane/flake.nix
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
description = "An example of a shell environment with a Crane-built package";
|
||||
|
||||
inputs = {
|
||||
rust.url = "git+https://forgejo.alt0r.com/braunse/rust-part";
|
||||
nixpkgs.follows = "rust/nixpkgs";
|
||||
parts.follows = "rust/parts";
|
||||
rustManifest.follows = "rust/rustManifest";
|
||||
};
|
||||
|
||||
outputs = inputs: inputs.parts.lib.mkFlake { inherit inputs; } {
|
||||
imports = [ inputs.rust.flakeModules.crane ];
|
||||
|
||||
systems = [ "x86_64-linux" ];
|
||||
|
||||
perSystem =
|
||||
{ pkgs, craneLib, self', ... }: {
|
||||
packages.rusty-hello = craneLib.buildPackage {
|
||||
src = craneLib.cleanCargoSource (craneLib.path ./.);
|
||||
strictDeps = true;
|
||||
};
|
||||
|
||||
checks = {
|
||||
craneCompilesRustPackage = pkgs.stdenv.mkDerivation {
|
||||
name = "check-crane-compiles-rust-package";
|
||||
dontUnpack = true;
|
||||
buildPhase = ''
|
||||
set -euo pipefail
|
||||
|
||||
# Check that the compilation of our trivial package yielded something we can actually execute.
|
||||
OUTPUT="$(${self'.packages.rusty-hello}/bin/rusty-hello)"
|
||||
if [[ "$OUTPUT" != "Rusty-Hello" ]]; then
|
||||
echo "Received output '$OUTPUT', expected 'Rusty-Hello'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
touch $out
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
3
examples/crane/src/main.rs
Normal file
3
examples/crane/src/main.rs
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
fn main() {
|
||||
println!("Rusty-Hello");
|
||||
}
|
||||
8
examples/fenix/Cargo.toml
Normal file
8
examples/fenix/Cargo.toml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "fenix"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
51
examples/fenix/flake.nix
Normal file
51
examples/fenix/flake.nix
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
{
|
||||
description = "An example of a shell environment with a Fenix toolchain";
|
||||
|
||||
inputs = {
|
||||
rust.url = "git+https://forgejo.alt0r.com/braunse/rust-part";
|
||||
nixpkgs.follows = "rust/nixpkgs";
|
||||
parts.follows = "rust/parts";
|
||||
rustManifest.follows = "rust/rustManifest";
|
||||
};
|
||||
|
||||
outputs = inputs: inputs.parts.lib.mkFlake { inherit inputs; } {
|
||||
imports = [ inputs.rust.flakeModules.fenix ];
|
||||
|
||||
systems = [ "x86_64-linux" ];
|
||||
|
||||
rust.fenix.manifestFile = inputs.rustManifest;
|
||||
rust.fenix.components = [ "rustfmt" ];
|
||||
rust.fenix.targetComponents.wasm32-unknown-unknown = [ "rust-std" ];
|
||||
|
||||
perSystem =
|
||||
{ pkgs, fenixToolchain, ... }: {
|
||||
checks = {
|
||||
haveRustChain = pkgs.stdenv.mkDerivation {
|
||||
name = "check-rust-toolchain-is-present";
|
||||
dontUnpack = true;
|
||||
buildPhase = ''
|
||||
set -euo pipefail
|
||||
|
||||
echo "Checking for cargo" >&2
|
||||
${fenixToolchain}/bin/cargo --version >/dev/null
|
||||
|
||||
echo "Checking for rustc" >&2
|
||||
${fenixToolchain}/bin/rustc --version >/dev/null
|
||||
|
||||
echo "Checking for rustfmt" >&2
|
||||
${fenixToolchain}/bin/rustfmt --version >/dev/null
|
||||
|
||||
echo "Checking compiler compiles natively" >&2
|
||||
touch lib.rs
|
||||
${fenixToolchain}/bin/rustc --crate-type rlib --crate-name nativechecklib lib.rs
|
||||
|
||||
echo "Checking compiler compiles for wasm32-unknown-unknown" >&2
|
||||
${fenixToolchain}/bin/rustc --crate-type rlib --crate-name crosschecklib --target wasm32-unknown-unknown lib.rs
|
||||
|
||||
touch $out
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
3
examples/fenix/src/main.rs
Normal file
3
examples/fenix/src/main.rs
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
||||
67
fenix.nix
Normal file
67
fenix.nix
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
fenixFlake:
|
||||
{ config, inputs, lib, flake-parts-lib, ... }:
|
||||
with builtins;
|
||||
let
|
||||
inherit (lib) mkDefault mkOption types;
|
||||
inherit (flake-parts-lib) mkPerSystemOption;
|
||||
cfg = config.rust.fenix;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
rust.fenix = {
|
||||
manifestFile = mkOption {
|
||||
type = types.path;
|
||||
};
|
||||
|
||||
channel = mkOption {
|
||||
type = types.str;
|
||||
default = "stable";
|
||||
};
|
||||
|
||||
components = mkOption {
|
||||
type = types.listOf types.str;
|
||||
};
|
||||
|
||||
targetComponents = mkOption {
|
||||
type = types.attrsOf (types.listOf types.str);
|
||||
};
|
||||
};
|
||||
|
||||
perSystem = mkPerSystemOption {
|
||||
_file = ./fenix.nix;
|
||||
options = {
|
||||
rust.fenix.toolchain = mkOption {
|
||||
type = types.package;
|
||||
readOnly = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config.rust.fenix = {
|
||||
components = [
|
||||
"cargo"
|
||||
"rustc"
|
||||
];
|
||||
};
|
||||
|
||||
config.perSystem = { pkgs, system, inputs', ... }: {
|
||||
_module.args.fenixToolchain =
|
||||
let
|
||||
fenix = fenixFlake.packages.${system};
|
||||
|
||||
inherit (fenix) combine;
|
||||
|
||||
nativeToolchain = fenix.fromManifestFile cfg.manifestFile;
|
||||
targetToolchain = t: fenix.targets.${t}.fromManifestFile cfg.manifestFile;
|
||||
|
||||
component = tc: c: getAttr c tc;
|
||||
components = tc: cs: map (component tc) cs;
|
||||
nativeComponents = components nativeToolchain cfg.components;
|
||||
targetComponents = concatMap
|
||||
(t: components (targetToolchain t) cfg.targetComponents.${t})
|
||||
(attrNames cfg.targetComponents);
|
||||
in
|
||||
combine (nativeComponents ++ targetComponents);
|
||||
};
|
||||
}
|
||||
120
flake.lock
generated
Normal file
120
flake.lock
generated
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
{
|
||||
"nodes": {
|
||||
"crane": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1706750221,
|
||||
"narHash": "sha256-NXV6Tfoj29l2Hmif1tz6W14dN7xNLBmHH35EUmGTY80=",
|
||||
"owner": "ipetkov",
|
||||
"repo": "crane",
|
||||
"rev": "6754d3a297f03590d2fb33fa39d97762ad3d4927",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "ipetkov",
|
||||
"repo": "crane",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"fenix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"rust-analyzer-src": []
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1706854869,
|
||||
"narHash": "sha256-MUEwsK16OOG6/j0LZ0R0KhCcvJRKZHVXrBgLX7hZums=",
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"rev": "b03d2939685937a327f17df832bf9e8944ed9e3a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1706683685,
|
||||
"narHash": "sha256-FtPPshEpxH/ewBOsdKBNhlsL2MLEFv1hEnQ19f/bFsQ=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "5ad9903c16126a7d949101687af0aa589b1d7d3d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1706550542,
|
||||
"narHash": "sha256-UcsnCG6wx++23yeER4Hg18CXWbgNpqNXcHIo5/1Y+hc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "97b17f32362e475016f942bbdfda4a4a72a8a652",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1706830856,
|
||||
"narHash": "sha256-a0NYyp+h9hlb7ddVz4LUn1vT/PLwqfrWYcHMvFB1xYg=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "b253292d9c0a5ead9bc98c4e9a26c6312e27d69f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"crane": "crane",
|
||||
"fenix": "fenix",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"parts": "parts",
|
||||
"rustManifest": "rustManifest"
|
||||
}
|
||||
},
|
||||
"rustManifest": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"narHash": "sha256-uavbdMLBa9A2fTKFRUtWlwRNXCziN/r2ZmQC+sdmHW4=",
|
||||
"type": "file",
|
||||
"url": "https://static.rust-lang.org/dist/2023-02-02/channel-rust-nightly.toml"
|
||||
},
|
||||
"original": {
|
||||
"type": "file",
|
||||
"url": "https://static.rust-lang.org/dist/2023-02-02/channel-rust-nightly.toml"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
90
flake.nix
Normal file
90
flake.nix
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
{
|
||||
description = "Crane integration with flake-parts";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
|
||||
parts.url = "github:hercules-ci/flake-parts";
|
||||
|
||||
fenix.url = "github:nix-community/fenix";
|
||||
fenix.inputs.nixpkgs.follows = "nixpkgs";
|
||||
fenix.inputs.rust-analyzer-src.follows = "";
|
||||
|
||||
crane.url = "github:ipetkov/crane";
|
||||
crane.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
rustManifest = {
|
||||
url = "https://static.rust-lang.org/dist/2023-02-02/channel-rust-nightly.toml";
|
||||
flake = false;
|
||||
};
|
||||
};
|
||||
|
||||
outputs = inputs:
|
||||
with builtins;
|
||||
with inputs.nixpkgs.lib;
|
||||
inputs.parts.lib.mkFlake { inherit inputs; } {
|
||||
flake.flakeModules = {
|
||||
crane = import ./crane.nix inputs.crane;
|
||||
fenix = import ./fenix.nix inputs.fenix;
|
||||
};
|
||||
|
||||
flake.flakeModule = {
|
||||
imports = attrValues inputs.self.flakeModules;
|
||||
};
|
||||
|
||||
systems = [ "x86_64-linux" ];
|
||||
|
||||
perSystem = { pkgs, system, ... }: {
|
||||
# checks.runExampleChecks = pkgs.stdenv.mkDerivation {
|
||||
# name = "run-example-checks";
|
||||
# dontUnpack = true;
|
||||
# nestedChecks =
|
||||
# let
|
||||
# examplesDir = ./examples;
|
||||
# children = readDir examplesDir;
|
||||
# exampleDirs = filter (n: children.${n} == "directory") (attrNames children);
|
||||
# exampleChecks = concatMap
|
||||
# (d:
|
||||
# let
|
||||
# flakeDef = import "${examplesDir}/${d}/flake.nix";
|
||||
# flakeInputs = inputs // { self = outputs; rust = inputs.self; };
|
||||
# outputs = flakeDef // (flakeDef.outputs flakeInputs) // { _type = "flake"; inputs = flakeInputs; };
|
||||
# in
|
||||
# attrValues (outputs.checks.${system} or { }))
|
||||
# exampleDirs;
|
||||
# in
|
||||
# map toString exampleChecks;
|
||||
# buildPhase =
|
||||
# ''
|
||||
# echo $nestedChecks
|
||||
# touch $out
|
||||
# '';
|
||||
|
||||
# };
|
||||
|
||||
checks =
|
||||
let
|
||||
examplesDir = ./. + "/examples";
|
||||
children = readDir examplesDir;
|
||||
exampleDirs = filter (n: children.${n} == "directory") (attrNames children);
|
||||
exampleChecks = map
|
||||
(dir:
|
||||
let
|
||||
flakeDef = import "${examplesDir}/${dir}/flake.nix";
|
||||
flakeInputs = inputs // {
|
||||
self = flakeOutputs;
|
||||
rust = inputs.self;
|
||||
};
|
||||
flakeOutputs = flakeDef //
|
||||
(flakeDef.outputs flakeInputs) // {
|
||||
_type = "flake";
|
||||
inputs = flakeInputs;
|
||||
};
|
||||
in
|
||||
flakeOutputs.checks.${system} or { })
|
||||
exampleDirs;
|
||||
in
|
||||
foldl' (sofar: next: sofar // next) { } exampleChecks;
|
||||
};
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue