-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathflake.nix
155 lines (131 loc) · 5.13 KB
/
flake.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
{
description = "Build a dioxus project";
# This flake is an emalgam of the trunk template from crane as well as the source of buildTrunkPackage
inputs = {
# Pinned version of nixpkgs
# Has correct version of both wasm-bindgen-cli and dioxus-cli
nixpkgs.url = "github:NixOS/nixpkgs/85f1ba3e51676fa8cc604a3d863d729026a6b8eb";
crane = {
url = "github:ipetkov/crane";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-utils.url = "github:numtide/flake-utils";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs = {
nixpkgs.follows = "nixpkgs";
flake-utils.follows = "flake-utils";
};
};
};
outputs = { self, nixpkgs, crane, flake-utils, rust-overlay, ... }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ (import rust-overlay) ];
};
inherit (pkgs) lib;
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
# Set the build targets supported by the toolchain,
# wasm32-unknown-unknown is required for trunk
targets = [ "wasm32-unknown-unknown" ];
};
craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;
# When filtering sources, we want to allow assets other than .rs files
src = lib.cleanSourceWith {
src = ./.; # The original, unfiltered source
filter = path: type:
(lib.hasSuffix "\.html" path) ||
(lib.hasSuffix "\.css" path) ||
(lib.hasSuffix "\.js" path) ||
# Example of a folder for images, icons, etc
(lib.hasInfix "assets/" path) ||
(lib.hasInfix "public/" path) ||
# Default filter from crane (allow .rs files)
(craneLib.filterCargoSources path type)
;
};
# Common arguments can be set here to avoid repeating them later
commonArgs = {
inherit src;
strictDeps = true;
# We must force the target, otherwise cargo will attempt to use your native target
CARGO_BUILD_TARGET = "wasm32-unknown-unknown";
buildInputs = [
# Add additional build inputs here
] ++ lib.optionals pkgs.stdenv.isDarwin [
# Additional darwin specific inputs can be set here
pkgs.libiconv
];
};
# Build *just* the cargo dependencies, so we can reuse
# all of that work (e.g. via cachix) when running in CI
cargoArtifacts = craneLib.buildDepsOnly (commonArgs // {
# You cannot run cargo test on a wasm build
doCheck = false;
});
# Build the actual crate itself, reusing the dependency
# artifacts from above.
# This derivation is a directory you can put on a webserver.
inherit (pkgs) binaryen tailwindcss;
my-app = craneLib.mkCargoDerivation (commonArgs // {
inherit cargoArtifacts;
# Force dioxus to not download dependencies, but use the provided version
preConfigure = ''
HOME=$(pwd)
XDG_DATA_HOME=$HOME/.local/share
mkdir -p $HOME/.local/share/dioxus \
$HOME/Library/Application\ Support
ln -sv $HOME/.local/share/dioxus \
$HOME/Library/Application\ Support
ln -s ${binaryen} $HOME/.local/share/dioxus/binaryen
ln -s ${tailwindcss} $HOME/.local/share/dioxus/tailwindcss
'';
buildPhaseCargoCommand = ''
local profileArgs=""
if [[ "$CARGO_PROFILE" == "release" ]]; then
profileArgs="--release"
fi
version=$(dasel -f Cargo.toml 'package.version' | tr -d "'")
dasel put -f ./public/manifest.json -s '.id' -v "?v=$version"
tailwindcss -i ./input.css -o ./public/tailwind.css
dx build $profileArgs
'';
installPhaseCommand = ''
cp -r dist $out
'';
# Installing artifacts on a distributable dir does not make much sense
doInstallCargoArtifacts = false;
nativeBuildInputs = [
pkgs.dioxus-cli
pkgs.wasm-bindgen-cli
binaryen
pkgs.nodejs
tailwindcss
pkgs.dasel
];
});
in
{
checks = {
# Build the crate as part of `nix flake check` for convenience
inherit my-app;
# Run clippy (and deny all warnings) on the crate source,
# again, reusing the dependency artifacts from above.
#
# Note that this is done as a separate derivation so that
# we can block the CI if there are issues here, but not
# prevent downstream consumers from building our crate by itself.
my-app-clippy = craneLib.cargoClippy (commonArgs // {
inherit cargoArtifacts;
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
});
# Check formatting
my-app-fmt = craneLib.cargoFmt {
inherit src;
};
};
packages.default = my-app;
});
}