{ description = "github.com/mstone/depict"; inputs.crane.url = "github:ipetkov/crane"; inputs.crane.inputs.nixpkgs.follows = "nixpkgs"; inputs.deploy-rs.url = "github:serokell/deploy-rs"; inputs.deploy-rs.inputs.nixpkgs.follows = "nixpkgs"; inputs.deploy-rs.inputs.flake-utils.follows = "flake-utils"; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "nixpkgs/nixpkgs-unstable"; inputs.nix-filter.url = "github:numtide/nix-filter"; inputs.rust-overlay.url = "github:oxalica/rust-overlay"; inputs.rust-overlay.inputs.flake-utils.follows = "flake-utils"; inputs.rust-overlay.inputs.nixpkgs.follows = "nixpkgs"; inputs.nixbom.url = "github:mstone/nixbom"; inputs.nixbom.inputs.crane.follows = "crane"; inputs.nixbom.inputs.flake-utils.follows = "flake-utils"; inputs.nixbom.inputs.nixpkgs.follows = "nixpkgs"; inputs.nixbom.inputs.nix-filter.follows = "nix-filter"; inputs.nixbom.inputs.rust-overlay.follows = "rust-overlay"; inputs.cargo-include-licenses.url = "github:mstone/cargo-include-licenses"; inputs.cargo-include-licenses.inputs.crane.follows = "crane"; inputs.cargo-include-licenses.inputs.flake-utils.follows = "flake-utils"; inputs.cargo-include-licenses.inputs.nixpkgs.follows = "nixpkgs"; inputs.cargo-include-licenses.inputs.rust-overlay.follows = "rust-overlay"; outputs = {self, nixpkgs, crane, deploy-rs, nixbom, rust-overlay, flake-utils, nix-filter, cargo-include-licenses}: flake-utils.lib.simpleFlake { inherit self nixpkgs; name = "depict"; preOverlays = [ rust-overlay.overlays.default ]; overlay = final: prev: { depict = rec { depictVersion = "0.2"; depict = lib.depict { isShell = false; }; devShell = lib.depict { isShell = true; }; defaultPackage = depict; server = with final; with pkgs; let subpkg = "depict-server"; serverBin = (lib.depict { isShell = false; subpkg = subpkg; subdir = "server"; }); in stdenv.mkDerivation { pname = "${subpkg}"; version = depictVersion; buildInputs = [ makeWrapper ]; phases = [ "installPhase" ]; installPhase = '' mkdir -p $out/bin cp ${serverBin}/bin/${subpkg} $out/bin/${subpkg} wrapProgram $out/bin/${subpkg} \ --set WEBROOT ${web} ''; }; wasm = with final; with pkgs; (lib.depict { isShell = false; subpkg = "depict-web"; subdir = "web"; isWasm = true; }); web = with final; with pkgs; let subpkg = "depict-web"; webBin = (lib.depict { isShell = false; subpkg = subpkg; subdir = "web"; isWasm = true; }); indexHtml = writeText "index.html" ''
''; in stdenv.mkDerivation { pname = "${subpkg}"; version = depictVersion; phases = [ "buildPhase" "installPhase" ]; buildInputs = [ wasm-bindgen-cli ]; buildPhase = '' cp ${webBin}/bin/${subpkg}.wasm web.wasm mkdir pkg wasm-bindgen --target web --out-dir pkg web.wasm ''; installPhase = '' mkdir $out; cp -a pkg/* $out cp ${indexHtml} $out/index.html ''; }; desktop = with final; with pkgs; let subpkg = "depict-desktop"; pkg = (lib.depict { isShell = false; subpkg = subpkg; subdir = "dioxus"; }); in stdenv.mkDerivation { pname = subpkg; version = depictVersion; buildInputs = [ makeWrapper ]; phases = [ "installPhase" ]; installPhase = '' mkdir -p $out/bin cp ${pkg}/bin/${subpkg} $out/bin/${subpkg} ''; }; bintools = prev.bintools.overrideAttrs (old: { postFixup = if prev.stdenv.isDarwin then builtins.replaceStrings ["-no_uuid"] [""] old.postFixup else old.postFixup; }); cc = prev.stdenv.cc.overrideAttrs (old: { inherit bintools; }); stdenv = prev.overrideCC prev.stdenv cc; # rust from rust-overlay adds stdenv.cc to propagatedBuildInputs # and depsHostHostPropagated; therefore, to ensure that the correct # cc is present in downstream consumers, we need to override both these # attrs. rust = with final; with pkgs; #(rust-bin.stable.latest.minimal.override { targets = [ "wasm32-unknown-unknown" ]; }) #(rust-bin.nightly.latest.minimal.override { extensions = [ "rustfmt" ]; targets = [ "wasm32-unknown-unknown" ]; }) (rust-bin.selectLatestNightlyWith (toolchain: toolchain.minimal.override { extensions = [ "rustfmt" ]; targets = [ "wasm32-unknown-unknown" ]; })).overrideAttrs (old: { inherit stdenv; propagatedBuildInputs = [ stdenv.cc ]; depsHostHostPropagated = [ stdenv.cc ]; }); # crane provides a buildPackage helper that calls stdenv.mkDerivation # which provides a default builder that sources a "setup" file defined # by the stdenv itself (passed as the environment variable "stdenv" that # in turn defines a defaultNativeBuildInputs variable that gets added to # PATH via the genericBuild initialization code. Therefore, we override # crane's stdenv to use our modified cc-wrapper. Then, we override # cargo, clippy, rustc, and rustfmt, similar to the newly introduced # crane.lib.overrideToolchain helper. cranelib = crane.lib.${final.system}.overrideScope' (final: prev: { inherit stdenv; cargo = rust; clippy = rust; rustc = rust; rustfmt = rust; }); tex = with final; with pkgs; texlive.combined.scheme-full; lib.depict = { isShell, isWasm ? false, subpkg ? "depict", subdir ? "." }: let buildInputs = with final; with pkgs; [ rust tex cmake graphviz ] ++ final.lib.optionals isShell [ entr trunk wasm-bindgen-cli wabt deploy-rs.packages.${final.system}.deploy-rs (terraform_1.withPlugins (p: with p; [aws gandi vultr])) nixbom.legacyPackages.${final.system}.nixbom cargo-expand cargo-include-licenses.legacyPackages.${final.system}.defaultPackage cargo-license cargo-nextest cargo-outdated cargo-udeps rustfmt ] ++ final.lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ AppKit Security CoreServices CoreFoundation Foundation AppKit WebKit Cocoa ]) ++ final.lib.optionals stdenv.isLinux ([ pkg-config glib gdk-pixbuf gtk3 webkitgtk libayatana-appindicator-gtk3 libappindicator-gtk3 ]); in with final; with pkgs; cranelib.buildPackage { pname = "${subpkg}"; version = depictVersion; src = cranelib.cleanCargoSource ./.; cargoArtifacts = cranelib.buildDepsOnly { inherit buildInputs; src = cranelib.cleanCargoSource ./.; #src = ./.; cargoCheckCommand = if isWasm then "" else "cargo check"; cargoBuildCommand = if isWasm then "cargo build --release -p depict-web --target wasm32-unknown-unknown" else "cargo build --release"; doCheck = false; }; inherit buildInputs; cargoExtraArgs = if isWasm then "--target wasm32-unknown-unknown -p ${subpkg}" else "-p ${subpkg}"; doCheck = false; }; }; }; }; }