#!/bin/bash -e # Installing package by pkg in termux is unwise because pkg will upgrade # package to the latest version which is undesired sometimes. We will # use apt as default package tool. If your env is already broken,e.g. # clang does not work, you can execute following commands to fix it: # pkg update # pkg upgrade SRC_DIR=$(readlink -f "`dirname $0`/../../../") cd ${SRC_DIR} source scripts/whl/android/utils.sh function install_apt_package() { APT_PACKAGE="proot git wget clang cmake libandroid-spawn binutils build-essential ninja texinfo patchelf python" echo "try install: ${APT_PACKAGE}" apt install ${APT_PACKAGE} echo "check termux status by running: clang --version" log=`clang --version || true` if [[ "${log}" =~ "clang version" ]]; then echo "valid env after installing apt package" else echo "Failed to run clang command, please check termux env!!! You can run: pkg update && pkg upgrade to try to solve it" echo "raw log: ${log}" exit -1 fi } function patch_termux_env() { # do not try to modify other project build files to adapt to only-llvm environment echo "many projects can not build without gcc libs, so we create a fake gcc libs linked to librt" RT_LIB_TARGET="${PREFIX}/lib/librt.so" if [ -e ${RT_LIB_TARGET} ];then echo "find librt.so and link it to libgcc.so" GCC_LIB_TARGET="${PREFIX}/lib/libgcc.so" if [ -e ${GCC_LIB_TARGET} ];then echo "already find: ${GCC_LIB_TARGET} skip it" else create_libgcc_cmd="ln -s ${RT_LIB_TARGET} ${GCC_LIB_TARGET}" echo "run cmd: $create_libgcc_cmd" ${create_libgcc_cmd} fi else echo "broken termux env, can not find librt.so" exit -1 fi } function build_python() { # Up to now many tools (build multi python3) are not supported in termux so that we have to build them from source. # This function will be changed when some tools are supported in termux, e.g. pyenv. mge_python_env_root="${HOME}/mge_python_env" mkdir -p ${mge_python_env_root} cd ${mge_python_env_root} if [ -e ${PREFIX}/local/lib/libffi.a ];then echo "always find libffi, skip build it" else echo "build libffi for python module" rm -rf libffi git clone https://github.com/libffi/libffi.git cd libffi termux-chroot "./autogen.sh && ./configure && make -j$(nproc) && make install" # remove dynamic lib to force python to use static lib rm ${PREFIX}/local/lib/libffi.so* fi if [ -e ${PREFIX}/local/lib/libz.a ];then echo "always find libzlib, skip build it" else echo "build zlib for python module" rm -rf zlib git clone https://github.com/madler/zlib.git cd zlib termux-chroot "CFLAGS=\"-O3 -fPIC\" ./configure && make -j$(nproc) && make install" # remove dynamic lib to force python to use static lib rm ${PREFIX}/local/lib/libz.so* fi cpython_repo_dir=${mge_python_env_root}/cpython if [ -d ${cpython_repo_dir}/.git ];then echo "already find cpython repo" cd ${cpython_repo_dir} git reset --hard git clean -xdf git fetch else cd ${mge_python_env_root} rm -rf ${cpython_repo_dir} git clone https://github.com/python/cpython.git fi for ver in ${ALL_PYTHON} do install_dir=${mge_python_env_root}/${ver}/install if [ -e ${install_dir}/bin/python3 ];then echo "always find python3, skip build it" else mkdir -p ${install_dir} echo "try build python: ${ver} to ${install_dir}" cd ${cpython_repo_dir} git reset --hard git clean -xdf git checkout v${ver} index=`awk -v a="${ver}" -v b="." 'BEGIN{print index(a,b)}'` sub_str=${ver:${index}} index_s=`awk -v a="${sub_str}" -v b="." 'BEGIN{print index(a,b)}'` ((finally_index = ${index} + ${index_s})) finally_verson=${ver:0:${finally_index}-1} MINOR_VER=${ver:${index}:${finally_index}-${index}-1} finally_verson="python${finally_verson}" echo "finally_verson is: ${finally_verson}" # apply patchs git apply ${SRC_DIR}/scripts/whl/android/patchs/*.patch if [[ ${MINOR_VER} -gt 8 ]] then echo "apply more patchs" git apply ${SRC_DIR}/scripts/whl/android/up_3_9_patch/*.patch fi termux-chroot "FLAGS=\"-D__ANDROID_API__=24 -Wno-unused-value -Wno-empty-body -Qunused-arguments -Wno-error\" \ ./configure CFLAGS=\"${FLAGS}\" CPPFLAGS=\"${FLAGS}\" CC=clang CXX=clang++ --enable-shared --prefix=${install_dir} \ && sed -i 's/-Werror=implicit-function-declaration//g' Makefile && \ sed -i 's/\$(LN) -f \$(INSTSONAME)/cp \$(INSTSONAME)/g' Makefile && make -j$(nproc) && make install" # after building successfully, patchelf to make python work out of termux-chroot env cd ${install_dir}/bin # Some python versions won't link to python3 automatically, so we create link manually here' rm -rf python3 if [[ ${MINOR_VER} -gt 7 ]] then echo "python3 remove suffix m after 3.8" patchelf --add-rpath ${install_dir}/lib ${finally_verson} cp ${finally_verson} python3 else echo "python3 with suffix m before 3.8, add it" patchelf --add-rpath ${install_dir}/lib "${finally_verson}m" cp "${finally_verson}m" ${finally_verson} cp ${finally_verson} python3 fi echo "finally try run python3" ./python3 --version ./python3 -m pip install --upgrade pip ./python3 -m pip install numpy wheel fi done } ############install env now########### echo "run at root dir: ${SRC_DIR}" check_termux_env install_apt_package patch_termux_env build_python