#!/bin/sh

cd $(dirname $0) ; CWD=$(pwd)
PKGNAM=ROCm-OpenCL-Runtime
#VERSION=${VERSION:-$(echo $PKGNAM-*.tar.?z* | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
VERSION=5.1.1
BUILD=${BUILD:-1}

# Automatically determine the architecture we're building on:
if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) export ARCH=i586 ;;
    arm*) export ARCH=arm ;;
    # Unless $ARCH is already set, use uname -m for all other archs:
       *) export ARCH=$( uname -m ) ;;
  esac
fi

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


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

export HIPAMD_DIR="$(readlink -f hipamd)"
export HIP_DIR="$(readlink -f HIP)"
export ROCclr_DIR="$(readlink -f ROCclr)"
export OPENCL_DIR="$(readlink -f ROCm-OpenCL-Runtime)"


# Set to 1 if you'd like to install/upgrade package as they are built.
# This is recommended.
#INST=1

TMP=${TMP:-/tmp}
PKG=$TMP/package-${PKGNAM}
rm -rf $PKG
mkdir -p $TMP $PKG
#cp -a $CWD/${PKGNAM} 

cd $TMP || exit 1
rm -rf ${PKGNAM}-${VERSION}
#tar xvf $CWD/${PKGNAM}-$VERSION.tar.?z* || exit 1
cp -a $CWD/${PKGNAM} ${PKGNAM}-$VERSION
cd ${PKGNAM}-$VERSION || 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 {} \;

# Build, and install ROCt
#cd ${SOURCE_DIR}/ROCT-Thunk-Interface/


#rocm-opencl-runtime-2.8.0-change-AMDCompilerh.patch

#zcat $CWD/devkernel.hpp.diff.gz | patch -p1 --verbose || exit 1
#zcat $CWD/rocm-opencl-runtime-2.8.0-amdocl64icd.patch.gz | patch -p1 --verbose || exit 1

mkdir -p build
cd build


#export CMAKE_PREFIX_PATH=${ROCM_INPUT_DIR}/include/hsa:${ROCM_INPUT_DIR}/lib

export CMAKE_BUILD_TYPE="Release"
export CMAKE_DEBUG_TRACE=0


#cmake .. -DCMAKE_BUILD_TYPE=${ROCM_CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${ROCM_OUTPUT_DIR}/ -DCPACK_PACKAGING_INSTALL_PREFIX=${ROCM_OUTPUT_DIR}/ -DCPACK_GENERATOR=RPM ${ROCM_CPACK_RPM_PERMISSIONS}
#make -j `nproc`
#make -j `nproc` build-dev


#  -DCMAKE_LIBRARY_PATH=${PKGNAM}-$VERSION/lib${LIBDIRSUFFIX} \
#  -DCMAKE_INCLUDE_PATH=${PKGNAM}-$VERSION/include \

#-DCMAKE_INSTALL_PREFIX=/usr \

#/tmp/tmp.s1sYtB29H0/llvm_amd-stg-open/llvm/

cp -a $CWD/llvm-project/llvm ../compiler
cp -a $CWD/llvm-project/clang ../compiler/llvm/tools
cp -a $CWD/llvm-project/lld ../compiler/llvm/tools

#cp -a $CWD/ROCR-Runtime/src ../compiler/driver
#cp -a $CWD/HIP ../library

#mkdir ../compiler/driver
#mkdir ../library

#sed -i 's|add_subdirectory(library/amdgcn EXCLUDE_FROM_ALL)||g' ../CMakeLists.txt
#sed -i 's|add_subdirectory(compiler/driver EXCLUDE_FROM_ALL)||g' ../CMakeLists.txt
#  add_subdirectory(library/amdgcn EXCLUDE_FROM_ALL)
#  add_subdirectory(compiler/driver EXCLUDE_FROM_ALL)


#export HIPAMD_DIR="$(readlink -f hipamd)"
#export HIP_DIR="$(readlink -f HIP)"
#export ROCclr_DIR="$(readlink -f ROCclr)"
#export OPENCL_DIR="$(readlink -f ROCm-OpenCL-Runtime)"

#export ROCclr_DIR=/opt/rocm/lib/cmake/rocclr

#export LLVM_BUILD=${TMP}/llvm_temp_install
export LLVM_BUILD=/usr/lib64/cmake/llvm
#export SPECIAL_PATH="${LLVM_BUILD};/usr/lib64;/usr/hcc/lib/"

export SPECIAL_PATH="/tmp/ROCclr-5.1.1/build/;/opt/rocm/" \
#  -DCMAKE_PREFIX_PATH=${SPECIAL_PATH} \
#  -DCMAKE_LIBRARY_PATH=${PKGNAM}-$VERSION/lib${LIBDIRSUFFIX} \
#  -DCMAKE_INCLUDE_PATH=${PKGNAM}-$VERSION/include \
#  -DCMAKE_PREFIX_PATH=${PKGNAM}-$VERSION/ \
#/tmp/ROCclr-5.1.1/build/
#-DCMAKE_PREFIX_PATH="/tmp/ROCclr-5.1.1/build/;/opt/rocm/" \
#cmake -DUSE_COMGR_LIBRARY=ON -DCMAKE_PREFIX_PATH="$ROCclr_DIR/build;/opt/rocm/" ..
#-DLLVM_DIR=$TMP/llvm_temp_install/lib/cmake/llvm \
#-DClang_DIR=$TMP/llvm_temp_install/lib/cmake/clang \
#  -DAMD_OPENCL_INCLUDE_DIR="$OPENCL_DIR/include/" \
#  -DROCclr_DIR="/tmp/ROCclr-5.1.1/cmake/" \
#  -DLIBROCclr_STATIC_DIR="/tmp/ROCclr-5.1.1/build/" \
#  -DROCCLR_INCLUDE_DIR="/tmp/ROCclr-5.1.1/include/" \
# -DUSE_COMGR_LIBRARY=ON \


CXXFLAGS="$SLKCFLAGS" \
CFLAGS="$SLKCFLAGS" \
cmake \
  -DLLVM_DIR=${LLVM_BUILD} \
  -DCMAKE_INSTALL_PREFIX=/opt/rocm/ \
  -DROCM_PATH=/opt/rocm/ \
  -DCMAKE_BUILD_TYPE=Release \
  -DHIP_COMPILER=clang \
  -DHIP_COMMON_DIR=${HIP_DIR} \
  -DAMD_OPENCL_PATH=${OPENCL_DIR} \
  -DHIP_PLATFORM=rocclr \
-DROCclr_DIR=${ROCclr_DIR} \
-DROCCLR_PATH=${ROCclr_DIR} \
  -DUSE_COMGR_LIBRARY=yes \
  -DLLVM_USE_LINKER=gold \
  -DCLANG_ANALYZER_ENABLE_Z3_SOLVER=OFF \
  .. || exit 1

#-DLLVM_USE_LINKER=gold \ -DCLANG_ANALYZER_ENABLE_Z3_SOLVER=OFF \


MEM_AVAIL=`cat /proc/meminfo | grep MemTotal | awk {'print $2'}`
AVAIL_THREADS=`nproc`

# Give about 4 GB to each building thread
MAX_THREADS=`echo $(( ${MEM_AVAIL} / $(( 1024 * 1024 * 2 )) ))`
if [ ${MAX_THREADS} -lt ${AVAIL_THREADS} ]; then
    NUM_BUILD_THREADS=${MAX_THREADS}
else
    NUM_BUILD_THREADS=${AVAIL_THREADS}
fi
if [ ${NUM_BUILD_THREADS} -lt 1 ]; then
    NUM_BUILD_THREADS=1
fi

make -j ${NUM_BUILD_THREADS} || exit 1

#for whatever reason their cmake isn't building this
cd ${TMP}/${PKGNAM}-${VERSION}/build/compiler/llvm/tools/lld/tools/lld
make lld
cd ${TMP}/${PKGNAM}-$VERSION/build

#make $NUMJOBS || make || exit 1

# make install is broken on this one
make install DESTDIR=$PKG || exit 1

unset CMAKE_BUILD_TYPE
unset CMAKE_DEBUG_TRACE

unset LLVM_BUILD
unset SPECIAL_PATH


#mkdir -p $PKG/usr/opencl/bin/x86_64/
#cd $PKG/usr/opencl/bin/x86_64/
#cp -a ${PKGNAM}-$VERSION/build/bin/clinfo .
#cp -a ${PKGNAM}-$VERSION/build/compiler/llvm/bin/clang-[0-9] ./clang
#cp -a ${PKGNAM}-$VERSION/build/compiler/llvm/bin/ld.lld ./ld.lld
#cp -a ${PKGNAM}-$VERSION/build/compiler/llvm/bin/llvm-link .

#mkdir -p $PKG/opencl/lib/x86_64/
#cd $PKG/opencl/lib/x86_64/
#cp -a ${PKGNAM}-$VERSION/build/lib/libOpenCL.so.1 .
#cp -a ${PKGNAM}-$VERSION/build/lib/libamdocl64.so .



#cmake --build . --target install

#copy includes
#cp -a ../include $PKG/usr

#move /usr/libhsakmt/LICENSE.md
#mkdir -p $PKG/usr/doc
#mkdir -p $PKG/usr/doc/${PKGNAM}-${VERSION}
#mv $PKG/usr/libhsakmt $PKG/usr/doc/${PKGNAM}-${VERSION}

#cp -a /tmp/ROCm-OpenCL-Runtime-5.1.1/config/amdocl64.icd /etc/OpenCL/vendors/
#if false; then
#mv $PKG/OpenCL $PKG/etc
mkdir -p $PKG/etc/OpenCL/vendors/
cp -a $CWD/${PKGNAM}/config/*.* $PKG/etc/OpenCL/vendors/

#mkdir -p $PKG/etc/profile.d
##cp -a $CWD/rocm.sh $PKG/etc/profile.d

#echo '#!/bin/sh' | tee -a $PKG/etc/profile.d/rocm.sh
#echo 'export LD_LIBRARY_PATH=/usr/opencl/lib/x86_64:/usr/hsa/lib:$LD_LIBRARY_PATH' | tee -a $PKG/etc/profile.d/rocm.sh
#echo 'export PATH=$PATH:/opt/rocm/bin:/usr/rocprofiler/bin:/usr/opencl/bin/x86_64' | tee -a $PKG/etc/profile.d/rocm.sh
#chmod +x $PKG/etc/profile.d/rocm.sh

#mkdir -p $PKG/etc/ld.so.conf.d/

#echo '/usr/opencl/lib/x86_64' | tee -a $PKG/etc/ld.so.conf.d/x86_64-rocm-opencl.conf

##echo '/opt/rocm/opencl/lib/x86_64' | tee -a $PKG/etc/ld.so.conf.d/x86_64-rocm-opencl.conf
##ln -s $PKG/usr/opencl/lib/x86_64/libOpenCL.so.1.2 $PKG/usr/opencl/lib/x86_64/libOpenCL.so.1

mv $PKG/usr/bin/x86_64/clinfo $PKG/usr/bin/
rm -rf $PKG/usr/bin/x86_64

mv $PKG/usr/lib/x86_64/* $PKG/usr/lib64
mv $PKG/usr/lib/* $PKG/usr/lib64
rm -rf $PKG/usr/lib/x86_64
#mv $PKG/usr/lib $PKG/usr/lib64

cd $PKG/usr/lib64
ln -s libOpenCL.so.1.2 libOpenCL.so.1

#fi

# Back to source tarball root directory:
#cd $CWD

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


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

