#!/bin/bash

# Slackware build script for Blender

# Copyright 2015-2026 Christoph Willing, Sydney Australia
# 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=Blender
VERSION=${VERSION:-5.1.1}
BUILD=${BUILD:-1}
LIBS_BUILD=${LIBS_BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}

SRCNAM=blender
CONTINUE=${CONTINUE:-"no"}
INSTALL_PATH=${INSTALL_PATH:-/opt/$PRGNAM-$VERSION}
GCC14_VERSION=${GCC14_VERSION:-$(find /opt -type d -name gcc14\* |cut -d'-' -f2)}
GCC14_PATH=${GCC14_PATH:-"/opt/gcc14-${GCC14_VERSION}"}

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

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}

if [ "$ARCH" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
else
  SLKCFLAGS="-O2"
fi
SLKCFLAGS="$SLKCFLAGS $(pkg-config --libs numa)"

# (Blender 5.1.x requires gcc14)
#
. /etc/profile.d/gcc14.sh
/sbin/ldconfig

with_cuda=""
[ -x /etc/profile.d/cuda-12.*.sh ] && {
  . /etc/profile.d/cuda-12.*.sh
  with_cuda="-DWITH_CYCLES_DEVICE_CUDA=ON -DWITH_CYCLES_CUDA_BINARIES=ON "
}
with_rocm=""
[ -x /etc/profile.d/rocmtoolkit_6.sh ] && {
  . /etc/profile.d/rocmtoolkit_6.sh
  with_rocm="-DWITH_CYCLES_DEVICE_HIP=ON -DWITH_CYCLES_HIP_BINARIES=ON -DWITH_CYCLES_DEVICE_HIPRT=ON "
}
with_optix=""
[ -d /usr/include/optix ] && {
  with_optix="-DOPTIX_INCLUDE_DIR=/usr/include/optix -DWITH_CYCLES_DEVICE_OPTIX=ON "
}

set -e


rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
if [ "$CONTINUE" = "yes" ]; then
  echo "CONTINUE mode"
else
  echo "Unpacking source tarball ... "
  rm -rf $SRCNAM-$VERSION
  tar xf $CWD/$SRCNAM-$VERSION.tar.xz
fi
cd $SRCNAM-$VERSION
if [ "$CONTINUE" = "yes" ]; then
  echo "CONTINUE mode"
else
  if [ -r "$CWD"/"$SRCNAM"-libs-"${VERSION}"."$LIBS_BUILD".tar.lz ]; then
    echo "Unpacking  -libs tarball ... "
    (cd lib && tar xf $CWD/$SRCNAM-libs-$VERSION.$LIBS_BUILD.tar.lz)
  else
    echo ; echo "Generate the $SRCNAM-libs-$VERSION.$LIBS_BUILD.tar.lz tarball; then run build script again."
    exit 0
  fi
fi
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 {} \+

mkdir -p build
cd build
  cmake .. \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS -Wno-uninitialized" \
    -DCMAKE_BUILD_TYPE=Release \
    -DLIBDIR:PATH=$(pwd)/../lib/linux_x64 \
    -DCMAKE_EXE_LINKER_FLAGS_RELEASE=-ldrm \
    -DCMAKE_INSTALL_PREFIX=$INSTALL_PATH \
    -DWITH_INSTALL_PORTABLE:BOOL=ON \
    -DWITH_BUILDINFO:BOOL=ON \
    -DWITH_STATIC_LIBS=ON \
    $with_cuda \
    $with_rocm \
    $with_optix \

  # From https://projects.blender.org/blender (Release: Bump to 5.1.0)
  COMMIT_HASH="b70da489d7f"
  COMMIT_TIMESTAMP=$(stat -c "%Y %n" ../source/blender/blenkernel/BKE_blender_version.h |cut -d' ' -f1) 
  sed -i \
      -e "s|MY_WC_HASH \"unknown\"|MY_WC_HASH \"$COMMIT_HASH\"|" \
      -e "s|MY_WC_BRANCH \"unknown\"|MY_WC_BRANCH \"master\"|" \
      -e "s|MY_WC_COMMIT_TIMESTAMP 0|MY_WC_COMMIT_TIMESTAMP $COMMIT_TIMESTAMP|"  \
    ../build_files/cmake/buildinfo.cmake 

  make
  make install DESTDIR=$PKG
cd ..

find $PKG -print0 | xargs -0 file | grep -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs chmod a+x 2> /dev/null || true

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/share/applications
(cd $PKG/usr/share/applications && ln -s $INSTALL_PATH/blender.desktop)
mkdir -p $PKG/usr/share/icons/hicolor/scalable/apps
(cd $PKG/usr/share/icons/hicolor/scalable/apps && ln -s $INSTALL_PATH/blender.svg)

mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a $PKG/$INSTALL_PATH/license/*  $PKG/usr/doc/$PRGNAM-$VERSION/
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

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

# In case gcc14 is removed after building,
# include updated libstdc++
(  cd $PKG/$INSTALL_PATH/lib && \
   cp -p ${GCC14_PATH}/lib64/libstdc++.so.6.0.33 . && \
   ln -s libstdc++.so.6.0.33 libstdc++.so.6
)

mkdir $PKG/usr/bin
cat >$PKG/usr/bin/blender <<EOF
#!/bin/bash
export LD_LIBRARY_PATH=$INSTALL_PATH/lib
exec $INSTALL_PATH/blender
EOF
chmod a+x $PKG/usr/bin/blender


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