|  | 
|  | 1 | +TERMUX_PKG_HOMEPAGE=https://scipy.org/ | 
|  | 2 | +TERMUX_PKG_DESCRIPTION="Fundamental algorithms for scientific computing in Python" | 
|  | 3 | +TERMUX_PKG_LICENSE="BSD 3-Clause" | 
|  | 4 | +TERMUX_PKG_MAINTAINER="@termux-user-repository" | 
|  | 5 | +TERMUX_PKG_VERSION=1.8.0 | 
|  | 6 | +TERMUX_PKG_SRCURL=https://github.com/scipy/scipy.git | 
|  | 7 | +TERMUX_PKG_DEPENDS="libc++, openblas, python, python-numpy" | 
|  | 8 | +TERMUX_PKG_BUILD_DEPENDS="python-numpy-static" | 
|  | 9 | +TERMUX_PKG_BUILD_IN_SRC=true | 
|  | 10 | + | 
|  | 11 | +_PYTHON_VERSION=$(. $TERMUX_SCRIPTDIR/packages/python/build.sh; echo $_MAJOR_VERSION) | 
|  | 12 | +_NUMPY_VERSION=$(. $TERMUX_SCRIPTDIR/tur/python-numpy/build.sh; echo $TERMUX_PKG_VERSION) | 
|  | 13 | +_PKG_PYTHON_DEPENDS="numpy==$_NUMPY_VERSION" | 
|  | 14 | + | 
|  | 15 | +if $TERMUX_ON_DEVICE_BUILD; then | 
|  | 16 | +	termux_error_exit "Package '$TERMUX_PKG_NAME' is not available for on-device builds." | 
|  | 17 | +fi | 
|  | 18 | + | 
|  | 19 | +TERMUX_PKG_RM_AFTER_INSTALL=" | 
|  | 20 | +bin/ | 
|  | 21 | +" | 
|  | 22 | + | 
|  | 23 | +# XXX: This step will setup an old NDK toolchain (r17c) containing gcc and | 
|  | 24 | +# XXX: gfortran. If NDK toolchain with llvm contains fortran compiler, this | 
|  | 25 | +# XXX: step may be unnecessary. | 
|  | 26 | +_setup_fortran_toolchain_r17c() { | 
|  | 27 | +	mkdir -p $TERMUX_COMMON_CACHEDIR/android-gfortran/r17c | 
|  | 28 | +	local _NDK_ARCHIVE_FILE=$TERMUX_COMMON_CACHEDIR/android-gfortran/android-ndk-r17c-linux-x86_64.zip | 
|  | 29 | +	local _NDK_URL=https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip | 
|  | 30 | +	local _NDK_SHA256=3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589 | 
|  | 31 | +	local _NDK_GF_ARCH | 
|  | 32 | +	local _NDK_GF_SHA256 | 
|  | 33 | +	if [ "$TERMUX_ARCH" == "aarch64" ]; then | 
|  | 34 | +		_NDK_GF_ARCH="arm64" | 
|  | 35 | +		_NDK_GF_SHA256=dcbed5edeabb77533fcef0e76a9da9e4b1e23089f3a6be31824ff411058df7fd | 
|  | 36 | +		_NDK_GF_TOOLCHAIN_NAME="aarch64-linux-android-4.9" | 
|  | 37 | +	elif [ "$TERMUX_ARCH" == "arm" ]; then | 
|  | 38 | +		_NDK_GF_ARCH="arm" | 
|  | 39 | +		_NDK_GF_SHA256=75a15fd03e139f6326be604728cbec9d9d3d295942cc13d91766e40bcdd9a9e8 | 
|  | 40 | +		_NDK_GF_TOOLCHAIN_NAME="arm-linux-androideabi-4.9" | 
|  | 41 | +	elif [ "$TERMUX_ARCH" == "x86_64" ]; then | 
|  | 42 | +		_NDK_GF_ARCH="x86_64" | 
|  | 43 | +		_NDK_GF_SHA256=27f683840e0453bd63cee5c9d3a6e41d2b90b4e86f20a13e74f78a9699d73401 | 
|  | 44 | +		_NDK_GF_TOOLCHAIN_NAME="x86_64-4.9" | 
|  | 45 | +	elif [ "$TERMUX_ARCH" == "i686" ]; then | 
|  | 46 | +		_NDK_GF_ARCH="x86" | 
|  | 47 | +		_NDK_GF_SHA256=35f1491a9067c1a593430ebda812346ed528921730f2473c8dd9e847401167a2 | 
|  | 48 | +		_NDK_GF_TOOLCHAIN_NAME="x86-4.9" | 
|  | 49 | +	fi | 
|  | 50 | +	local _NDK_GF_FILE=$TERMUX_COMMON_CACHEDIR/android-gfortran/r17c/gcc-$_NDK_GF_ARCH-linux-x86_64.tar.bz2 | 
|  | 51 | +	local _NDK_GF_URL=https://github.com/licy183/android-gfortran/releases/download/r17/gcc-$_NDK_GF_ARCH-linux-x86_64.tar.bz2 | 
|  | 52 | +	local _NDK_TOOLCHAIN_TARGET=$TERMUX_PKG_TMPDIR/android-ndk-r17c/toolchains/$_NDK_GF_TOOLCHAIN_NAME/prebuilt/linux-x86_64 | 
|  | 53 | +	termux_download $_NDK_URL $_NDK_ARCHIVE_FILE $_NDK_SHA256 | 
|  | 54 | +	unzip -d $TERMUX_PKG_TMPDIR/ $_NDK_ARCHIVE_FILE > /dev/null 2>&1 | 
|  | 55 | +	termux_download $_NDK_GF_URL $_NDK_GF_FILE $_NDK_GF_SHA256 | 
|  | 56 | +	tar -jxf $_NDK_GF_FILE -C $TERMUX_PKG_TMPDIR/ | 
|  | 57 | +	rm -rf $_NDK_TOOLCHAIN_TARGET | 
|  | 58 | +	mv $TERMUX_PKG_TMPDIR/$_NDK_GF_TOOLCHAIN_NAME $_NDK_TOOLCHAIN_TARGET | 
|  | 59 | +	export GFORTRAN_TOOLCHAIN=$TERMUX_PKG_TMPDIR/ndk-$TERMUX_ARCH-with-gfortran | 
|  | 60 | +	python $TERMUX_PKG_TMPDIR/android-ndk-r17c/build/tools/make_standalone_toolchain.py \ | 
|  | 61 | +					--arch $_NDK_GF_ARCH --api $TERMUX_PKG_API_LEVEL --install-dir $GFORTRAN_TOOLCHAIN | 
|  | 62 | +} | 
|  | 63 | + | 
|  | 64 | +termux_step_configure() { | 
|  | 65 | +	_setup_fortran_toolchain_r17c | 
|  | 66 | +	CFLAGS="${CFLAGS/-static-openmp/''}" | 
|  | 67 | +	CXXFLAGS="${CXXFLAGS/-static-openmp/''}" | 
|  | 68 | +	LDFLAGS="${LDFLAGS/-static-openmp/''}" | 
|  | 69 | + | 
|  | 70 | +	CROSS_PREFIX=$TERMUX_ARCH-linux-android | 
|  | 71 | +	if [ "$TERMUX_ARCH" == "arm" ]; then | 
|  | 72 | +		CROSS_PREFIX=arm-linux-androideabi | 
|  | 73 | +	fi | 
|  | 74 | + | 
|  | 75 | +	# XXX: Only using gfortran, is it compatible with llvm? | 
|  | 76 | +	export FC=$CROSS_PREFIX-gfortran | 
|  | 77 | +	# XXX: `python` from main repo is built by TERMUX_STANDALONE_TOOLCHAIN and its _sysconfigdata.py | 
|  | 78 | +	# XXX: contains some FLAGS which is not supported by clang/ld.lld from GFORTRAN_TOOLCHAIN, | 
|  | 79 | +	# XXX: such as `-static-openmp`. Replacing these FLAGS in `_sysconfigdata.py` is a solution, | 
|  | 80 | +	# XXX: but I think it is unnecessary. That is the reason why putting GFORTRAN_TOOLCHAIN | 
|  | 81 | +	# XXX: behind TERMUX_STANDALONE_TOOLCHAIN. | 
|  | 82 | +	export PATH="$PATH:$GFORTRAN_TOOLCHAIN/bin" | 
|  | 83 | + | 
|  | 84 | +	# We set `python-scipy` as dependencies, but python-crossenv prefer to use a fake one. | 
|  | 85 | +	DEVICE_STIE=$TERMUX_PREFIX/lib/python${_PYTHON_VERSION}/site-packages | 
|  | 86 | +	pushd $DEVICE_STIE | 
|  | 87 | +	_NUMPY_EGGDIR= | 
|  | 88 | +	for f in numpy-${_NUMPY_VERSION}-py${_PYTHON_VERSION}-linux-*.egg; do | 
|  | 89 | +		if [ -d "$f" ]; then | 
|  | 90 | +			_NUMPY_EGGDIR="$f" | 
|  | 91 | +			break | 
|  | 92 | +		fi | 
|  | 93 | +	done | 
|  | 94 | +	test -n "${_NUMPY_EGGDIR}" | 
|  | 95 | +	popd | 
|  | 96 | +	mv $DEVICE_STIE/$_NUMPY_EGGDIR $TERMUX_PREFIX/tmp/$_NUMPY_EGGDIR | 
|  | 97 | + | 
|  | 98 | +	termux_setup_python_crossenv | 
|  | 99 | +	pushd $TERMUX_PYTHON_CROSSENV_SRCDIR | 
|  | 100 | +	_CROSSENV_PREFIX=$TERMUX_PKG_BUILDDIR/python-crossenv-prefix | 
|  | 101 | +	python${_PYTHON_VERSION} -m crossenv \ | 
|  | 102 | +		$TERMUX_PREFIX/bin/python${_PYTHON_VERSION} \ | 
|  | 103 | +		${_CROSSENV_PREFIX} | 
|  | 104 | +	popd | 
|  | 105 | +	. ${_CROSSENV_PREFIX}/bin/activate | 
|  | 106 | + | 
|  | 107 | +	LDFLAGS+=" -lpython${_PYTHON_VERSION}" | 
|  | 108 | +} | 
|  | 109 | + | 
|  | 110 | +termux_step_make() { | 
|  | 111 | +	MATHLIB="m" pip --no-cache-dir install $_PKG_PYTHON_DEPENDS wheel | 
|  | 112 | +	build-pip install $_PKG_PYTHON_DEPENDS pybind11 Cython pythran wheel | 
|  | 113 | + | 
|  | 114 | +	# From https://gist.github.com/benfogle/85e9d35e507a8b2d8d9dc2175a703c22 | 
|  | 115 | +	BUILD_SITE=${_CROSSENV_PREFIX}/build/lib/python${_PYTHON_VERSION}/site-packages | 
|  | 116 | +	CROSS_SITE=${_CROSSENV_PREFIX}/cross/lib/python${_PYTHON_VERSION}/site-packages | 
|  | 117 | +	INI=$(find $BUILD_SITE -name 'npymath.ini') | 
|  | 118 | +	LIBDIR=$(find $CROSS_SITE -path '*/numpy/core/lib') | 
|  | 119 | +	INCDIR=$(find $CROSS_SITE -path '*/numpy/core/include') | 
|  | 120 | +	cat <<-EOF > $INI  | 
|  | 121 | +	[meta] | 
|  | 122 | +	Name=npymath | 
|  | 123 | +	Description=Portable, core math library implementing C99 standard | 
|  | 124 | +	Version=0.1 | 
|  | 125 | +	[variables] | 
|  | 126 | +	# Force it to find cross-build libs when we build scipy | 
|  | 127 | +	libdir=$LIBDIR | 
|  | 128 | +	includedir=$INCDIR | 
|  | 129 | +	[default] | 
|  | 130 | +	Libs=-L\${libdir} -lnpymath | 
|  | 131 | +	Cflags=-I\${includedir} | 
|  | 132 | +	Requires=mlib | 
|  | 133 | +	EOF | 
|  | 134 | +	_ADDTIONAL_FILES=() | 
|  | 135 | +	cp $CROSS_SITE/numpy/core/lib/libnpymath.a $TERMUX_PREFIX/lib | 
|  | 136 | +	cp $CROSS_SITE/numpy/random/lib/libnpyrandom.a $TERMUX_PREFIX/lib | 
|  | 137 | +	_ADDTIONAL_FILES+=("$TERMUX_PREFIX/lib/libnpymath.a") | 
|  | 138 | +	_ADDTIONAL_FILES+=("$TERMUX_PREFIX/lib/libnpyrandom.a") | 
|  | 139 | +	cat <<- EOF > site.cfg | 
|  | 140 | +	[openblas] | 
|  | 141 | +	libraries = openblas | 
|  | 142 | +	library_dirs = $TERMUX_PREFIX/lib | 
|  | 143 | +	include_dirs = $TERMUX_PREFIX/include | 
|  | 144 | +	EOF | 
|  | 145 | + | 
|  | 146 | +	F90=$FC F77=$FC python setup.py install --force | 
|  | 147 | +} | 
|  | 148 | + | 
|  | 149 | +termux_step_make_install() { | 
|  | 150 | +	export PYTHONPATH="$DEVICE_STIE" | 
|  | 151 | +	F90=$FC F77=$FC python setup.py install --force --prefix $TERMUX_PREFIX | 
|  | 152 | + | 
|  | 153 | +	pushd $DEVICE_STIE | 
|  | 154 | +	_SCIPY_EGGDIR= | 
|  | 155 | +	for f in scipy-${TERMUX_PKG_VERSION}-py${_PYTHON_VERSION}-linux-*.egg; do | 
|  | 156 | +		if [ -d "$f" ]; then | 
|  | 157 | +			_SCIPY_EGGDIR="$f" | 
|  | 158 | +			break | 
|  | 159 | +		fi | 
|  | 160 | +	done | 
|  | 161 | +	test -n "${_SCIPY_EGGDIR}" | 
|  | 162 | +	popd | 
|  | 163 | +} | 
|  | 164 | + | 
|  | 165 | +termux_step_post_make_install() { | 
|  | 166 | +	# Remove these dummy files. | 
|  | 167 | +	rm "${_ADDTIONAL_FILES[@]}" | 
|  | 168 | +	# Recovery numpy | 
|  | 169 | +	mv $TERMUX_PREFIX/tmp/$_NUMPY_EGGDIR $DEVICE_STIE/$_NUMPY_EGGDIR | 
|  | 170 | +	# Delete the easy-install related files, since we use postinst/prerm to handle it. | 
|  | 171 | +	pushd $TERMUX_PREFIX | 
|  | 172 | +	rm -rf lib/python${_PYTHON_VERSION}/site-packages/__pycache__ | 
|  | 173 | +	rm -rf lib/python${_PYTHON_VERSION}/site-packages/easy-install.pth | 
|  | 174 | +	rm -rf lib/python${_PYTHON_VERSION}/site-packages/site.py | 
|  | 175 | +	popd | 
|  | 176 | +} | 
|  | 177 | + | 
|  | 178 | +termux_step_create_debscripts() { | 
|  | 179 | +	cat <<- EOF > ./postinst | 
|  | 180 | +	#!$TERMUX_PREFIX/bin/sh | 
|  | 181 | +	echo "Installing dependencies through pip. This may take a while..." | 
|  | 182 | +	pip3 install ${_PKG_PYTHON_DEPENDS} | 
|  | 183 | +	echo "./${_SCIPY_EGGDIR}" >> $TERMUX_PREFIX/lib/python${_PYTHON_VERSION}/site-packages/easy-install.pth | 
|  | 184 | +	EOF | 
|  | 185 | + | 
|  | 186 | +	cat <<- EOF > ./prerm | 
|  | 187 | +	#!$TERMUX_PREFIX/bin/sh | 
|  | 188 | +	sed -i "/\.\/${_SCIPY_EGGDIR//./\\.}/d" $TERMUX_PREFIX/lib/python${_PYTHON_VERSION}/site-packages/easy-install.pth | 
|  | 189 | +	EOF | 
|  | 190 | +} | 
0 commit comments