306 lines
9.1 KiB
Bash
306 lines
9.1 KiB
Bash
#!/bin/bash
|
|
#######################################################################
|
|
# Copyright (c): 2020-2025, Huawei Tech. Co., Ltd.
|
|
# descript: Compile and pack python driver for openGauss
|
|
# Return 0 means OK.
|
|
# Return 1 means failed.
|
|
# version: 2.0
|
|
# date: 2020-08-09
|
|
#######################################################################
|
|
declare install_package_format='tar'
|
|
declare serverlib_dir='None'
|
|
|
|
#detect platform information.
|
|
PLATFORM=$(uname -p)
|
|
|
|
#get OS distributed version.
|
|
if [ -f "/etc/euleros-release" ]; then
|
|
kernel=$(cat /etc/euleros-release | awk -F ' ' '{print $1}' | tr A-Z a-z)
|
|
version=$(cat /etc/euleros-release | awk -F '(' '{print $2}'| awk -F ')' '{print $1}' | tr A-Z a-z)
|
|
elif [ -f "/etc/openEuler-release" ]; then
|
|
kernel=$(cat /etc/openEuler-release | awk -F ' ' '{print $1}' | tr A-Z a-z)
|
|
version=$(cat /etc/openEuler-release | awk -F '(' '{print $2}'| awk -F ')' '{print $1}' | tr A-Z a-z)
|
|
elif [ -f "/etc/centos-release" ]; then
|
|
kernel=$(cat /etc/centos-release | awk -F ' ' '{print $1}' | tr A-Z a-z)
|
|
version=$(cat /etc/centos-release | awk -F '(' '{print $2}'| awk -F ')' '{print $1}' | tr A-Z a-z)
|
|
elif [ -f "/etc/kylin-release" ]; then
|
|
kernel=$(cat /etc/kylin-release | awk -F ' ' '{print $1}' | tr A-Z a-z)
|
|
version=$(cat /etc/kylin-release | awk '{print $6}' | tr A-Z a-z)
|
|
else
|
|
kernel=$(lsb_release -d | awk -F ' ' '{print $2}'| tr A-Z a-z)
|
|
version=$(lsb_release -r | awk -F ' ' '{print $2}')
|
|
fi
|
|
|
|
if [ X"$kernel" == X"euleros" ]; then
|
|
dist_version="Euler"
|
|
elif [ X"$kernel" == X"centos" ]; then
|
|
dist_version="CentOS"
|
|
elif [ X"$kernel" == X"openeuler" ]; then
|
|
dist_version="openEuler"
|
|
elif [ X"$kernel" == X"kylin" ]; then
|
|
dist_version="Kylin"
|
|
elif [ X"$kernel" = X"redflag" ]; then
|
|
dist_version="Asianux"
|
|
elif [ X"$kernel" = X"asianux" ]; then
|
|
dist_version="Asianux"
|
|
else
|
|
echo "We only support EulerOS, openEuler(aarch64), CentOS and Asianux platform."
|
|
echo "Kernel is $kernel"
|
|
exit 1
|
|
fi
|
|
|
|
#######################################################################
|
|
## print help information
|
|
#######################################################################
|
|
function print_help()
|
|
{
|
|
echo "Usage: $0 [OPTION]
|
|
-h|--help show help information.
|
|
-bd|--serverlib_dir the directory of sever binarylibs.
|
|
-v|--version package version number.
|
|
"
|
|
}
|
|
|
|
##default install version storage path
|
|
declare db_name_for_package='openGauss'
|
|
declare version_number='5.0.0'
|
|
|
|
if [ $# = 0 ] ; then
|
|
echo "missing option"
|
|
print_help
|
|
exit 1
|
|
fi
|
|
|
|
LOCAL_PATH=${0}
|
|
FIRST_CHAR=$(expr substr "$LOCAL_PATH" 1 1)
|
|
if [ "$FIRST_CHAR" = "/" ]; then
|
|
LOCAL_PATH=${0}
|
|
else
|
|
LOCAL_PATH="$(pwd)/${LOCAL_PATH}"
|
|
fi
|
|
|
|
LOCAL_DIR=$(dirname "${LOCAL_PATH}")
|
|
#########################################################################
|
|
##read command line paramenters
|
|
#######################################################################
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-h|--help)
|
|
print_help
|
|
exit 1
|
|
;;
|
|
-bd|--serverlib_dir)
|
|
if [ "$2"X = X ]; then
|
|
echo "no given binarylib directory values"
|
|
exit 1
|
|
fi
|
|
serverlib_dir=$2
|
|
shift 2
|
|
;;
|
|
-v|--version)
|
|
if [ "$2" != "" ]; then
|
|
echo "Package openGauss python driver version is : $2"
|
|
version_number=$2
|
|
else
|
|
echo "No version number was specified. Use the default $version_number"
|
|
fi
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Internal Error: option processing error: $1" 1>&2
|
|
echo "please input right paramtenter, the following command may help you"
|
|
echo "./build.sh --help or ./build.sh -h"
|
|
exit 1
|
|
esac
|
|
done
|
|
|
|
#######################################################################
|
|
## declare all package name
|
|
#######################################################################
|
|
declare version_string="${db_name_for_package}-${version_number}"
|
|
declare package_pre_name="${version_string}-${dist_version}-${PLATFORM}"
|
|
declare python_package_name="${package_pre_name}-Python.${install_package_format}.gz"
|
|
|
|
declare BUILD_DIR="${LOCAL_DIR}/build"
|
|
declare MKGS_OK=0
|
|
SERVERLIBS_PATH="${serverlib_dir}"
|
|
PSYCOPG_VERSION=psycopg2-2.9
|
|
declare LOG_FILE="${LOCAL_DIR}/build_psycopg2.log"
|
|
declare ERR_MKGS_FAILED=1
|
|
echo "[makepython] $(date +%y-%m-%d' '%T): script dir : ${LOCAL_DIR}"
|
|
|
|
#######################################################################
|
|
# Print log.
|
|
#######################################################################
|
|
log()
|
|
{
|
|
echo "[Build psycopg2] $(date +%y-%m-%d' '%T): $@"
|
|
echo "[Build psycopg2] $(date +%y-%m-%d' '%T): $@" >> "$LOG_FILE" 2>&1
|
|
}
|
|
|
|
#######################################################################
|
|
# print log and exit.
|
|
#######################################################################
|
|
die()
|
|
{
|
|
log "$@"
|
|
echo "$@"
|
|
exit $ERR_MKGS_FAILED
|
|
}
|
|
|
|
# clean build python log
|
|
function clean_environment()
|
|
{
|
|
|
|
if [ -f "$LOG_FILE" ]; then
|
|
rm -rf "$LOG_FILE"
|
|
fi
|
|
|
|
if [ -d "${LOCAL_DIR}/build" ]; then
|
|
rm -rf ${LOCAL_DIR}/build
|
|
fi
|
|
|
|
echo "clean completely"
|
|
}
|
|
|
|
function check_python()
|
|
{
|
|
array=(python3 python2 python)
|
|
for py in ${array[@]}; do
|
|
${py} -c 'import setuptools' >> /dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
log "choose python: $(which ${py})"
|
|
PYTHON=${py}
|
|
version=$(${py} --version 2>&1)
|
|
PYTHON_VERSION=python${version:7:1}
|
|
return 0
|
|
fi
|
|
done
|
|
die "the python in your current enviroment is invalid, please check again and install setuptools."
|
|
}
|
|
|
|
function change_gaussdb_version()
|
|
{
|
|
if [ ! -f setup.py ]; then
|
|
die "not found psycopg2 code in current working directory."
|
|
fi
|
|
|
|
src_text='(pgmajor, pgminor, pgpatch)'
|
|
dst_text='(9, 2, 4)'
|
|
sed -i "s/${src_text}/${dst_text}/g" setup.py
|
|
search_result=$(cat setup.py | grep "$src_text")
|
|
if [ "${search_result}"X != "X" ]; then
|
|
die "failed to replace PG_VERSION_NUM at setup.py."
|
|
fi
|
|
}
|
|
|
|
###############################################################
|
|
## copy the target to set path
|
|
###############################################################
|
|
function target_file_copy()
|
|
{
|
|
cd ${LOCAL_DIR}/build/lib*
|
|
mv psycopg2/_psycopg*.so psycopg2/_psycopg.so
|
|
|
|
mkdir -p lib
|
|
#copy libraries into lib
|
|
cd ./psycopg2
|
|
libs=$(ldd _psycopg.so | awk '{print $3}' | grep $GAUSSHOME/lib)
|
|
for lib in ${libs[@]}; do
|
|
cp $lib ../lib
|
|
done
|
|
cd ..
|
|
|
|
}
|
|
|
|
#######################################################################
|
|
# build and install component
|
|
#######################################################################
|
|
function build_python()
|
|
{
|
|
cd ${LOCAL_DIR}
|
|
# set GAUSSHOME enviroment variable with BUILD_OPTION
|
|
export GAUSSHOME=$SERVERLIBS_PATH
|
|
export LD_LIBRARY_PATH=$GAUSSHOME/lib:$LD_LIBRARY_PATH
|
|
export PATH=${GAUSSHOME}/bin:${PATH}
|
|
|
|
echo "GAUSSHOME: ${GAUSSHOME}"
|
|
|
|
change_gaussdb_version
|
|
check_python
|
|
${PYTHON} ./setup.py build
|
|
if [ $? -ne 0 ]; then
|
|
die "failed to compile psycopg2."
|
|
fi
|
|
|
|
echo "End make python" >> "$LOG_FILE" 2>&1
|
|
}
|
|
|
|
declare package_command
|
|
#######################################################################
|
|
##select package command accroding to install_package_format
|
|
#######################################################################
|
|
function select_package_command()
|
|
{
|
|
case "$install_package_format" in
|
|
tar)
|
|
tar='tar'
|
|
option=' -zcvf'
|
|
package_command="$tar$option"
|
|
;;
|
|
rpm)
|
|
rpm='rpm'
|
|
option=' -i'
|
|
package_command="$rpm$option"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
#######################################################################
|
|
##function make_package have tree actions
|
|
##1.copy target file into a newly created temporary directory temp
|
|
##2.package all file in the temp directory and renome to destination package_path
|
|
#######################################################################
|
|
function make_package()
|
|
{
|
|
target_file_copy
|
|
cd ${BUILD_DIR}/lib*
|
|
select_package_command
|
|
|
|
echo "packaging python..."
|
|
$package_command "${python_package_name}" ./lib ./psycopg2 >>"$LOG_FILE" 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
die "$package_command ${python_package_name} failed"
|
|
fi
|
|
|
|
mv ${python_package_name} ${BUILD_DIR}/
|
|
|
|
echo "install python tools is ${python_package_name} of ${BUILD_DIR} directory " >> "$LOG_FILE" 2>&1
|
|
echo "success!"
|
|
}
|
|
|
|
#############################################################
|
|
# main function
|
|
#############################################################
|
|
|
|
# 1. clean environment
|
|
echo "clean enviroment"
|
|
echo "[makedb] $(date +%y-%m-%d' '%T): remove ${BUILD_DIR}" >>"$LOG_FILE" 2>&1
|
|
clean_environment
|
|
|
|
|
|
# 2. build python
|
|
build_python
|
|
|
|
# 3. make python package
|
|
make_package
|
|
|
|
# 4. cp python package to output
|
|
mkdir ${LOCAL_DIR}/output
|
|
mv ${BUILD_DIR}/*.tar.gz ${LOCAL_DIR}/output/
|
|
|
|
echo "now, python driver package has finished!"
|
|
|
|
exit 0
|
|
|