Skip to content

Commit 75b0f58

Browse files
committed
new package: openblas, python-numpy, python-scipy
1 parent 80097dc commit 75b0f58

File tree

3 files changed

+369
-0
lines changed

3 files changed

+369
-0
lines changed

tur/openblas/build.sh

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
TERMUX_PKG_HOMEPAGE=http://www.openblas.net/
2+
TERMUX_PKG_DESCRIPTION="An optimized BLAS library"
3+
TERMUX_PKG_LICENSE="BSD 3-Clause"
4+
TERMUX_PKG_MAINTAINER="@termux-user-repository"
5+
TERMUX_PKG_VERSION=0.3.20
6+
TERMUX_PKG_SRCURL=https://github.com/xianyi/OpenBLAS.git
7+
TERMUX_PKG_FORCE_CMAKE=true
8+
9+
if $TERMUX_ON_DEVICE_BUILD; then
10+
termux_error_exit "Package '$TERMUX_PKG_NAME' is not available for on-device builds."
11+
fi
12+
13+
# XXX: This step will setup an old NDK toolchain (r13b) containing gcc and
14+
# XXX: gfortran. If NDK toolchain with llvm contains fortran compiler, this
15+
# XXX: step may be unnecessary.
16+
_setup_fortran_toolchain_r13b() {
17+
mkdir -p $TERMUX_COMMON_CACHEDIR/android-gfortran/r13b
18+
local _NDK_ARCHIVE_FILE=$TERMUX_COMMON_CACHEDIR/android-gfortran/android-ndk-r13b-linux-x86_64.zip
19+
local _NDK_URL=https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip
20+
local _NDK_SHA256=3524d7f8fca6dc0d8e7073a7ab7f76888780a22841a6641927123146c3ffd29c
21+
local _NDK_GF_ARCH
22+
local _NDK_GF_SHA256
23+
if [ "$TERMUX_ARCH" == "aarch64" ]; then
24+
_NDK_GF_ARCH="arm64"
25+
_NDK_GF_SHA256=8810eb94682bff79d56800713a1845761e6f6636ab6d13ee1968d5b36834d60b
26+
_NDK_GF_TOOLCHAIN_NAME="aarch64-linux-android-4.9"
27+
elif [ "$TERMUX_ARCH" == "arm" ]; then
28+
_NDK_GF_ARCH="arm"
29+
_NDK_GF_SHA256=82d9f8e6c6c08d6e630dd43780526b371076fab489b5b7244ceba7702630121a
30+
_NDK_GF_TOOLCHAIN_NAME="arm-linux-androideabi-4.9"
31+
elif [ "$TERMUX_ARCH" == "x86_64" ]; then
32+
_NDK_GF_ARCH="x86_64"
33+
_NDK_GF_SHA256=7d897a05c28e16f0c357c1be5ad1ddee173882a5056506d5bfc6c84e94387976
34+
_NDK_GF_TOOLCHAIN_NAME="x86_64-4.9"
35+
elif [ "$TERMUX_ARCH" == "i686" ]; then
36+
_NDK_GF_ARCH="x86"
37+
_NDK_GF_SHA256=50e27874d965f0ae18973e99e2f5de35eef74d19bc478d3f6649fa3ed411e84a
38+
_NDK_GF_TOOLCHAIN_NAME="x86-4.9"
39+
fi
40+
local _NDK_GF_FILE=$TERMUX_COMMON_CACHEDIR/android-gfortran/r13b/gcc-$_NDK_GF_ARCH-linux-x86_64.tar.bz2
41+
local _NDK_GF_URL=https://github.com/buffer51/android-gfortran/releases/download/r13b/gcc-$_NDK_GF_ARCH-linux-x86_64.tar.bz2
42+
local _NDK_TOOLCHAIN_TARGET=$TERMUX_PKG_TMPDIR/android-ndk-r13b/toolchains/$_NDK_GF_TOOLCHAIN_NAME/prebuilt/linux-x86_64
43+
termux_download $_NDK_URL $_NDK_ARCHIVE_FILE $_NDK_SHA256
44+
unzip -d $TERMUX_PKG_TMPDIR/ $_NDK_ARCHIVE_FILE > /dev/null 2>&1
45+
termux_download $_NDK_GF_URL $_NDK_GF_FILE $_NDK_GF_SHA256
46+
tar -jxf $_NDK_GF_FILE -C $TERMUX_PKG_TMPDIR/
47+
rm -rf $_NDK_TOOLCHAIN_TARGET
48+
mv $TERMUX_PKG_TMPDIR/$_NDK_GF_TOOLCHAIN_NAME $_NDK_TOOLCHAIN_TARGET
49+
GFORTRAN_TOOLCHAIN=$TERMUX_PKG_TMPDIR/ndk-$TERMUX_ARCH-with-gfortran
50+
python $TERMUX_PKG_TMPDIR/android-ndk-r13b/build/tools/make_standalone_toolchain.py \
51+
--arch $_NDK_GF_ARCH --api $TERMUX_PKG_API_LEVEL --install-dir $GFORTRAN_TOOLCHAIN
52+
TERMUX_STANDALONE_TOOLCHAIN="$GFORTRAN_TOOLCHAIN"
53+
}
54+
55+
termux_step_pre_configure() {
56+
# XXX: libncurses5 is used by `clang38`.
57+
# XXX: So should TUR use a custom builder image?
58+
env -i PATH="$PATH" sudo apt install -y libncurses5
59+
60+
_setup_fortran_toolchain_r13b
61+
62+
CXXFLAGS=""
63+
CFLAGS=""
64+
LDFLAGS=""
65+
66+
local CROSS_PREFIX=$TERMUX_ARCH-linux-android
67+
68+
if [ "$TERMUX_ARCH" == "arm" ]; then
69+
CROSS_PREFIX=arm-linux-androideabi
70+
elif [ "$TERMUX_ARCH" == "x86_64" ] || [ "$TERMUX_ARCH" == "i686" ]; then
71+
# XXX: CORE2 seems too old. So which target should be set for openblas?
72+
TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DTARGET=CORE2"
73+
fi
74+
75+
# Backup these environment variables, since they are used by the building system.
76+
_OLD_AR="$AR"
77+
_OLD_STRIP="$STRIP"
78+
_OLD_PATH="$PATH"
79+
80+
export AR=$CROSS_PREFIX-ar
81+
export AS=$CROSS_PREFIX-as
82+
export LD=$CROSS_PREFIX-ld
83+
export NM=$CROSS_PREFIX-nm
84+
export CC=$CROSS_PREFIX-gcc
85+
export FC=$CROSS_PREFIX-gfortran
86+
export CXX=$CROSS_PREFIX-g++
87+
export CPP=$CROSS_PREFIX-cpp
88+
export CXXCPP=$CROSS_PREFIX-cpp
89+
export STRIP=$CROSS_PREFIX-strip
90+
export RANLIB=$CROSS_PREFIX-ranlib
91+
export STRINGS=$CROSS_PREFIX-strings
92+
export PATH="$TERMUX_STANDALONE_TOOLCHAIN/bin:$PATH"
93+
94+
TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON"
95+
}
96+
97+
termux_step_post_make_install() {
98+
# Recover these environment variables.
99+
AR="$_OLD_AR"
100+
STRIP="$_OLD_STRIP"
101+
PATH="$_OLD_PATH"
102+
}

tur/python-numpy/build.sh

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
TERMUX_PKG_HOMEPAGE=https://numpy.org/
2+
TERMUX_PKG_DESCRIPTION="The fundamental package for scientific computing with Python"
3+
TERMUX_PKG_LICENSE="BSD 3-Clause"
4+
TERMUX_PKG_MAINTAINER="@termux-user-repository"
5+
# Don't forget to bump the REVISION of python-scipy.
6+
TERMUX_PKG_VERSION=1.23.0
7+
TERMUX_PKG_SRCURL=https://github.com/numpy/numpy.git
8+
TERMUX_PKG_PROVIDES="python-numpy"
9+
TERMUX_PKG_DEPENDS="libc++, openblas, python"
10+
TERMUX_PKG_BUILD_IN_SRC=true
11+
12+
_PYTHON_VERSION=$(. $TERMUX_SCRIPTDIR/packages/python/build.sh; echo $_MAJOR_VERSION)
13+
14+
TERMUX_PKG_RM_AFTER_INSTALL="
15+
bin/
16+
"
17+
18+
if $TERMUX_ON_DEVICE_BUILD; then
19+
termux_error_exit "Package '$TERMUX_PKG_NAME' is not available for on-device builds."
20+
fi
21+
22+
termux_step_configure() {
23+
termux_setup_python_crossenv
24+
pushd $TERMUX_PYTHON_CROSSENV_SRCDIR
25+
_CROSSENV_PREFIX=$TERMUX_PKG_BUILDDIR/python-crossenv-prefix
26+
python${_PYTHON_VERSION} -m crossenv \
27+
$TERMUX_PREFIX/bin/python${_PYTHON_VERSION} \
28+
${_CROSSENV_PREFIX}
29+
popd
30+
. ${_CROSSENV_PREFIX}/bin/activate
31+
32+
LDFLAGS+=" -lpython${_PYTHON_VERSION}"
33+
}
34+
35+
termux_step_make() {
36+
build-pip install pybind11 Cython pythran wheel
37+
DEVICE_STIE=$TERMUX_PREFIX/lib/python${_PYTHON_VERSION}/site-packages
38+
MATHLIB="m" python setup.py install --force
39+
}
40+
41+
termux_step_make_install() {
42+
export PYTHONPATH="$DEVICE_STIE"
43+
MATHLIB="m" python setup.py install --force --prefix $TERMUX_PREFIX
44+
45+
pushd $DEVICE_STIE
46+
_NUMPY_EGGDIR=
47+
for f in numpy-${TERMUX_PKG_VERSION}-py${_PYTHON_VERSION}-linux-*.egg; do
48+
if [ -d "$f" ]; then
49+
_NUMPY_EGGDIR="$f"
50+
break
51+
fi
52+
done
53+
test -n "${_NUMPY_EGGDIR}"
54+
popd
55+
}
56+
57+
termux_step_post_make_install() {
58+
# Delete the easy-install related files, since we use postinst/prerm to handle it.
59+
pushd $TERMUX_PREFIX
60+
rm -rf lib/python${_PYTHON_VERSION}/site-packages/__pycache__
61+
rm -rf lib/python${_PYTHON_VERSION}/site-packages/easy-install.pth
62+
rm -rf lib/python${_PYTHON_VERSION}/site-packages/site.py
63+
popd
64+
}
65+
66+
termux_step_create_debscripts() {
67+
cat <<- EOF > ./postinst
68+
#!$TERMUX_PREFIX/bin/sh
69+
echo "Installing numpy..."
70+
echo "./${_NUMPY_EGGDIR}" >> $TERMUX_PREFIX/lib/python${_PYTHON_VERSION}/site-packages/easy-install.pth
71+
EOF
72+
73+
cat <<- EOF > ./prerm
74+
#!$TERMUX_PREFIX/bin/sh
75+
sed -i "/\.\/${_NUMPY_EGGDIR//./\\.}/d" $TERMUX_PREFIX/lib/python${_PYTHON_VERSION}/site-packages/easy-install.pth
76+
EOF
77+
}

tur/python-scipy/build.sh

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
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

Comments
 (0)