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
openSUSE Build Service is sponsored by