nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenv,
4 unzip,
5 jdk,
6 gradle,
7 ghidra,
8}:
9
10let
11 metaCommon =
12 oldMeta:
13 oldMeta
14 // {
15 maintainers =
16 (oldMeta.maintainers or [ ])
17 ++ (with lib.maintainers; [
18 vringar
19 ivyfanchiang
20 ]);
21 platforms = oldMeta.platforms or ghidra.meta.platforms;
22 };
23
24 buildGhidraExtension = lib.extendMkDerivation {
25 constructDrv = stdenv.mkDerivation;
26 extendDrvArgs =
27 finalAttrs:
28 {
29 pname,
30 nativeBuildInputs ? [ ],
31 meta ? { },
32 ...
33 }@args:
34 {
35 nativeBuildInputs = nativeBuildInputs ++ [
36 unzip
37 jdk
38 gradle
39 ];
40
41 preBuild = ''
42 # Set project name, otherwise defaults to directory name
43 echo -e '\nrootProject.name = "${pname}"' >> settings.gradle
44 # A config directory needs to exist when ghidra's GHelpBuilder is run
45 export XDG_CONFIG_HOME="''${XDG_CONFIG_HOME:-$(mktemp -d)}"
46 ${args.preBuild or ""}
47 '';
48
49 # Needed to run gradle on darwin
50 __darwinAllowLocalNetworking = true;
51
52 gradleBuildTask = args.gradleBuildTask or "buildExtension";
53 gradleFlags = args.gradleFlags or [ ] ++ [ "-PGHIDRA_INSTALL_DIR=${ghidra}/lib/ghidra" ];
54
55 installPhase =
56 args.installPhase or ''
57 runHook preInstall
58
59 mkdir -p $out/lib/ghidra/Ghidra/Extensions
60 unzip -d $out/lib/ghidra/Ghidra/Extensions dist/*.zip
61
62 # Prevent attempted creation of plugin lock files in the Nix store.
63 for i in $out/lib/ghidra/Ghidra/Extensions/*; do
64 touch "$i/.dbDirLock"
65 done
66
67 runHook postInstall
68 '';
69
70 meta = metaCommon meta;
71 };
72 };
73
74 buildGhidraScripts = lib.extendMkDerivation {
75 constructDrv = stdenv.mkDerivation;
76 extendDrvArgs =
77 finalAttrs:
78 {
79 pname,
80 meta ? { },
81 ...
82 }@args:
83 {
84 installPhase = ''
85 runHook preInstall
86
87 GHIDRA_HOME=$out/lib/ghidra/Ghidra/Extensions/${pname}
88 mkdir -p $GHIDRA_HOME
89 cp -r . $GHIDRA_HOME/ghidra_scripts
90
91 touch $GHIDRA_HOME/Module.manifest
92 cat <<'EOF' > extension.properties
93 name=${pname}
94 description=${meta.description or ""}
95 author=
96 createdOn=
97 version=${lib.getVersion ghidra}
98
99 EOF
100
101 runHook postInstall
102 '';
103
104 meta = metaCommon meta;
105 };
106 };
107in
108{
109 inherit buildGhidraExtension buildGhidraScripts;
110}