diff --git a/overlay.nix b/overlay.nix new file mode 100644 index 0000000..47017b7 --- /dev/null +++ b/overlay.nix @@ -0,0 +1,92 @@ +final: prev: { + rustPlatform = prev.rustPlatform // { + buildDioxusWebApp = prev.lib.extendMkDerivation { + constructDrv = prev.rustPlatform.buildRustPackage; + + excludeDrvArgNames = [ + "extraServerFeatures" + "extraClientFeatures" + "extraServerBundleArgs" + "extraClientBundleArgs" + "serverBundleArgs" + "clientBundleArgs" + ]; + + extendDrvArgs = + finalAttrs: + let + buildTypeFlag = if finalAttrs.cargoBuildType == "release" then "--release" else ""; + defaultFeaturesFlag = + if (finalAttrs.buildNoDefaultFeatures or false) then "--no-default-features" else ""; + in + { + nativeBuildInputs ? [ ], + + extraServerFeatures ? [ ], + extraClientFeatures ? [ ], + + extraServerBundleArgs ? [ ], + extraClientBundleArgs ? [ ], + + serverBundleArgs ? + let + serverFeatures = (finalAttrs.buildFeatures or [ ]) ++ extraServerFeatures; + in + [ + "--server" + "--frozen" + buildTypeFlag + defaultFeaturesFlag + ] + ++ extraServerBundleArgs + ++ (if serverFeatures != [ ] then [ "--features" ] ++ serverFeatures else [ ]), + + clientBundleArgs ? + let + clientFeatures = (finalAttrs.buildFeatures or [ ]) ++ extraClientFeatures; + in + [ + "--web" + "--frozen" + buildTypeFlag + defaultFeaturesFlag + ] + ++ extraClientBundleArgs + ++ (if clientFeatures != [ ] then [ "--features" ] ++ clientFeatures else [ ]), + ... + }: + { + nativeBuildInputs = + with prev; + [ + makeWrapper + dioxus-cli + lld + + ] + ++ (if finalAttrs.cargoBuildType == "release" then [ binaryen ] else [ ]) + ++ nativeBuildInputs; + + buildPhase = '' + runHook preBuild + + dx bundle \ + --out-dir "$out" \ + @server ${builtins.concatStringsSep " " serverBundleArgs} \ + @client ${builtins.concatStringsSep " " clientBundleArgs} + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + makeWrapper "$out/server" "$out/bin/${finalAttrs.pname}" \ + --set DIOXUS_PUBLIC_PATH "$out/public" + + runHook postInstall + ''; + }; + }; + }; +}