{ config, lib, pkgs, ... }: let cfg = config.programs.ghidra; package = cfg.package; isSplit = lib.elem "lib" package.outputs; libOutput = if isSplit then package.lib else package; in { disabledModules = [ "programs/ghidra.nix" ]; options.programs.ghidra = { enable = lib.mkEnableOption "Ghidra, a software reverse engineering (SRE) suite of tools"; gdb = lib.mkOption { default = true; type = lib.types.bool; description = '' Whether to add to gdbinit the python modules required to make Ghidra's debugger work. ''; }; package = lib.mkPackageOption pkgs "ghidra" { example = "ghidra_headless"; }; }; config = lib.mkIf cfg.enable { environment = { systemPackages = [ package ]; etc = lib.mkIf cfg.gdb { "gdb/gdbinit.d/ghidra-modules.gdb".text = with pkgs.python3.pkgs; '' python import sys [sys.path.append(p) for p in "${ (makePythonPath [ psutil protobuf ]) }".split(":")] sys.path.append("${libOutput}/lib/ghidra/Ghidra/Debug/Debugger-agent-gdb/pypkg/src") sys.path.append("${libOutput}/lib/ghidra/Ghidra/Debug/Debugger-rmi-trace/pypkg/src") end ''; }; }; }; }