#!/bin/bash

set +e
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
PROJECT_ROOT=$(cd "${SCRIPT_DIR}/../.." && pwd)
_PYTHON_SITE=$($(dirname $(which python))/../bin/python -c "import gauss_splat, os; print(os.path.dirname(os.path.abspath(gauss_splat.__file__)))" 2>/dev/null)
if [ -n "$_PYTHON_SITE" ]; then
    BUILD_DIR=${_PYTHON_SITE}/packages/vendors/customize
else
    BUILD_DIR=${PROJECT_ROOT}/build/lib.linux-x86_64-cpython-39/gauss_splat/packages/vendors/customize
fi
CANN_PATH=$ASCEND_TOOLKIT_HOME

GS_PACKAGES=${BUILD_DIR}
OPAPI_INC=${GS_PACKAGES}/op_api/include
OPAPI_LIB=${GS_PACKAGES}/op_api/lib
OPTILING_LIB=${GS_PACKAGES}/op_impl/ai_core/tbe/op_tiling/lib/linux/x86_64
OPPROTO_LIB=${GS_PACKAGES}/op_proto/lib/linux/x86_64

mkdir -p ${CANN_PATH}/include/aclnnop 2>/dev/null

for f in ${OPAPI_INC}/aclnn_*.h; do
    base=$(basename $f)
    ln -sf $f ${CANN_PATH}/include/aclnnop/${base} 2>/dev/null
done

WORKDIR=${SCRIPT_DIR}/build_out
mkdir -p ${WORKDIR}

CXX=g++
CXXFLAGS="-std=c++11 -g -O0 -D_GLIBCXX_USE_CXX11_ABI=0"
INCLUDES="-I${CANN_PATH}/include -I${OPAPI_INC}"

LIB_DIRS="-L${CANN_PATH}/lib64 \
    -L${CANN_PATH}/x86_64-linux/lib64 \
    -L${CANN_PATH}/opp/built-in/op_impl/ai_core/tbe/op_tiling/lib/linux/x86_64 \
    -L${CANN_PATH}/opp/built-in/op_impl/ai_core/tbe/op_api/lib/linux/x86_64 \
    -L${OPAPI_LIB} \
    -L${OPTILING_LIB} \
    -L${OPPROTO_LIB}"

LIBS="-Wl,--start-group -lascendcl -lnnopbase -lcust_opapi -lcust_opmaster_rt2.0 \
      -loptiling -lopapi -lregister -lexe_graph -ltiling_api -lge_common_base -lgraph \
      -lmsprofiler -Wl,--end-group -ldl -lpthread -lrt -Wl,-rpath,${CANN_PATH}/lib64 \
      -Wl,-rpath,${OPAPI_LIB} -Wl,-rpath,${OPTILING_LIB}"

echo "=== Build kernel tests ==="
echo "GS_PACKAGES: ${GS_PACKAGES}"
echo "CANN_PATH: ${CANN_PATH}"
echo ""

BUILD_LOG=${WORKDIR}/build.log
> ${BUILD_LOG}

for test_src in ${SCRIPT_DIR}/test_*.cpp; do
    test_name=$(basename ${test_src} .cpp)
    echo "Building ${test_name}..."
    ${CXX} ${CXXFLAGS} ${INCLUDES} ${test_src} -o ${WORKDIR}/${test_name} ${LIB_DIRS} ${LIBS} 2>>${BUILD_LOG}
    if [ $? -ne 0 ]; then
        echo "  [${test_name}] COMPILE FAILED"
    else
        echo "  [${test_name}] COMPILE OK"
    fi
done

echo ""
echo "=== Build completed ==="
echo "Binaries in: ${WORKDIR}/"
echo "Build log: ${BUILD_LOG}"