teleport/build/build-py-static.sh

199 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
################################################################
# Basic settings.
################################################################
VER_PYTHON="3.7.0"
VER_PYTHON_SHORT="3.7"
VER_OPENSSL="1.0.2p"
VER_SQLITE="3250000"
VER_ZLIB="1.2.11"
VER_PYTHON_LIB="${VER_PYTHON_SHORT}m"
################################################################
# DO NOT TOUCH FOLLOWING CODE
################################################################
FILE_PYTHON_STATIC_LIB="libpython${VER_PYTHON_LIB}.a"
PATH_ROOT=$(cd "$(dirname "$0")"/..; pwd)
PATH_EXT=${PATH_ROOT}/external
PATH_DOWNLOAD=${PATH_EXT}/_download_
PATH_TMP=${PATH_EXT}/linux/tmp
PATH_FIX=${PATH_EXT}/fix-external
PATH_RELEASE=${PATH_EXT}/linux/release
PY_PATH_SRC=${PATH_TMP}/Python-${VER_PYTHON}
OSSL_PATH_SRC=${PATH_TMP}/openssl-${VER_OPENSSL}
PATH_SRC_SQLITE=${PATH_TMP}/sqlite-autoconf-${VER_SQLITE}
function on_error()
{
echo -e "\033[01m\033[31m"
echo "==================[ !! ERROR !! ]=================="
echo -e $1
echo "==================================================="
echo -e "\033[0m"
exit 1
}
function setp_build_git()
{
# su -s
# yum install zlib-devel expat-devel libcurl-devel
# make prefix=/usr/local
# make prefix=/usr/local install
echo 'skip build git now.'
}
function dlfile()
{
echo -n "Downloading $1 ..."
if [ ! -f "$4/$3" ]; then
echo ""
# curl --insecure https://www.python.org/ftp/python/3.7.0/${VER_PYTHON}.tgz -o "${PATH_PYTHON}/${VER_PYTHON}.tgz"
echo wget $2$3 -O "$4/$3"
wget --no-check-certificate $2$3 -O "$4/$3"
if [ ! -f "$4/$3" ]; then
on_error "Can not download $1: $3"
fi
else
echo " already exists, skip."
fi
}
function step_download_files()
{
echo "download necessary source tarball ..."
if [ ! -d "${PATH_DOWNLOAD}" ]; then
mkdir -p "${PATH_DOWNLOAD}"
if [ ! -d "${PATH_DOWNLOAD}" ]; then
on_error "Can not create folder for download files."
fi
fi
dlfile "python source tarball" "https://www.python.org/ftp/python/${VER_PYTHON}/" "Python-${VER_PYTHON}.tgz" ${PATH_DOWNLOAD}
dlfile "openssl source tarball" "https://www.openssl.org/source/" "openssl-${VER_OPENSSL}.tar.gz" ${PATH_DOWNLOAD}
dlfile "sqlite source tarball" "http://sqlite.org/2018/" "sqlite-autoconf-${VER_SQLITE}.tar.gz" ${PATH_DOWNLOAD}
dlfile "zlib source tarball" "https://www.zlib.net/" "zlib-${VER_ZLIB}.tar.gz" ${PATH_DOWNLOAD}
}
function step_prepare_source()
{
echo "prepare source ..."
if [ ! -d "${PATH_TMP}" ]; then
mkdir -p "${PATH_TMP}"
if [ ! -d "${PATH_TMP}" ]; then
on_error "Can not create folder for tmp files."
fi
fi
if [ ! -d "${PATH_TMP}/Python-${VER_PYTHON}" ]; then
tar -zxvf "${PATH_DOWNLOAD}/Python-${VER_PYTHON}.tgz" -C "${PATH_TMP}"
fi
if [ ! -d "${PATH_TMP}/openssl-${VER_OPENSSL}" ]; then
tar -zxvf "${PATH_DOWNLOAD}/openssl-${VER_OPENSSL}.tar.gz" -C "${PATH_TMP}"
fi
if [ ! -d "${PATH_TMP}/Python-${VER_PYTHON}/Modules/_sqlite/sqlite3" ]; then
tar -zxvf "${PATH_DOWNLOAD}/sqlite-autoconf-${VER_SQLITE}.tar.gz" -C "${PATH_TMP}"
mv "${PATH_TMP}/sqlite-autoconf-${VER_SQLITE}" "${PATH_TMP}/Python-${VER_PYTHON}/Modules/_sqlite/sqlite3"
fi
if [ ! -d "${PATH_TMP}/Python-${VER_PYTHON}/Modules/zlib" ]; then
tar -zxvf "${PATH_DOWNLOAD}/zlib-${VER_ZLIB}.tar.gz" -C "${PATH_TMP}"
mv "${PATH_TMP}/zlib-${VER_ZLIB}" "${PATH_TMP}/Python-${VER_PYTHON}/Modules/zlib"
fi
if [ ! -d "${PATH_TMP}/Python-${VER_PYTHON}" ]; then
on_error "Can not prepare source code for build Python."
fi
if [ ! -d "${PATH_TMP}/openssl-${VER_OPENSSL}" ]; then
on_error "Can not prepare source code for build OpenSSL."
fi
if [ ! -d "${PATH_TMP}/Python-${VER_PYTHON}/Modules/_sqlite/sqlite3" ]; then
on_error "Can not prepare source code for build sqlite3 module for Python."
fi
cp "${PATH_FIX}/Python-${VER_PYTHON}/Modules/Setup.dist" "${PY_PATH_SRC}/Modules/Setup.dist"
cp "${PATH_FIX}/Python-${VER_PYTHON}/Modules/Setup.dist" "${PY_PATH_SRC}/Modules/Setup"
cp "${PATH_FIX}/Python-${VER_PYTHON}/Modules/_sqlite/cache.h" "${PY_PATH_SRC}/Modules/_sqlite/cache.h"
cp "${PATH_FIX}/Python-${VER_PYTHON}/Modules/_sqlite/prepare_protocol.h" "${PY_PATH_SRC}/Modules/_sqlite/prepare_protocol.h"
echo "prepare source done"
}
function step_build_openssl()
{
echo -n "build openssl static library ..."
if [ ! -f "${PATH_RELEASE}/lib/libssl.a" ] || [ ! -f "${PATH_RELEASE}/lib/libcrypto.a" ]; then
echo ""
cd "${OSSL_PATH_SRC}"
./config -fPIC --prefix=${PATH_RELEASE} --openssldir=${PATH_RELEASE}/openssl no-zlib no-shared
make
make install
cd "${PATH_ROOT}"
if [ ! -f "${PATH_RELEASE}/lib/libssl.a" ] || [ ! -f "${PATH_RELEASE}/lib/libcrypto.a" ]; then
on_error "Build openssl failed."
fi
else
echo " already exists, skip."
fi
}
function step_build_python()
{
echo -n "build python static library ..."
if [ ! -f "${PATH_RELEASE}/lib/${FILE_PYTHON_STATIC_LIB}" ]; then
echo ""
echo " ... configure zlib..."
cd "${PY_PATH_SRC}/Modules/zlib"
./configure --prefix=${PATH_RELEASE}
cd "${PY_PATH_SRC}"
echo " ... configure python..."
LDFLAGS=-lrt ./configure --prefix=${PATH_RELEASE} --disable-shared --enable-optimizations --with-openssl=${PATH_RELEASE}
echo " ... build python..."
make
echo " ... install python..."
make altinstall
cd "${PATH_ROOT}"
if [ ! -f "${PATH_RELEASE}/lib/${FILE_PYTHON_STATIC_LIB}" ]; then
on_error "Build python failed."
fi
else
echo " already exists, skip."
fi
}
function step_finalize()
{
echo "finalize ..."
if [ ! -d "${PATH_RELEASE}/lib/python${VER_PYTHON_SHORT}/site-packages" ]; then
on_error "something goes wrong."
fi
}
step_download_files
step_prepare_source
step_build_openssl
step_build_python
step_finalize