nixpkgs-extension/pkgs/by-name/st/stable-diffusion-cpp/default.nix

120 lines
4.2 KiB
Nix

{
description = "stable-diffusion.cpp as a NixOS programs.* module (system nixpkgs)";
outputs = { self, ... }: {
nixosModules.default = { config, lib, pkgs, ... }:
let
cfg = config.programs.stable-diffusion-cpp;
builtPackage =
pkgs.stdenv.mkDerivation {
pname = "stable-diffusion-cpp";
version = "git";
src = pkgs.fetchFromGitHub {
owner = "leejet";
repo = "stable-diffusion.cpp";
rev = "master-453-4ff2c8c"; # pin to a commit for reproducibility
hash = "sha256-0Hl3M6NQK1ZfIH4eIdy/XiPZTeBCnRCtode88NipPp4=";
fetchSubmodules = true;
};
nativeBuildInputs = with pkgs; [ cmake ninja pkg-config ];
buildInputs =
(lib.optionals cfg.vulkan.enable (with pkgs; [
vulkan-headers
vulkan-loader
shaderc
]));
cmakeFlags = [
"-DCMAKE_BUILD_TYPE=Release"
"-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
"-DSD_VULKAN=${if cfg.vulkan.enable then "ON" else "OFF"}"
];
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cp -v bin/sd $out/bin/ || cp -v sd $out/bin/
runHook postInstall
'';
};
selectedPackage = if cfg.package != null then cfg.package else builtPackage;
extraEnvArgs =
lib.concatStringsSep " \\\n "
(lib.mapAttrsToList (k: v:
"--set ${lib.escapeShellArg k} ${lib.escapeShellArg v}"
) cfg.extraEnv);
wrappedPackage =
pkgs.symlinkJoin {
name = "${selectedPackage.pname or "stable-diffusion-cpp"}";
paths = [ selectedPackage ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
if [ -x "$out/bin/sd" ]; then
wrapProgram "$out/bin/sd" \
${lib.optionalString (cfg.vulkan.enable && cfg.vulkan.icdFile != null)
"--set-default VK_ICD_FILENAMES ${lib.escapeShellArg (toString cfg.vulkan.icdFile)}"} \
${lib.optionalString (cfg.vulkan.enable && cfg.vulkan.prefixOpenGLXdgDataDirs)
"--prefix XDG_DATA_DIRS : /run/opengl-driver/share"} \
${extraEnvArgs}
fi
'';
};
finalPackage = if cfg.wrap then wrappedPackage else selectedPackage;
in {
options.programs.stable-diffusion-cpp = {
enable = lib.mkEnableOption "stable-diffusion.cpp";
package = lib.mkOption {
type = lib.types.nullOr lib.types.package;
default = null;
description = "Override the package used (otherwise build from upstream source).";
};
wrap = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Wrap the sd binary to inject environment variables.";
};
extraEnv = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = { };
description = "Extra environment variables added to the sd wrapper.";
};
vulkan = {
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Build with Vulkan support (toggles -DSD_VULKAN and Vulkan deps).";
};
icdFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = /run/opengl-driver/share/vulkan/icd.d/intel_icd.x86_64.json;
description = "Optional VK_ICD_FILENAMES value to select a Vulkan ICD.";
};
prefixOpenGLXdgDataDirs = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Prefix XDG_DATA_DIRS with /run/opengl-driver/share (useful for Vulkan layers/ICDs on NixOS).";
};
};
};
config = lib.mkIf cfg.enable {
environment.systemPackages = [ finalPackage ];
};
};
};
}