#!/bin/bash
export BUILD_MODE=${1:-RELEASE}
export BUILD_TESTS=${2:-OFF}
export BUILD_OPEN_ABI=${3:-OFF}
export BUILD_PYTHON=${4:-ON}
export ENABLE_PTRACER=${5:-ON}
export BUILD_COMPILER=${6:-gcc}
readonly SCRIPT_FULL_PATH=$(dirname $(readlink -f "$0"))
readonly PROJECT_FULL_PATH=$(dirname "$SCRIPT_FULL_PATH")
if [ "${BUILD_TESTS}" == "ON" ]; then
readonly MOCKCPP_PATH="$PROJECT_FULL_PATH/test/3rdparty/mockcpp"
readonly TEST_3RD_PATCH_PATH="$PROJECT_FULL_PATH/test/3rdparty/patch"
dos2unix "$MOCKCPP_PATH/include/mockcpp/JmpCode.h"
dos2unix "$MOCKCPP_PATH/include/mockcpp/mockcpp.h"
dos2unix "$MOCKCPP_PATH/src/JmpCode.cpp"
dos2unix "$MOCKCPP_PATH/src/JmpCodeArch.h"
dos2unix "$MOCKCPP_PATH/src/JmpCodeX64.h"
dos2unix "$MOCKCPP_PATH/src/JmpCodeX86.h"
dos2unix "$MOCKCPP_PATH/src/JmpOnlyApiHook.cpp"
dos2unix "$MOCKCPP_PATH/src/UnixCodeModifier.cpp"
dos2unix $TEST_3RD_PATCH_PATH/*.patch
fi
set -e
readonly ROOT_PATH=$(dirname $(readlink -f "$0"))
CURRENT_DIR=$(pwd)
cd ${ROOT_PATH}/..
PROJ_DIR=$(pwd)
rm -rf ./build ./output
mkdir -p "${PROJ_DIR}/output"
mkdir build/
if [ "${BUILD_PYTHON}" != "ON" ]; then
echo "========= [warning] cannot skip build python for meta HA ============"
cd ${CUQRRENT_DIR}
BUILD_PYTHON=ON
fi
VERSION="$(cat VERSION | tr -d '[:space:]')"
export MEMCACHE_VERSION="${VERSION}"
echo "VERSION IS ${VERSION}"
GIT_COMMIT=`git rev-parse HEAD` || true
{
echo "memcache_hybrid version info:"
echo "memcache_hybrid version: ${MEMCACHE_VERSION}"
echo "git: ${GIT_COMMIT}"
} > "${PROJ_DIR}/output/VERSION"
cp "${PROJ_DIR}/output/VERSION" "${PROJ_DIR}/src/memcache/python/memcache_hybrid/"
rm -f "${PROJ_DIR}/output/VERSION"
readonly BACK_PATH_EVN=$PATH
if [ -z "$PYTHON_HOME" ]; then
CHECK_DIR="/usr/local/python3.11"
if [ -d "$CHECK_DIR" ]; then
export PYTHON_HOME="$CHECK_DIR"
else
export PYTHON_HOME="/usr/local"
fi
echo "Not set PYTHON_HOME, and use $PYTHON_HOME"
fi
export PYTHON_HOME="${PYTHON_HOME%/}"
export LD_LIBRARY_PATH=$PYTHON_HOME/lib:$LD_LIBRARY_PATH
export PATH=$PYTHON_HOME/bin:$BACK_PATH_EVN
export CMAKE_PREFIX_PATH=$PYTHON_HOME
export PYTHON3_EXECUTABLE=$(which python3)
if command -v ninja &> /dev/null; then
export GENERATOR="Ninja"
export MAKE_CMD=ninja
else
export GENERATOR="Unix Makefiles"
export MAKE_CMD=make
fi
cmake \
-G "$GENERATOR" \
-DPython3_EXECUTABLE=$PYTHON3_EXECUTABLE \
-DCMAKE_BUILD_TYPE="${BUILD_MODE}" \
-DBUILD_COMPILER="${BUILD_COMPILER}" \
-DBUILD_TESTS="${BUILD_TESTS}" \
-DBUILD_OPEN_ABI="${BUILD_OPEN_ABI}" \
-DBUILD_PYTHON="${BUILD_PYTHON}" \
-DENABLE_PTRACER="${ENABLE_PTRACER}" \
-S . -B build/
${MAKE_CMD} install -j32 -C build/
FABRIC_PROJ_DIR=${PROJ_DIR}/3rdparty/memfabric_hybrid
mkdir -p "${PROJ_DIR}/src/memcache/python/memcache_hybrid/lib"
\cp -v "${PROJ_DIR}/output/memcache/lib64/libmf_memcache.so" "${PROJ_DIR}/src/memcache/python/memcache_hybrid/lib"
python_path_list=("/opt/buildtools/python-3.8.5" "/opt/buildtools/python-3.9.11" "/opt/buildtools/python-3.10.2" "/opt/buildtools/python-3.11.4")
for python_path in "${python_path_list[@]}"
do
if [ -n "${multiple_python}" ]; then
export PYTHON_HOME=${python_path}
export CMAKE_PREFIX_PATH=$PYTHON_HOME
export LD_LIBRARY_PATH=$PYTHON_HOME/lib
export PATH=$PYTHON_HOME/bin:$BACK_PATH_EVN
export PYTHON3_EXECUTABLE=$(which python3)
rm -rf build/
mkdir -p build/
cmake \
-G "$GENERATOR" \
-DPython3_EXECUTABLE=$PYTHON3_EXECUTABLE \
-DCMAKE_BUILD_TYPE="${BUILD_MODE}" \
-DBUILD_COMPILER="${BUILD_COMPILER}" \
-DBUILD_TESTS="${BUILD_TESTS}" \
-DBUILD_OPEN_ABI="${BUILD_OPEN_ABI}" \
-DBUILD_PYTHON="${BUILD_PYTHON}" \
-DENABLE_PTRACER="${ENABLE_PTRACER}" \
-S . -B build/
${MAKE_CMD} -j5 -C build
fi
cd "${PROJ_DIR}"
rm -f "${PROJ_DIR}"/src/memcache/python/memcache_hybrid/_pymmc.cpython*.so
\cp -v "${PROJ_DIR}"/build/src/memcache/csrc/python_wrapper/_pymmc.cpython*.so "${PROJ_DIR}"/src/memcache/python/memcache_hybrid
cd "${PROJ_DIR}/src/memcache/python"
rm -rf build memcache_hybrid.egg-info
export LD_LIBRARY_PATH="${PROJ_DIR}/src/memcache/python/memcache_hybrid/lib":$LD_LIBRARY_PATH
export LD_LIBRARY_PATH="${FABRIC_PROJ_DIR}/output/smem/lib64":$LD_LIBRARY_PATH
export LD_LIBRARY_PATH="${FABRIC_PROJ_DIR}/output/hybm/lib64":$LD_LIBRARY_PATH
python3 setup.py bdist_wheel
if [ -z "${multiple_python}" ];then
break
fi
done
mkdir -p "${PROJ_DIR}/output/memcache/wheel"
cp "${PROJ_DIR}"/src/memcache/python/dist/*.whl "${PROJ_DIR}/output/memcache/wheel"
rm -rf "${PROJ_DIR}"/src/memcache/python/dist
cd ${CURRENT_DIR}