{ config, lib, pkgs, ... }: let cfg = config.programs.blender; blenderVersion = lib.versions.majorMinor cfg.package.version; addons = pkgs.runCommand "blender-system-resources" { passAsFile = [ "paths" ]; paths = cfg.addons ++ [ cfg.package ]; nativeBuildInputs = with pkgs; [ outils ]; } '' mkdir -p $out for i in $(cat $pathsPath); do resourcesPath="$i/share/blender" if [ -d $i/share/blender/${blenderVersion} ]; then resourcesPath="$i/share/blender/${blenderVersion}"; fi lndir -silent $resourcesPath $out done ''; in { options.programs.blender = { enable = lib.mkEnableOption "Blender, a 3D computer graphics tool"; package = lib.mkPackageOption pkgs "blender" { example = '' pkgs.blender-with-packages { name = "sample-studio-wrapped"; packages = with pkgs.python3Packages; [ pandas ]; } ''; }; addons = lib.mkOption { type = with lib.types; listOf package; description = lib.mdDoc '' List of packages providing Blender system resources at {file}`/share/blender` or at {file}`/share/blender/$MAJORMINORVERSION`. ''; default = [ ]; defaultText = "[]"; example = lib.literalExpression '' with pkgs; [ blender-addons-machin3tools blender-addons-glslTexture ] ''; }; }; config = lib.mkIf cfg.enable { basePackages = [ cfg.package ]; # TODO: Should we replace the .desktop file for this? wrappers.blender = { arg0 = lib.getExe' cfg.package "blender"; env.BLENDER_SYSTEM_RESOURCES = lib.mkIf (builtins.length cfg.addons > 0) addons; }; }; }