diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 89cddcb2ce..4c866c5dcd 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -63,6 +63,8 @@ jobs: bootstrap: - name: sdl2 target: testapps-with-numpy + - name: sdl2_scipy + target: testapps-with-scipy - name: webview target: testapps-webview steps: diff --git a/Makefile b/Makefile index b295cfa29d..69fe7985e5 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ PYTHON_WITH_VERSION=python$(PYTHON_VERSION) DOCKER_IMAGE=kivy/python-for-android ANDROID_SDK_HOME ?= $(HOME)/.android/android-sdk ANDROID_NDK_HOME ?= $(HOME)/.android/android-ndk +ANDROID_NDK_HOME_LEGACY ?= $(HOME)/.android/android-ndk-legacy REBUILD_UPDATED_RECIPES_EXTRA_ARGS ?= '' @@ -41,6 +42,13 @@ testapps-with-numpy: virtualenv --requirements libffi,sdl2,pyjnius,kivy,python3,openssl,requests,urllib3,chardet,idna,sqlite3,setuptools,numpy \ --arch=armeabi-v7a --arch=arm64-v8a --arch=x86_64 --arch=x86 +testapps-with-scipy: virtualenv + . $(ACTIVATE) && cd testapps/on_device_unit_tests/ && \ + export LEGACY_NDK=$(ANDROID_NDK_HOME_LEGACY) && \ + python setup.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ + --requirements python3,scipy,kivy \ + --arch=armeabi-v7a --arch=arm64-v8a + testapps-with-numpy-aab: virtualenv . $(ACTIVATE) && cd testapps/on_device_unit_tests/ && \ python setup.py aab --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ diff --git a/ci/makefiles/android.mk b/ci/makefiles/android.mk index bdad88d65e..bb29c3ea17 100644 --- a/ci/makefiles/android.mk +++ b/ci/makefiles/android.mk @@ -2,6 +2,7 @@ # Those android NDK/SDK variables can be override when running the file ANDROID_NDK_VERSION ?= 23b +ANDROID_NDK_VERSION_LEGACY ?= 19c ANDROID_SDK_TOOLS_VERSION ?= 6514223 ANDROID_SDK_BUILD_TOOLS_VERSION ?= 29.0.3 ANDROID_HOME ?= $(HOME)/.android @@ -23,22 +24,34 @@ ANDROID_SDK_TOOLS_DL_URL=https://dl.google.com/android/repository/$(ANDROID_SDK_ ANDROID_NDK_HOME=$(ANDROID_HOME)/android-ndk ANDROID_NDK_FOLDER=$(ANDROID_HOME)/android-ndk-r$(ANDROID_NDK_VERSION) ANDROID_NDK_ARCHIVE=android-ndk-r$(ANDROID_NDK_VERSION)-$(TARGET_OS).zip + +ANDROID_NDK_HOME_LEGACY=$(ANDROID_HOME)/android-ndk-legacy +ANDROID_NDK_FOLDER_LEGACY=$(ANDROID_HOME)/android-ndk-r$(ANDROID_NDK_VERSION_LEGACY) +ANDROID_NDK_ARCHIVE_LEGACY=android-ndk-r$(ANDROID_NDK_VERSION_LEGACY)-$(TARGET_OS)-x86_64.zip + +ANDROID_NDK_GFORTRAN_ARCHIVE_ARM64=gcc-arm64-linux-x86_64.tar.bz2 +ANDROID_NDK_GFORTRAN_ARCHIVE_ARM=gcc-arm-linux-x86_64.tar.bz2 + + ANDROID_NDK_DL_URL=https://dl.google.com/android/repository/$(ANDROID_NDK_ARCHIVE) +ANDROID_NDK_DL_URL_LEGACY=https://dl.google.com/android/repository/$(ANDROID_NDK_ARCHIVE_LEGACY) $(info Target install OS is : $(target_os)) $(info Android SDK home is : $(ANDROID_SDK_HOME)) $(info Android NDK home is : $(ANDROID_NDK_HOME)) +$(info Android NDK Legacy home is : $(ANDROID_NDK_HOME_LEGACY)) $(info Android SDK download url is : $(ANDROID_SDK_TOOLS_DL_URL)) $(info Android NDK download url is : $(ANDROID_NDK_DL_URL)) $(info Android API level is : $(ANDROID_API_LEVEL)) $(info Android NDK version is : $(ANDROID_NDK_VERSION)) +$(info Android NDK Legacy version is : $(ANDROID_NDK_VERSION_LEGACY)) $(info JAVA_HOME is : $(JAVA_HOME)) all: install_sdk install_ndk install_sdk: download_android_sdk extract_android_sdk update_android_sdk -install_ndk: download_android_ndk extract_android_ndk +install_ndk: download_android_ndk download_android_ndk_legacy download_android_ndk_gfortran extract_android_ndk extract_android_ndk_legacy extract_android_ndk_gfortran download_android_sdk: curl --location --progress-bar --continue-at - \ @@ -48,6 +61,17 @@ download_android_ndk: curl --location --progress-bar --continue-at - \ $(ANDROID_NDK_DL_URL) --output $(ANDROID_NDK_ARCHIVE) +download_android_ndk_legacy: + curl --location --progress-bar --continue-at - \ + $(ANDROID_NDK_DL_URL_LEGACY) --output $(ANDROID_NDK_ARCHIVE_LEGACY) + +download_android_ndk_gfortran: + curl --location --progress-bar --continue-at - \ + https://github.com/mzakharo/android-gfortran/releases/download/r$(ANDROID_NDK_VERSION_LEGACY)/$(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM64) --output $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM64) + curl --location --progress-bar --continue-at - \ + https://github.com/mzakharo/android-gfortran/releases/download/r$(ANDROID_NDK_VERSION_LEGACY)/$(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM) --output $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM) + + # Extract android SDK and remove the compressed file extract_android_sdk: mkdir -p $(ANDROID_SDK_HOME) \ @@ -62,6 +86,22 @@ extract_android_ndk: && mv $(ANDROID_NDK_FOLDER) $(ANDROID_NDK_HOME) \ && rm -f $(ANDROID_NDK_ARCHIVE) +extract_android_ndk_legacy: + mkdir -p $(ANDROID_NDK_FOLDER_LEGACY) \ + && unzip -q $(ANDROID_NDK_ARCHIVE_LEGACY) -d $(ANDROID_HOME) \ + && mv $(ANDROID_NDK_FOLDER_LEGACY) $(ANDROID_NDK_HOME_LEGACY) \ + && rm -f $(ANDROID_NDK_ARCHIVE_LEGACY) + +extract_android_ndk_gfortran: + rm -rf $(ANDROID_NDK_HOME_LEGACY)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/ + mkdir $(ANDROID_NDK_HOME_LEGACY)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/ + tar -xvf $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM64) -C $(ANDROID_NDK_HOME_LEGACY)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/ --strip-components 1 + rm -rf $(ANDROID_NDK_HOME_LEGACY)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/ + mkdir $(ANDROID_NDK_HOME_LEGACY)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/ + tar -xvf $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM) -C $(ANDROID_NDK_HOME_LEGACY)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/ --strip-components 1 + + + # updates Android SDK, install Android API, Build Tools and accept licenses update_android_sdk: touch $(ANDROID_HOME)/repositories.cfg diff --git a/testapps/on_device_unit_tests/test_app/tests/test_requirements.py b/testapps/on_device_unit_tests/test_app/tests/test_requirements.py index cffb404409..e4104f8300 100644 --- a/testapps/on_device_unit_tests/test_app/tests/test_requirements.py +++ b/testapps/on_device_unit_tests/test_app/tests/test_requirements.py @@ -12,6 +12,25 @@ def test_run_module(self): arr = np.random.random((3, 3)) det = np.linalg.det(arr) +class ScipyTestCase(PythonTestMixIn, TestCase): + module_import = 'scipy' + + def test_run_module(self): + import numpy as np + from scipy.cluster.vq import vq, kmeans, whiten + features = np.array([[ 1.9,2.3], + [ 1.5,2.5], + [ 0.8,0.6], + [ 0.4,1.8], + [ 0.1,0.1], + [ 0.2,1.8], + [ 2.0,0.5], + [ 0.3,1.5], + [ 1.0,1.0]]) + whitened = whiten(features) + book = np.array((whitened[0],whitened[2])) + print('kmeans', kmeans(whitened,book)) + class OpensslTestCase(PythonTestMixIn, TestCase): module_import = '_ssl'