275 lines
8 KiB
Nix
275 lines
8 KiB
Nix
{
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
rust-overlay = {
|
|
url = "github:oxalica/rust-overlay";
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
};
|
|
crane = {
|
|
url = "github:ipetkov/crane";
|
|
};
|
|
|
|
cargo-leptos-src = {
|
|
url = "github:leptos-rs/cargo-leptos";
|
|
flake = false;
|
|
};
|
|
nix-filter.url = "github:numtide/nix-filter";
|
|
};
|
|
|
|
outputs =
|
|
{
|
|
self,
|
|
nixpkgs,
|
|
rust-overlay,
|
|
crane,
|
|
cargo-leptos-src,
|
|
nix-filter,
|
|
flake-utils,
|
|
}:
|
|
flake-utils.lib.eachDefaultSystem (
|
|
system:
|
|
let
|
|
# set up `pkgs` with rust-overlay
|
|
overlays = [ (import rust-overlay) ];
|
|
pkgs = (import nixpkgs) {
|
|
inherit system overlays;
|
|
};
|
|
|
|
# filter the source to reduce cache misses
|
|
# add a path here if you need other files, e.g. bc of `include_str!()`
|
|
src = nix-filter {
|
|
root = ./.;
|
|
include = [
|
|
(nix-filter.lib.matchExt "toml")
|
|
./Cargo.lock
|
|
./crates
|
|
];
|
|
};
|
|
|
|
# set up the rust toolchain, including the wasm target
|
|
# these are separated because rust-analyzer is useless in CI, so the
|
|
# dev toolchain is only used in the dev shell
|
|
toolchain = pkgs.rust-bin.selectLatestNightlyWith (
|
|
toolchain:
|
|
toolchain.minimal.override {
|
|
targets = [ "wasm32-unknown-unknown" ];
|
|
}
|
|
);
|
|
dev-toolchain = pkgs.rust-bin.selectLatestNightlyWith (
|
|
toolchain:
|
|
toolchain.default.override {
|
|
extensions = [
|
|
"rust-src"
|
|
"rust-analyzer"
|
|
"rustfmt-preview"
|
|
];
|
|
targets = [ "wasm32-unknown-unknown" ];
|
|
}
|
|
);
|
|
|
|
# read leptos options from `Cargo.toml`
|
|
leptos-options = builtins.elemAt (builtins.fromTOML (builtins.readFile ./Cargo.toml))
|
|
.workspace.metadata.leptos 0;
|
|
|
|
# configure crane to use our toolchain
|
|
craneLib = (crane.mkLib pkgs).overrideToolchain toolchain;
|
|
|
|
# build cargo-leptos from source
|
|
cargo-leptos = (import ./nix/cargo-leptos.nix) {
|
|
inherit pkgs craneLib;
|
|
cargo-leptos = cargo-leptos-src;
|
|
};
|
|
|
|
# crane build configuration used by multiple builds
|
|
common-args = {
|
|
inherit src;
|
|
|
|
# use the name defined in the `Cargo.toml` leptos options
|
|
pname = leptos-options.name;
|
|
version = "0.1.0";
|
|
|
|
doCheck = false;
|
|
|
|
nativeBuildInputs =
|
|
[
|
|
pkgs.binaryen # provides wasm-opt
|
|
]
|
|
++ pkgs.lib.optionals (system == "x86_64-linux") [
|
|
pkgs.nasm # wasm compiler only for x86_64-linux
|
|
]
|
|
++ pkgs.lib.optionals pkgs.stdenv.isDarwin [
|
|
# Additional darwin specific inputs can be set here
|
|
pkgs.libiconv # character encoding lib needed by darwin
|
|
];
|
|
|
|
buildInputs = [
|
|
pkgs.pkg-config # used by many crates for finding system packages
|
|
pkgs.openssl # needed for many http libraries
|
|
];
|
|
|
|
};
|
|
|
|
# build the deps for the frontend bundle, and export the target folder
|
|
site-frontend-deps = craneLib.mkCargoDerivation (
|
|
common-args
|
|
// {
|
|
pname = "site-frontend-deps";
|
|
src = craneLib.mkDummySrc common-args;
|
|
cargoArtifacts = null;
|
|
doInstallCargoArtifacts = true;
|
|
|
|
buildPhaseCargoCommand = ''
|
|
cargo build \
|
|
--package=${leptos-options.lib-package or leptos-options.output-name} \
|
|
--lib \
|
|
--target-dir=/build/source/target/front \
|
|
--target=wasm32-unknown-unknown \
|
|
--no-default-features \
|
|
--profile=${leptos-options.lib-profile-release}
|
|
'';
|
|
}
|
|
);
|
|
# build the deps for the server binary, and export the target folder
|
|
site-server-deps = craneLib.mkCargoDerivation (
|
|
common-args
|
|
// {
|
|
pname = "site-server-deps";
|
|
src = craneLib.mkDummySrc common-args;
|
|
cargoArtifacts = site-frontend-deps;
|
|
doInstallCargoArtifacts = true;
|
|
|
|
buildPhaseCargoCommand = ''
|
|
cargo build \
|
|
--package=${leptos-options.bin-package or leptos-options.name} \
|
|
--no-default-features \
|
|
--release
|
|
'';
|
|
}
|
|
);
|
|
|
|
# build the binary and bundle using cargo leptos
|
|
site-server = craneLib.buildPackage (
|
|
common-args
|
|
// {
|
|
# add inputs needed for leptos build
|
|
nativeBuildInputs = common-args.nativeBuildInputs ++ [
|
|
cargo-leptos
|
|
# used by cargo-leptos for styling
|
|
pkgs.dart-sass
|
|
pkgs.tailwindcss
|
|
];
|
|
|
|
# enable hash_files again
|
|
buildPhaseCargoCommand = ''
|
|
# export LEPTOS_HASH_FILES=true
|
|
cargo leptos build --release -vvv
|
|
'';
|
|
|
|
installPhaseCommand = ''
|
|
mkdir -p $out/bin
|
|
cp target/release/site-server $out/bin/
|
|
# cp target/release/hash.txt $out/bin/
|
|
cp -r target/site $out/bin/
|
|
'';
|
|
|
|
doCheck = false;
|
|
cargoArtifacts = site-server-deps;
|
|
}
|
|
);
|
|
|
|
in
|
|
{
|
|
checks = {
|
|
# lint packages
|
|
app-hydrate-clippy = craneLib.cargoClippy (
|
|
common-args
|
|
// {
|
|
cargoArtifacts = site-server-deps;
|
|
cargoClippyExtraArgs = "-p site-app --features hydrate -- --deny warnings";
|
|
}
|
|
);
|
|
app-ssr-clippy = craneLib.cargoClippy (
|
|
common-args
|
|
// {
|
|
cargoArtifacts = site-server-deps;
|
|
cargoClippyExtraArgs = "-p site-app --features ssr -- --deny warnings";
|
|
}
|
|
);
|
|
site-server-clippy = craneLib.cargoClippy (
|
|
common-args
|
|
// {
|
|
cargoArtifacts = site-server-deps;
|
|
cargoClippyExtraArgs = "-p site-server -- --deny warnings";
|
|
}
|
|
);
|
|
site-frontend-clippy = craneLib.cargoClippy (
|
|
common-args
|
|
// {
|
|
cargoArtifacts = site-server-deps;
|
|
cargoClippyExtraArgs = "-p site-frontend -- --deny warnings";
|
|
}
|
|
);
|
|
|
|
# make sure the docs build
|
|
site-server-doc = craneLib.cargoDoc (
|
|
common-args
|
|
// {
|
|
cargoArtifacts = site-server-deps;
|
|
}
|
|
);
|
|
|
|
# check formatting
|
|
site-server-fmt = craneLib.cargoFmt {
|
|
pname = common-args.pname;
|
|
version = common-args.version;
|
|
|
|
inherit src;
|
|
};
|
|
|
|
# # audit licenses
|
|
# site-server-deny = craneLib.cargoDeny {
|
|
# pname = common_args.pname;
|
|
# version = common_args.version;
|
|
# inherit src;
|
|
# };
|
|
|
|
# run tests
|
|
site-server-nextest = craneLib.cargoNextest (
|
|
common-args
|
|
// {
|
|
cargoArtifacts = site-server-deps;
|
|
partitions = 1;
|
|
partitionType = "count";
|
|
}
|
|
);
|
|
};
|
|
|
|
packages = {
|
|
default = site-server;
|
|
server = site-server;
|
|
};
|
|
|
|
formatter = pkgs.nixfmt-rfc-style;
|
|
|
|
devShells.default = pkgs.mkShell {
|
|
nativeBuildInputs =
|
|
(with pkgs; [
|
|
self.formatter.${system}
|
|
|
|
dev-toolchain # rust toolchain
|
|
cargo-leptos # main leptos build tool
|
|
bacon # cargo check w/ hot reload
|
|
cargo-deny # license checking
|
|
|
|
# styling
|
|
dart-sass
|
|
])
|
|
++ common-args.buildInputs
|
|
++ common-args.nativeBuildInputs
|
|
++ pkgs.lib.optionals pkgs.stdenv.isDarwin [
|
|
pkgs.darwin.Security
|
|
];
|
|
};
|
|
}
|
|
);
|
|
}
|