flake.nix 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. {
  2. description = "CDK Flake";
  3. inputs = {
  4. nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
  5. rust-overlay = {
  6. url = "github:oxalica/rust-overlay";
  7. inputs = {
  8. nixpkgs.follows = "nixpkgs";
  9. };
  10. };
  11. fenix = {
  12. url = "github:nix-community/fenix";
  13. inputs.nixpkgs.follows = "nixpkgs";
  14. inputs.rust-analyzer-src.follows = "";
  15. };
  16. flake-utils.url = "github:numtide/flake-utils";
  17. crane = {
  18. url = "github:ipetkov/crane";
  19. inputs.nixpkgs.follows = "nixpkgs";
  20. };
  21. pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix";
  22. };
  23. outputs = { self, nixpkgs, rust-overlay, flake-utils, pre-commit-hooks, crane, fenix, ... }:
  24. flake-utils.lib.eachDefaultSystem (system:
  25. let
  26. overlays = [ (import rust-overlay) ];
  27. lib = pkgs.lib;
  28. stdenv = pkgs.stdenv;
  29. isDarwin = stdenv.isDarwin;
  30. libsDarwin = with pkgs; lib.optionals isDarwin [
  31. # Additional darwin specific inputs can be set here
  32. darwin.apple_sdk.frameworks.Security
  33. darwin.apple_sdk.frameworks.SystemConfiguration
  34. ];
  35. # Dependencies
  36. pkgs = import nixpkgs {
  37. inherit system overlays;
  38. };
  39. # Toolchains
  40. # latest stable
  41. stable_toolchain = pkgs.rust-bin.stable."1.83.0".default.override {
  42. targets = [ "wasm32-unknown-unknown" ]; # wasm
  43. extensions = [ "rustfmt" "clippy" "rust-analyzer" ];
  44. };
  45. # MSRV stable
  46. msrv_toolchain = pkgs.rust-bin.stable."1.63.0".default.override {
  47. targets = [ "wasm32-unknown-unknown" ]; # wasm
  48. };
  49. # DB MSRV stable
  50. db_msrv_toolchain = pkgs.rust-bin.stable."1.66.0".default.override {
  51. targets = [ "wasm32-unknown-unknown" ]; # wasm
  52. };
  53. # Nightly used for formatting
  54. nightly_toolchain = pkgs.rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override {
  55. targets = [ "wasm32-unknown-unknown" ]; # wasm
  56. extensions = [ "rustfmt" "clippy" "rust-src" "rust-analyzer" ];
  57. });
  58. # Common inputs
  59. envVars = { };
  60. buildInputs = with pkgs; [
  61. # Add additional build inputs here
  62. git
  63. pkg-config
  64. curl
  65. just
  66. protobuf
  67. nixpkgs-fmt
  68. typos
  69. lnd
  70. clightning
  71. bitcoind
  72. sqlx-cli
  73. # Needed for github ci
  74. libz
  75. ] ++ libsDarwin;
  76. # WASM deps
  77. WASMInputs = with pkgs; [
  78. ];
  79. craneLib = crane.mkLib pkgs;
  80. src = craneLib.cleanCargoSource ./.;
  81. # Common arguments can be set here to avoid repeating them later
  82. commonArgs = {
  83. inherit src;
  84. strictDeps = true;
  85. buildInputs = [
  86. # Add additional build inputs here
  87. pkgs.protobuf
  88. pkgs.pkg-config
  89. ] ++ lib.optionals pkgs.stdenv.isDarwin [
  90. # Additional darwin specific inputs can be set here
  91. pkgs.libiconv
  92. ];
  93. # Additional environment variables can be set directly
  94. # MY_CUSTOM_VAR = "some value";
  95. PROTOC = "${pkgs.protobuf}/bin/protoc";
  96. PROTOC_INCLUDE = "${pkgs.protobuf}/include";
  97. };
  98. craneLibLLvmTools = craneLib.overrideToolchain
  99. (fenix.packages.${system}.complete.withComponents [
  100. "cargo"
  101. "llvm-tools"
  102. "rustc"
  103. ]);
  104. cargoArtifacts = craneLib.buildDepsOnly commonArgs;
  105. individualCrateArgs = commonArgs // {
  106. inherit cargoArtifacts;
  107. inherit (craneLib.crateNameFromCargoToml { inherit src; }) version;
  108. # NB: we disable tests since we'll run them all via cargo-nextest
  109. doCheck = false;
  110. };
  111. fileSetForCrate = crate: lib.fileset.toSource {
  112. root = ./.;
  113. fileset = lib.fileset.unions [
  114. ./Cargo.toml
  115. ./Cargo.lock
  116. (craneLib.fileset.commonCargoSources ./crates/cdk)
  117. (craneLib.fileset.commonCargoSources ./crates/cdk-axum)
  118. (craneLib.fileset.commonCargoSources ./crates/cdk-cln)
  119. (craneLib.fileset.commonCargoSources ./crates/cdk-lnd)
  120. (craneLib.fileset.commonCargoSources ./crates/cdk-fake-wallet)
  121. (craneLib.fileset.commonCargoSources ./crates/cdk-lnbits)
  122. (craneLib.fileset.commonCargoSources ./crates/cdk-strike)
  123. (craneLib.fileset.commonCargoSources ./crates/cdk-phoenixd)
  124. (craneLib.fileset.commonCargoSources ./crates/cdk-redb)
  125. (craneLib.fileset.commonCargoSources ./crates/cdk-sqlite)
  126. ./crates/cdk-sqlite/src/mint/migrations
  127. ./crates/cdk-sqlite/src/wallet/migrations
  128. (craneLib.fileset.commonCargoSources crate)
  129. ];
  130. };
  131. cdk-mintd = craneLib.buildPackage (individualCrateArgs // {
  132. pname = "cdk-mintd";
  133. name = "cdk-mintd-${individualCrateArgs.version}";
  134. cargoExtraArgs = "-p cdk-mintd";
  135. src = fileSetForCrate ./crates/cdk-mintd;
  136. });
  137. nativeBuildInputs = with pkgs; [
  138. #Add additional build inputs here
  139. ] ++ lib.optionals isDarwin [
  140. # Additional darwin specific native inputs can be set here
  141. ];
  142. in
  143. {
  144. checks = {
  145. # Pre-commit checks
  146. pre-commit-check =
  147. let
  148. # this is a hack based on https://github.com/cachix/pre-commit-hooks.nix/issues/126
  149. # we want to use our own rust stuff from oxalica's overlay
  150. _rust = pkgs.rust-bin.stable.latest.default;
  151. rust = pkgs.buildEnv {
  152. name = _rust.name;
  153. inherit (_rust) meta;
  154. buildInputs = [ pkgs.makeWrapper ];
  155. paths = [ _rust ];
  156. pathsToLink = [ "/" "/bin" ];
  157. postBuild = ''
  158. for i in $out/bin/*; do
  159. wrapProgram "$i" --prefix PATH : "$out/bin"
  160. done
  161. '';
  162. };
  163. in
  164. pre-commit-hooks.lib.${system}.run {
  165. src = ./.;
  166. hooks = {
  167. rustfmt = {
  168. enable = true;
  169. entry = lib.mkForce "${rust}/bin/cargo-fmt fmt --all -- --config format_code_in_doc_comments=true --check --color always";
  170. };
  171. nixpkgs-fmt.enable = true;
  172. typos.enable = true;
  173. commitizen.enable = true; # conventional commits
  174. };
  175. };
  176. };
  177. packages = {
  178. inherit cdk-mintd;
  179. default = cdk-mintd;
  180. } // lib.optionalAttrs (!pkgs.stdenv.isDarwin) {
  181. my-workspace-llvm-coverage = craneLibLLvmTools.cargoLlvmCov (commonArgs // {
  182. inherit cargoArtifacts;
  183. });
  184. };
  185. apps = {
  186. cdk-mintd = flake-utils.lib.mkApp {
  187. drv = cdk-mintd;
  188. };
  189. };
  190. devShells =
  191. let
  192. # pre-commit-checks
  193. _shellHook = (self.checks.${system}.pre-commit-check.shellHook or "");
  194. # devShells
  195. msrv = pkgs.mkShell ({
  196. shellHook = "
  197. ${_shellHook}
  198. cargo update -p half --precise 2.2.1
  199. cargo update -p tokio --precise 1.38.1
  200. cargo update -p tokio-util --precise 0.7.11
  201. cargo update -p tokio-stream --precise 0.1.15
  202. cargo update -p reqwest --precise 0.12.4
  203. cargo update -p serde_with --precise 3.1.0
  204. cargo update -p regex --precise 1.9.6
  205. cargo update -p backtrace --precise 0.3.58
  206. cargo update -p async-compression --precise 0.4.3
  207. cargo update -p zstd-sys --precise 2.0.8+zstd.1.5.5
  208. cargo update -p clap_lex --precise 0.3.0
  209. cargo update -p regex --precise 1.9.6
  210. cargo update -p petgraph --precise 0.6.2
  211. cargo update -p hashbrown@0.15.2 --precise 0.15.0
  212. cargo update -p async-stream --precise 0.3.5
  213. cargo update -p home --precise 0.5.5
  214. # For wasm32-unknown-unknown target
  215. cargo update -p bumpalo --precise 3.12.0
  216. cargo update -p moka --precise 0.11.1
  217. cargo update -p triomphe --precise 0.1.11
  218. cargo update -p url --precise 2.5.2
  219. ";
  220. buildInputs = buildInputs ++ WASMInputs ++ [ msrv_toolchain ];
  221. inherit nativeBuildInputs;
  222. } // envVars);
  223. stable = pkgs.mkShell ({
  224. shellHook = ''${_shellHook}'';
  225. buildInputs = buildInputs ++ WASMInputs ++ [ stable_toolchain ];
  226. inherit nativeBuildInputs;
  227. } // envVars);
  228. db_shell = pkgs.mkShell ({
  229. shellHook = ''
  230. ${_shellHook}
  231. cargo update -p half --precise 2.2.1
  232. cargo update -p home --precise 0.5.5
  233. cargo update -p tokio --precise 1.38.1
  234. cargo update -p tokio-stream --precise 0.1.15
  235. cargo update -p tokio-util --precise 0.7.11
  236. cargo update -p serde_with --precise 3.1.0
  237. cargo update -p reqwest --precise 0.12.4
  238. cargo update -p url --precise 2.5.2
  239. cargo update -p allocator-api2 --precise 0.2.18
  240. cargo update -p async-compression --precise 0.4.3
  241. cargo update -p zstd-sys --precise 2.0.8+zstd.1.5.5
  242. cargo update -p redb --precise 2.2.0
  243. '';
  244. buildInputs = buildInputs ++ WASMInputs ++ [ db_msrv_toolchain ];
  245. inherit nativeBuildInputs;
  246. } // envVars);
  247. nightly = pkgs.mkShell ({
  248. shellHook = ''
  249. ${_shellHook}
  250. # Needed for github ci
  251. export LD_LIBRARY_PATH=${pkgs.lib.makeLibraryPath [
  252. pkgs.zlib
  253. ]}:$LD_LIBRARY_PATH
  254. export RUST_SRC_PATH=${nightly_toolchain}/lib/rustlib/src/rust/library
  255. '';
  256. buildInputs = buildInputs ++ [ nightly_toolchain ];
  257. inherit nativeBuildInputs;
  258. } // envVars);
  259. in
  260. {
  261. inherit msrv stable nightly db_shell;
  262. default = stable;
  263. };
  264. }
  265. );
  266. }