File ghidra.spec of Package ghidra
#
# spec file for package ghidra
#
# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
%define java_version 21
Name: ghidra
Version: 11.3.2
Release: 0
Summary: Software Reverse Engineering Framework
License: Apache-2.0
Group: Development/Libraries/Java
Url: https://ghidra-sre.org
Source0: https://github.com/NationalSecurityAgency/%{name}/archive/refs/tags/%{name}-Ghidra_%{version}_build.tar.gz
Source1: %{name}-rpmlintrc
Source2: %{name}.desktop
# from https://github.com/kkaempf/ghidra-vax
Source3: ghidra-vax-main.zip
# from https://github.com/kkaempf/ghidra-nmos
Source4: ghidra-nmos-ii-main.zip
Source5: ghidra-alpha-main.zip
Source6: %{name}-kit.tar
Patch1: 0003-Introduce-operand_offset.patch
Patch2: 0004-Add-offset-to-sleigh-Java.patch
Patch3: 0006-exclude-generated-sleigh-files-from-IP-scan.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: bison
BuildRequires: cabextract
BuildRequires: docbook5-xsl-stylesheets
BuildRequires: fdupes
BuildRequires: flex
BuildRequires: findutils
BuildRequires: gcc-c++
BuildRequires: gradle
BuildRequires: java-devel = %{java_version}
BuildRequires: python3 >= 3.9
BuildRequires: python3-pip
BuildRequires: sed
BuildRequires: unzip
BuildRequires: update-desktop-files
BuildRequires: zip
Requires: cabextract >= 1.6
Requires: java >= %{java_version}
%description
Ghidra is a software reverse engineering (SRE) framework created and
maintained by the National Security Agency Research Directorate. This
framework includes a suite of full-featured, high-end software
analysis tools that enable users to analyze compiled code on a variety
of platforms including Windows, macOS, and Linux.
%package apidocs
Summary: Ghidra API documentation
BuildArch: noarch
%description apidocs
Ghidra API documentation in HTML or JSON format.
%package javadocs
Summary: Ghidra JAVA documentation
BuildArch: noarch
%description javadocs
Ghidra JAVA documentation in HTML format.
%package doc
Summary: Ghidra generic documentation
%description doc
Ghidra documentation in HTML.
%prep
%setup -q -n %{name}-Ghidra_%{version}_build
%patch -P1 -p1
%patch -P2 -p1
%patch -P3 -p1
tar xf %{S:6}
%build
find . -name .gitignore_disabled_by_tetra -exec rm '{}' \;
rm -rf GPL/CabExtract
export GRADLE_USER_HOME=/tmp/gradle
export GRADLE_CACHE=/tmp/gradle-cache
export BUILD_VCS_NUMBER=%{version}
export M2_HOME=`pwd`/dependencies/m2
export GRADLE_OPTS="-Xmx1024m"
export LANG=en_US.UTF-8
export JAVA_HOME=%{_libdir}/jvm/java-%{java_version}-openjdk-%{java_version}/
mkdir build
mkdir -p ~/.m2
rm -rf ~/.m2/repository
ln -sf $M2_HOME ~/.m2/repository
(cd Ghidra/Processors;
unzip %{S:3};
mv ghidra-vax-main VAX)
(cd Ghidra/Processors;
unzip %{S:4};
mv ghidra-nmos-ii-main NMOS-II)
(cd Ghidra/Processors;
unzip %{S:5};
mv ghidra-alpha-main Alpha)
# --stacktrace --info --debug \
# --no-parallel \
# --no-daemon \
gradle \
--gradle-user-home $GRADLE_USER_HOME \
--project-cache-dir $GRADLE_CACHE \
-Dfile.encoding=UTF-8 \
-Djava.home=$JAVA_HOME \
--project-prop finalRelease=true \
--offline \
buildGhidra
gradle --stop
(cd Ghidra/Features/FunctionID/src/main/doc;
sed -i 's|http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl|/usr/share/xml/docbook/stylesheet/nwalsh5/1.79.2/html/chunk.xsl|' fid_html.xsl;
xsltproc fid_html.xsl fid.xml)
%install
mkdir -p %{buildroot}%{_libdir}
unzip build/dist/ghidra*linux*.zip -d %{buildroot}%{_libdir}
mv %{buildroot}%{_libdir}/%{name}* %{buildroot}%{_libdir}/%{name}
mkdir -p %{buildroot}%{_datadir}/applications
install -m 644 %{S:2} %{buildroot}%{_datadir}/applications
mkdir -p %{buildroot}%{_docdir}/%{name}
mv %{buildroot}%{_libdir}/%{name}/docs/* %{buildroot}%{_docdir}/%{name}
# creates 'api' subdir
unzip build/tmp/GhidraAPI_javadoc.zip -d %{buildroot}%{_docdir}/%{name}
%suse_update_desktop_file -i -u %{name} Utility DesktopUtility
# please rpmlint:
%fdupes %{buildroot}%{_libdir}/%{name}
# This script uses 'env' as an interpreter.
%if 0%{?suse_version} > 1500
sed -i 's|#!/usr/bin/env bash|#!/usr/bin/bash|' %{buildroot}%{_libdir}/%{name}/ghidraRun
find %{buildroot}%{_libdir}/%{name}/server/* -exec sed -i 's|#!/usr/bin/env bash|#!/usr/bin/bash|' "{}" \;
find %{buildroot}%{_libdir}/%{name}/support/* -exec sed -i 's|#!/usr/bin/env bash|#!/usr/bin/bash|' "{}" \;
%else
sed -i 's|#!/usr/bin/env bash|#!/bin/bash|' %{buildroot}%{_libdir}/%{name}/ghidraRun
find %{buildroot}%{_libdir}/%{name}/server/* -exec sed -i 's|#!/usr/bin/env bash|#!/bin/bash|' "{}" \;
find %{buildroot}%{_libdir}/%{name}/support/* -exec sed -i 's|#!/usr/bin/env bash|#!/bin/bash|' "{}" \;
%endif
find %{buildroot}%{_libdir}/%{name} -name \*.py -exec sed -i 's|#!/usr/bin/env python|#!/usr/bin/python|' "{}" \;
# jar is packaged with world writable permissions (0100777)
chmod 644 %{buildroot}%{_libdir}/%{name}/Ghidra/Features/FileFormats/lib/*.jar
mkdir %{buildroot}%{_bindir}
ln -s %{_libdir}/%{name}/ghidraRun %{buildroot}%{_bindir}/%{name}
ln -s %{_libdir}/%{name}/support/analyzeHeadless %{buildroot}%{_bindir}
ln -s %{_libdir}/%{name}/Ghidra/Features/Decompiler/os/linux_x86_64/decompile %{buildroot}%{_bindir}
ln -s %{_libdir}/%{name}/Ghidra/Features/Decompiler/os/linux_x86_64/sleigh %{buildroot}%{_bindir}
# cspec docs
(cd Ghidra/Features/Decompiler/src/main/doc;
sed -i 's|http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl|/usr/share/xml/docbook/stylesheet/nwalsh5/1.79.2/html/chunk.xsl|' cspec_html.xsl;
xsltproc cspec_html.xsl cspec.xml;
mkdir -p %{buildroot}%{_docdir}/%{name}/cspec;
mv index.html cspec*.html %{buildroot}%{_docdir}/%{name}/cspec)
# Decompiler docs
cp -a Ghidra/Features/Decompiler/build/resources/main/help/topics/DecompilePlugin %{buildroot}%{_docdir}/%{name}
cp Ghidra/Features/Decompiler/build/resources/main/images/decompileFunction.gif %{buildroot}%{_docdir}/%{name}/DecompilePlugin/images
cp Ghidra/Framework/Project/build/resources/main/images/* %{buildroot}%{_docdir}/%{name}/DecompilePlugin/images
cp Ghidra/Features/Base/build/resources/main/images/* %{buildroot}%{_docdir}/%{name}/DecompilePlugin/images || true
cp Ghidra/Framework/Gui/build/resources/main/images/* %{buildroot}%{_docdir}/%{name}/DecompilePlugin/images
# (Windows) FunctionId docs
(cd Ghidra/Features/FunctionID/src/main/doc;
mkdir -p %{buildroot}%{_docdir}/%{name}/functionid;
cp *.html %{buildroot}%{_docdir}/%{name}/functionid)
cp DevGuide.md %{buildroot}%{_docdir}/%{name}
cp Ghidra/RuntimeScripts/Common/support/analyzeHeadlessREADME.html %{buildroot}%{_docdir}/%{name}
# executable-docs (Badness: 900)
chmod -x GhidraDocs/GhidraClass/BSim/*.*
cp -a GhidraDocs/* %{buildroot}%{_docdir}/%{name}
rm -f %{buildroot}%{_docdir}/%{name}/*.zip
cp -a build/tmp/javadoc %{buildroot}%{_docdir}/%{name}
%fdupes %{buildroot}%{_docdir}/%{name}
%files
%defattr(-,root,root)
%license LICENSE
%doc README.md
%doc NOTICE
%doc DISCLAIMER.md
%dir %{_libdir}/%{name}
%{_libdir}/%{name}
%{_bindir}/*
%{_datadir}/applications/%{name}.desktop
%files apidocs
%defattr(-,root,root)
%license LICENSE
%dir %{_docdir}/%{name}
%{_docdir}/%{name}/api
%files javadocs
%defattr(-,root,root)
%license LICENSE
%dir %{_docdir}/%{name}
%{_docdir}/%{name}/javadoc
%files doc
%defattr(-,root,root)
%license LICENSE
%dir %{_docdir}/ghidra
%exclude %{_docdir}/ghidra/DISCLAIMER.md
%exclude %{_docdir}/ghidra/NOTICE
%exclude %{_docdir}/ghidra/README.md
%exclude %{_docdir}/ghidra/api
%exclude %{_docdir}/ghidra/javadoc
%{_docdir}/ghidra/*
%changelog