#!/bin/bash

# Slackware build script for ddisasm

# Copyright 2025, Lockywolf
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

cd $(dirname $0) ; CWD=$(pwd)

PRGNAM=ddisasm
VERSION=${VERSION:-1.8.0.20251125}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}

COMMIT=99a152e3443cf99844343f81d96045725bb67a21

GTIRB_VERSION=7d8d02eecdeb199b91aefce7f0296b38bc9314a8
PPRINTER_VERSION=8447ac93d10d459cdfecb9b6212fe59d2e9c00f7
LIEF_VERSION=0.16.7
CAPSTONE_VERSION=cd6dd7b75d126a855be1f9f76570ee5a850c6061
LIBEHP_VERSION=5e41e26b88d415f3c7d3eb47f9f0d781cc519459


if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
# the name of the created package would be, and then exit. This information
# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
  echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
  exit 0
fi

TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

MYTMP=$TMP/ddisasm-build
rm -rf "$MYTMP"

if [ "$ARCH" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
elif [ "$ARCH" = "aarch64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

set -e

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP

mkdir -p $MYTMP
cd $MYTMP

(
rm -rf gtirb-$GTIRB_VERSION
tar xvf $CWD/gtirb-$GTIRB_VERSION.tar.gz
cd gtirb-$GTIRB_VERSION
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} + -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +

sed -i '/Werror/d' CMakeLists.txt

mkdir -p build
cd build
  cmake \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DLIB_SUFFIX=${LIBDIRSUFFIX} \
    -DMAN_INSTALL_DIR=/usr/man \
    -DCMAKE_BUILD_TYPE=Release .. \
    -DGTIRB_ENABLE_TESTS=OFF \
    -DGTIRB_ENABLE_MYPY=OFF \
    -DGTIRB_BUILD_SHARED_LIBS=OFF \
    -DENABLE_CODE_COVERAGE=OFF \
    -DGTIRB_RUN_CLANG_TIDY=OFF \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DCMAKE_C_COMPILER=clang \
    -DProtobuf_LIBRARIES='-lprotobuf' \
    -DGTIRB_JAVA_API=OFF \
    -DGTIRB_CL_API=OFF \
    -DCMAKE_EXE_LINKER_FLAGS='-labsl_status -labsl_hash -labsl_log_internal_check_op -labsl_log_internal_message'
  make || exit 1
#  make install/strip DESTDIR=$PKG
)

(
rm -rf capstone-$CAPSTONE_VERSION
tar xvf $CWD/capstone-$CAPSTONE_VERSION.tar.gz
cd capstone-$CAPSTONE_VERSION
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} + -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +

sed -i '/Werror/d' CMakeLists.txt

mkdir -p build
cd build
cmake \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DLIB_SUFFIX=${LIBDIRSUFFIX} \
    -DMAN_INSTALL_DIR=/usr/man \
    -DCMAKE_BUILD_TYPE=Release .. \
    -DCAPSTONE_BUILD_STATIC_RUNTIME=ON \
    -DCMAKE_EXE_LINKER_FLAGS='-labsl_status -labsl_hash -labsl_log_internal_check_op -labsl_log_internal_message'
  make || exit 1
)

(
rm -rf gtirb-pprinter-$PPRINTER_VERSION
tar xvf $CWD/gtirb-pprinter-$PPRINTER_VERSION.tar.gz
cd gtirb-pprinter-$PPRINTER_VERSION
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} + -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +

sed -i '/Werror/d' CMakeLists.txt
sed -i '/Export.hpp/a#include <cstdint>' include/gtirb_pprinter/Syntax.hpp

sed -i '/add_subdirectory(test)/d' src/gtirb_pprinter/CMakeLists.txt

mkdir -p build
cd build
  cmake \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DLIB_SUFFIX=${LIBDIRSUFFIX} \
    -DMAN_INSTALL_DIR=/usr/man \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_BUILD_TYPE=Release .. \
    -DGTIRB_PPRINTER_ENABLE_TESTS=OFF \
    -DGTIRB_PPRINTER_BUILD_SHARED_LIBS=OFF \
    -DENABLE_CODE_COVERAGE=OFF \
    -DProtobuf_LIBRARIES='-lprotobuf' \
    -DCMAKE_LIBRARY_PATH=$MYTMP/capstone-$CAPSTONE_VERSION/build/ \
    -DCMAKE_EXE_LINKER_FLAGS='-labsl_status -labsl_hash -labsl_log_internal_check_op -labsl_log_internal_message'
  make || exit 1
cd ..
)

(
rm -rf LIEF-$LIEF_VERSION
tar xvf $CWD/LIEF-$LIEF_VERSION.tar.gz
cd LIEF-$LIEF_VERSION
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} + -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +

source /etc/profile.d/cmake-opt.sh

sed -i '/Werror/d' CMakeLists.txt

mkdir -p build
cd build
  cmake \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_INSTALL_PREFIX="$(readlink -f ..)"/install \
    -DLIB_SUFFIX=${LIBDIRSUFFIX} \
    -DMAN_INSTALL_DIR=/usr/man \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DCMAKE_C_COMPILER=clang \
    -DLIEF_EXAMPLES=OFF \
    -DLIEF_TESTS=OFF \
    -DLIEF_PYTHON_API=OFF \
    -DCMAKE_BUILD_TYPE=Release .. \
    -DBUILD_SHARED_LIBS=OFF \
    -DENABLE_CODE_COVERAGE=OFF \
    -DProtobuf_LIBRARIES='-lprotobuf'
  cmake --build . || exit 1
  cmake --install . || exit 1
cd ..
)

(
rm -rf libehp-$LIBEHP_VERSION
tar xvf $CWD/libehp-$LIBEHP_VERSION.tar.gz
cd libehp-$LIBEHP_VERSION
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} + -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +

sed -i '/stdlib\.h/a#include <cstdint>' src/ehp.cpp

mkdir -p build
cd build
cmake \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DLIB_SUFFIX=${LIBDIRSUFFIX} \
    -DMAN_INSTALL_DIR=/usr/man \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_BUILD_TYPE=Release .. \
    -DEHP_BUILD_SHARED_LIBS=OFF \
    -DBUILD_SHARED_LIBS=OFF
  cmake --build . --parallel 1 --verbose || exit 1
)

rm -rf $PRGNAM-$COMMIT
tar xvf $CWD/$PRGNAM-$COMMIT.tar.gz
cd $PRGNAM-$COMMIT
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} + -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +

sed -i '/set(CSTOOL_VERSION/amessage(STATUS "lwf:CSTOOL_VERSION=${CSTOOL_VERSION}")' CMakeLists.txt
sed -i '/#include <fstream>/a#include <cstdint>' src/gtirb-builder/ArchiveReader.h

mkdir -p build
cd build
  cmake \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DLIB_SUFFIX=${LIBDIRSUFFIX} \
    -DMAN_INSTALL_DIR=/usr/man \
    -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \
    -DCMAKE_C_COMPILER=/usr/bin/clang \
    -DCMAKE_LIBRARY_PATH="$MYTMP/capstone-$CAPSTONE_VERSION/build;$TMP/LIEF-$LIEF_VERSION/build" \
    -DCMAKE_PROGRAM_PATH="$MYTMP"/capstone-$CAPSTONE_VERSION/build \
    -DCMAKE_MODULE_PATH=$MYTMP/LIEF-$LIEF_VERSION/install/share/LIEF/cmake/ \
    -DLIEF_DIR=$MYTMP/LIEF-$LIEF_VERSION/build/ \
    -DLIEF_LIBRARY=$MYTMP/LIEF-$LIEF_VERSION/install/lib/libLIEF.a \
    -DLIEF_INCLUDE_DIR=$MYTMP/LIEF-$LIEF_VERSION/install/include \
    -DDDISASM_BUILD_SHARED_LIBS=OFF \
    -DBUILD_SHARED_LIBS=OFF \
    -DDDISASM_ENABLE_TESTS=OFF \
    -DCMAKE_BUILD_TYPE=Release .. \
    -DCMAKE_EXE_LINKER_FLAGS="-labsl_status -labsl_hash -labsl_log_internal_check_op -labsl_log_internal_message"
  cmake --build . --verbose --parallel 16
  make install/strip DESTDIR=$PKG
cd ..
rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la

find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true

mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
CHANGELOG.md           CODE_OF_CONDUCT.md  GrammaTech-CLA-ddisasm.pdf  \
CONTRIBUTING.md     LICENSE.txt README.md  \
  $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

mv $PKG/usr/share/doc/ddisasm/copyright $PKG/usr/doc/$PRGNAM-$VERSION/
rm -rf $PKG/usr/share

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
