#!/bin/bash

# Slackware build script for libclc

# Copyright 2016  Heinz Wiesinger, Amsterdam, The Netherlands
# Copyright 2017, 2018, 2021, 2024, 2026  Patrick J. Volkerding, Sebeka, MN, USA
# 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)

PKGNAM=libclc
VERSION=${VERSION:-$(echo llvmorg-*.tar.?z | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
BUILD=${BUILD:-1}

NUMJOBS=${NUMJOBS:-" -j$(expr $(nproc) + 1) "}

# Automatically determine the architecture we're building on:
MARCH=$( uname -m )
if [ -z "$ARCH" ]; then
  case "$MARCH" in
    i?86)    export ARCH=i686 ;;
    armv7hl) export ARCH=$MARCH ;;
    arm*)    export ARCH=arm ;;
    # Unless $ARCH is already set, use uname -m for all other archs:
    *)       export ARCH=$MARCH ;;
  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 "$PKGNAM-$VERSION-$ARCH-$BUILD.txz"
  exit 0
fi

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

TMP=${TMP:-/tmp}
PKG=$TMP/package-$PKGNAM
BUILDDIR=${TMP}/libclc-build-${VERSION}

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

# Add a fake configure script so the cleanup script used here at Slackware
# knows to delete this stuff later. Other folks can just ignore this... it
# doesn't have any other purpose.
touch configure
chmod 755 configure

echo "Extracting $CWD/llvmorg-$VERSION.tar.?z..."
tar xf $CWD/llvmorg-$VERSION.tar.?z llvm-project-llvmorg-$VERSION/libclc || tar xf $CWD/llvmorg-$VERSION.tar.?z llvmorg-$VERSION/libclc || exit 1
cd llvm-project-llvmorg-$VERSION/libclc || cd llvmorg-$VERSION/libclc || exit 1

chown -R root:root .
find . \
  \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
  -exec chmod 755 {} \+ -o \
  \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
  -exec chmod 644 {} \+

for TARGET in spirv32-unknown-unknown spirv64-unknown-unknown amdgcn-amd-amdhsa nvptx64-nvidia-cuda ; do
  # Configure, build, and install:
  mkdir cmake-build
  cd cmake-build
    cmake \
      -DCMAKE_C_FLAGS="$SLKCFLAGS" \
      -DCMAKE_CXX_FLAGS="$SLKCFLAGS" \
      -DCMAKE_INSTALL_PREFIX=/usr \
      -DCMAKE_C_COMPILER=clang \
      -DCMAKE_CXX_COMPILER=clang++ \
      -DLIB_SUFFIX="$LIBDIRSUFFIX" \
      -DDOC_INSTALL_DIR="doc" \
      -DMAN_INSTALL_DIR=/usr/man \
      -DLLVM_DEFAULT_TARGET_TRIPLE=$TARGET \
      .. || exit 1
    make $NUMJOBS || make || exit 1
    make install DESTDIR=$PKG || exit 1
  cd ..
done

# Add a pkgconfig file:
if [ ! -r $PKG/usr/share/pkgconfig/libclc.pc ]; then
  mkdir -p $PKG/usr/share/pkgconfig
  cat $CWD/libclc.pc | sed "s/@@VERSION@@/$VERSION/g" > $PKG/usr/share/pkgconfig/libclc.pc
fi

# Mesa looks for these names:
( cd $PKG/usr/share/clc ; ln -sf spirv64-unknown-unknown/libclc.spv spirv64-mesa3d-.spv )
( cd $PKG/usr/share/clc ; ln -sf spirv32-unknown-unknown/libclc.spv spirv-mesa3d-.spv )

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/$PKGNAM-$VERSION
cp -a *.{txt,md,TXT,rst} $PKG/usr/doc/$PKGNAM-$VERSION
rm -f $PKG/usr/doc/$PKGNAM-$VERSION/CMakeLists.txt

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

cd $PKG
/sbin/makepkg -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz
