scripts: add termux_setup_python_pip function

It replaces termux_setup_python_crossenv and can be used when
compiling python packages.  Packages should specify their python
dependencies in TERMUX_PKG_PYTHON_TARGET_DEPS,
TERMUX_PKG_PYTHON_BUILD_DEPS, and TERMUX_PKG_PYTHON_COMMON_DEPS.
This commit is contained in:
Maxython 2023-01-12 15:08:41 +03:00 committed by Ivan Max
parent 0680380273
commit d97b8c353b
8 changed files with 114 additions and 38 deletions

View File

@ -104,9 +104,9 @@ source "$TERMUX_SCRIPTDIR/scripts/build/setup/termux_setup_golang.sh"
# shellcheck source=scripts/build/setup/termux_setup_no_integrated_as.sh
source "$TERMUX_SCRIPTDIR/scripts/build/setup/termux_setup_no_integrated_as.sh"
# Utility function for python packages to setup a python crossenv.
# shellcheck source=scripts/build/setup/termux_setup_python_crossenv.sh
source "$TERMUX_SCRIPTDIR/scripts/build/setup/termux_setup_python_crossenv.sh"
# Utility function for python packages to setup a python.
# shellcheck source=scripts/build/setup/termux_setup_python_pip.sh
source "$TERMUX_SCRIPTDIR/scripts/build/setup/termux_setup_python_pip.sh"
# Utility function for rust-using packages to setup a rust toolchain.
# shellcheck source=scripts/build/setup/termux_setup_rust.sh
@ -164,6 +164,10 @@ source "$TERMUX_SCRIPTDIR/scripts/build/termux_get_repo_files.sh"
# shellcheck source=scripts/build/termux_step_get_dependencies.sh
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_get_dependencies.sh"
# Download python dependency modules for compilation.
# shellcheck source=scripts/build/termux_step_get_dependencies_python.sh
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_get_dependencies_python.sh"
# Handle config scripts that needs to be run during build. Not to be overridden by packages.
# shellcheck source=scripts/build/termux_step_override_config_scripts.sh
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_override_config_scripts.sh"
@ -571,6 +575,7 @@ for ((i=0; i<${#PACKAGE_LIST[@]}; i++)); do
termux_step_setup_toolchain
if [ "$TERMUX_CONTINUE_BUILD" == "false" ]; then
termux_step_get_dependencies_python
termux_step_patch_package
termux_step_replace_guess_scripts
cd "$TERMUX_PKG_SRCDIR"

View File

@ -1,33 +0,0 @@
termux_setup_python_crossenv() {
local _CROSSENV_VERSION=1.3.0
local _CROSSENV_TAR=crossenv-$_CROSSENV_VERSION.tar.gz
local _CROSSENV_FOLDER
if [ "${TERMUX_PACKAGES_OFFLINE-false}" = "true" ]; then
_CROSSENV_FOLDER=${TERMUX_SCRIPTDIR}/build-tools/crossenv-${_CROSSENV_VERSION}
else
_CROSSENV_FOLDER=${TERMUX_COMMON_CACHEDIR}/crossenv-${_CROSSENV_VERSION}
fi
export TERMUX_PYTHON_CROSSENV_SRCDIR=$_CROSSENV_FOLDER
if [ "$TERMUX_ON_DEVICE_BUILD" = "false" ]; then
if [ ! -d "$_CROSSENV_FOLDER" ]; then
termux_download \
https://github.com/benfogle/crossenv/archive/refs/tags/v$_CROSSENV_VERSION.tar.gz \
$TERMUX_PKG_TMPDIR/$_CROSSENV_TAR \
a217a67f9201801c087b582b28c0318e014a17ffa89d355854d646e1b1094b80
rm -Rf "$TERMUX_PKG_TMPDIR/crossenv-$_CROSSENV_VERSION"
tar xf $TERMUX_PKG_TMPDIR/$_CROSSENV_TAR -C $TERMUX_PKG_TMPDIR
mv "$TERMUX_PKG_TMPDIR/crossenv-$_CROSSENV_VERSION" \
$_CROSSENV_FOLDER
shopt -s nullglob
local f
for f in "$TERMUX_SCRIPTDIR"/scripts/build/setup/python-crossenv-*.patch; do
echo "[${FUNCNAME[0]}]: Applying $(basename "$f")"
patch --silent -p1 -d "$_CROSSENV_FOLDER" < "$f"
done
shopt -u nullglob
fi
fi
}

View File

@ -0,0 +1,56 @@
termux_setup_python_pip() {
if [ "$TERMUX_ON_DEVICE_BUILD" = "true" ]; then
if [[ "$TERMUX_APP_PACKAGE_MANAGER" = "apt" && "$(dpkg-query -W -f '${db:Status-Status}\n' python-pip 2>/dev/null)" != "installed" ]] ||
[[ "$TERMUX_APP_PACKAGE_MANAGER" = "pacman" && ! "$(pacman -Q python-pip 2>/dev/null)" ]]; then
echo "Package 'python-pip' is not installed."
echo "You can install it with"
echo
echo " pkg install python-pip"
echo
echo " pacman -S python-pip"
echo
echo "Note that package 'python-pip' is known to be problematic for building on device."
exit 1
fi
return
else
local _CROSSENV_VERSION=1.3.0
local _CROSSENV_TAR=crossenv-$_CROSSENV_VERSION.tar.gz
local _CROSSENV_FOLDER
if [ "${TERMUX_PACKAGES_OFFLINE-false}" = "true" ]; then
_CROSSENV_FOLDER=${TERMUX_SCRIPTDIR}/build-tools/crossenv-${_CROSSENV_VERSION}
else
_CROSSENV_FOLDER=${TERMUX_COMMON_CACHEDIR}/crossenv-${_CROSSENV_VERSION}
fi
export TERMUX_PYTHON_CROSSENV_SRCDIR=$_CROSSENV_FOLDER
if [ ! -d "$_CROSSENV_FOLDER" ]; then
termux_download \
https://github.com/benfogle/crossenv/archive/refs/tags/v$_CROSSENV_VERSION.tar.gz \
$TERMUX_PKG_TMPDIR/$_CROSSENV_TAR \
a217a67f9201801c087b582b28c0318e014a17ffa89d355854d646e1b1094b80
rm -Rf "$TERMUX_PKG_TMPDIR/crossenv-$_CROSSENV_VERSION"
tar xf $TERMUX_PKG_TMPDIR/$_CROSSENV_TAR -C $TERMUX_PKG_TMPDIR
mv "$TERMUX_PKG_TMPDIR/crossenv-$_CROSSENV_VERSION" \
$_CROSSENV_FOLDER
shopt -s nullglob
local f
for f in "$TERMUX_SCRIPTDIR"/scripts/build/setup/python-crossenv-*.patch; do
echo "[${FUNCNAME[0]}]: Applying $(basename "$f")"
patch --silent -p1 -d "$_CROSSENV_FOLDER" < "$f"
done
shopt -u nullglob
fi
if [ ! -d "$TERMUX_PYTHON_CROSSENV_PREFIX" ]; then
pushd "$TERMUX_PYTHON_CROSSENV_SRCDIR"
python${TERMUX_PYTHON_VERSION} -m crossenv \
"$TERMUX_PREFIX/bin/python${TERMUX_PYTHON_VERSION}" \
"${TERMUX_PYTHON_CROSSENV_PREFIX}"
popd
fi
. "${TERMUX_PYTHON_CROSSENV_PREFIX}/bin/activate"
fi
}

View File

@ -0,0 +1,35 @@
termux_step_get_dependencies_python() {
if [ "$TERMUX_PKG_SETUP_PYTHON" = "true" ]; then
# python pip setup
termux_setup_python_pip
# installing python modules
LDFLAGS+=" -lpython${TERMUX_PYTHON_VERSION}"
if [ "$TERMUX_SKIP_DEPCHECK" = "false" ]; then
local pip
local pip_pkgs="$TERMUX_PKG_PYTHON_COMMON_DEPS, "
if [ "$TERMUX_ON_DEVICE_BUILD" = "true" ]; then
pip="pip3"
pip_pkgs+="$TERMUX_PKG_PYTHON_TARGET_DEPS"
else
pip="build-pip"
pip_pkgs+="$TERMUX_PKG_PYTHON_BUILD_DEPS"
fi
for i in ${pip_pkgs//, / } ; do
local name_python_module=$(echo "$i" | sed "s/<=/ /; s/>=/ /; s/</ /; s/>/ /; s/'//g" | awk '{printf $1}')
local name_python_module_termux=$(echo "$name_python_module" | grep 'python-' || echo "python-$name_python_module")
[ ! "$TERMUX_QUIET_BUILD" = true ] && echo "Installing the dependency python module $i if necessary..."
if $pip show "$name_python_module" &>/dev/null && ([ "$TERMUX_FORCE_BUILD_DEPENDENCIES" = "false" ] || termux_check_package_in_built_packages_list "$name_python_module_termux"); then
[ ! "$TERMUX_QUIET_BUILD" = true ] && echo "Skipping the already installed dependency python module $i"
continue
fi
bash -c "$pip install "$(test "${TERMUX_FORCE_BUILD_DEPENDENCIES}" = "true" && echo "-I" || true)" $i"
[ "$TERMUX_FORCE_BUILD_DEPENDENCIES" = "true" ] && termux_add_package_to_built_packages_list "$name_python_module_termux"
done
fi
# adding and setting values to work properly with python modules
export PYTHONPATH=$TERMUX_PREFIX/lib/python${TERMUX_PYTHON_VERSION}/site-packages
export PYTHON_SITE_PKG=$TERMUX_PREFIX/lib/python${TERMUX_PYTHON_VERSION}/site-packages
fi
}

View File

@ -3,6 +3,8 @@ termux_step_make_install() {
if test -f build.ninja; then
ninja -w dupbuild=warn -j $TERMUX_MAKE_PROCESSES install
elif test -f setup.py || test -f pyproject.toml || test -f setup.cfg; then
pip install --no-deps . --prefix $TERMUX_PREFIX
elif ls ./*.cabal &>/dev/null; then
termux-ghc-setup copy
if [ "${TERMUX_PKG_IS_HASKELL_LIB}" = true ]; then

View File

@ -126,6 +126,12 @@ termux_step_setup_variables() {
TERMUX_PKG_NO_SHEBANG_FIX=false # if true, skip fixing shebang accordingly to TERMUX_PREFIX
TERMUX_PKG_IS_HASKELL_LIB=true # by default assume haskell package is lib package as most of them will always be libs.
TERMUX_PKG_ON_DEVICE_BUILD_NOT_SUPPORTED=false # if the package does not support compilation on a device, then this package should not be compiled on devices
TERMUX_PKG_SETUP_PYTHON=false # setting python to compile a package
TERMUX_PYTHON_VERSION=$(. $TERMUX_SCRIPTDIR/packages/python/build.sh; echo $_MAJOR_VERSION) # get the latest version of python
TERMUX_PKG_PYTHON_TARGET_DEPS="" # python modules to be installed via pip3
TERMUX_PKG_PYTHON_BUILD_DEPS="" # python modules to be installed via build-pip
TERMUX_PKG_PYTHON_COMMON_DEPS="" # python modules to be installed via pip3 or build-pip
TERMUX_PYTHON_CROSSENV_PREFIX=$TERMUX_TOPDIR/python-crossenv-prefix # python modules dependency location (only used in non-devices)
unset CFLAGS CPPFLAGS LDFLAGS CXXFLAGS
}

View File

@ -15,6 +15,11 @@ termux_step_start_build() {
exit 0
fi
if [ -n "$TERMUX_PKG_PYTHON_COMMON_DEPS" ] || [[ "$TERMUX_ON_DEVICE_BUILD" = "false" && -n "$TERMUX_PKG_PYTHON_BUILD_DEPS" ]] || [[ "$TERMUX_ON_DEVICE_BUILD" = "true" && -n "$TERMUX_PKG_PYTHON_TARGET_DEPS" ]]; then
# Enable python setting
TERMUX_PKG_SETUP_PYTHON=true
fi
TERMUX_PKG_FULLVERSION=$TERMUX_PKG_VERSION
if [ "$TERMUX_PKG_REVISION" != "0" ] || [ "$TERMUX_PKG_FULLVERSION" != "${TERMUX_PKG_FULLVERSION/-/}" ]; then
# "0" is the default revision, so only include it if the upstream versions contains "-" itself

View File

@ -50,8 +50,8 @@ mkdir -p "$TERMUX_PKG_TMPDIR"
(. "$TERMUX_SCRIPTDIR"/scripts/build/setup/termux_setup_protobuf.sh
termux_setup_protobuf
)
(. "$TERMUX_SCRIPTDIR"/scripts/build/setup/termux_setup_python_crossenv.sh
termux_setup_python_crossenv
(. "$TERMUX_SCRIPTDIR"/scripts/build/setup/termux_setup_python_pip.sh
termux_setup_python_pip
)
# Offline rust is not supported yet.
#(. "$TERMUX_SCRIPTDIR"/scripts/build/setup/termux_setup_rust.sh