diff --git a/ci/constants.py b/ci/constants.py index 27e9d31a1e..c5ab61099d 100644 --- a/ci/constants.py +++ b/ci/constants.py @@ -3,7 +3,6 @@ class TargetPython(Enum): python2 = 0 - python3crystax = 1 python3 = 2 @@ -22,7 +21,6 @@ class TargetPython(Enum): 'ffpyplayer', 'flask', 'groestlcoin_hash', - 'hostpython3crystax', # https://github.com/kivy/python-for-android/issues/1354 'kiwisolver', 'libmysqlclient', @@ -88,5 +86,5 @@ class TargetPython(Enum): # recipes that were already built will be skipped CORE_RECIPES = set([ 'pyjnius', 'kivy', 'openssl', 'requests', 'sqlite3', 'setuptools', - 'numpy', 'android', 'python2', 'python3', + 'numpy', 'android', 'hostpython2', 'hostpython3', 'python2', 'python3', ]) diff --git a/ci/rebuild_updated_recipes.py b/ci/rebuild_updated_recipes.py index 32b0fda0f6..54f62ac768 100755 --- a/ci/rebuild_updated_recipes.py +++ b/ci/rebuild_updated_recipes.py @@ -28,6 +28,7 @@ from pythonforandroid.graph import get_recipe_order_and_bootstrap from pythonforandroid.toolchain import current_directory from pythonforandroid.util import BuildInterruptingException +from pythonforandroid.recipe import Recipe from ci.constants import TargetPython, CORE_RECIPES, BROKEN_RECIPES @@ -66,7 +67,7 @@ def build(target_python, requirements): # iterates to stream the output for line in sh.python( testapp, 'apk', '--sdk-dir', android_sdk_home, - '--ndk-dir', android_ndk_home, '--bootstrap', 'sdl2', '--requirements', + '--ndk-dir', android_ndk_home, '--requirements', requirements, _err_to_out=True, _iter=True): print(line) @@ -78,6 +79,18 @@ def main(): recipes -= CORE_RECIPES logger.info('recipes to build: {}'.format(recipes)) context = Context() + + # removing the deleted recipes for the given target (if any) + for recipe_name in recipes.copy(): + try: + Recipe.get_recipe(recipe_name, context) + except ValueError: + # recipe doesn't exist, so probably we remove it + recipes.remove(recipe_name) + logger.warning( + 'removed {} from recipes because deleted'.format(recipe_name) + ) + # forces the default target recipes_and_target = recipes | set([target_python.name]) try: diff --git a/doc/source/buildoptions.rst b/doc/source/buildoptions.rst index f2d7b26f64..5d80020728 100644 --- a/doc/source/buildoptions.rst +++ b/doc/source/buildoptions.rst @@ -33,25 +33,14 @@ e.g. ``--requirements=python3``. CrystaX python3 -############### +~~~~~~~~~~~~~~~ -.. warning:: python-for-android originally supported Python 3 using the CrystaX - NDK. This support is now being phased out as CrystaX is no longer - actively developed. +python-for-android no longer supports building for Python 3 using the CrystaX +NDK. Instead, use the python3 recipe, which can be built using the normal +Google NDK. -.. note:: You must manually download the `CrystaX NDK - <https://www.crystax.net/android/ndk>`__ and tell - python-for-android to use it with ``--ndk-dir /path/to/NDK``. - -Select this by adding the ``python3crystax`` recipe to your -requirements, e.g. ``--requirements=python3crystax``. - -This uses the prebuilt Python from the `CrystaX NDK -<https://www.crystax.net/android/ndk>`__, a drop-in replacement for -Google's official NDK which includes many improvements. You -*must* use the CrystaX NDK 10.3.0 or higher when building with -python3. You can get it `here -<https://www.crystax.net/en/download>`__. +.. note:: The last python-for-android version supporting CrystaX was `0.7.0. + <https://github.com/kivy/python-for-android/archive/0.7.0.zip>`__ .. _bootstrap_build_options: diff --git a/doc/source/docker.rst b/doc/source/docker.rst index 3ff9267f73..623e0e6883 100644 --- a/doc/source/docker.rst +++ b/doc/source/docker.rst @@ -17,12 +17,11 @@ already have Docker preinstalled and set up. .. warning:: This approach is highly space unfriendly! The more layers (``commit``) or even Docker images (``build``) you create the more space it'll consume. - Within the Docker image there is Android + Crystax SDK and NDK + various - dependencies. Within the custom diff made by building the distribution - there is another big chunk of space eaten. The very basic stuff such as - a distribution with: CPython 3, setuptools, Python for Android ``android`` - module, SDL2 (+ deps), PyJNIus and Kivy takes almost 13 GB. Check your free - space first! + Within the Docker image there is Android SDK and NDK + various dependencies. + Within the custom diff made by building the distribution there is another + big chunk of space eaten. The very basic stuff such as a distribution with: + CPython 3, setuptools, Python for Android ``android`` module, SDL2 (+ deps), + PyJNIus and Kivy takes almost 2 GB. Check your free space first! 1. Clone the repository:: diff --git a/pythonforandroid/archs.py b/pythonforandroid/archs.py index a27067ab1a..42f143ed21 100644 --- a/pythonforandroid/archs.py +++ b/pythonforandroid/archs.py @@ -92,9 +92,6 @@ def get_env(self, with_flags_in_cc=True, clang=False): env["LDFLAGS"] += " ".join(['-lm', '-L' + self.ctx.get_libs_dir(self.arch)]) - if self.ctx.ndk == 'crystax': - env['LDFLAGS'] += ' -L{}/sources/crystax/libs/{} -lcrystax'.format(self.ctx.ndk_dir, self.arch) - toolchain_prefix = self.ctx.toolchain_prefix toolchain_version = self.ctx.toolchain_version command_prefix = self.command_prefix @@ -154,10 +151,7 @@ def get_env(self, with_flags_in_cc=True, clang=False): env['LD'] = '{}-ld'.format(command_prefix) env['LDSHARED'] = env["CC"] + " -pthread -shared " +\ "-Wl,-O1 -Wl,-Bsymbolic-functions " - if self.ctx.python_recipe and self.ctx.python_recipe.from_crystax: - # For crystax python, we can't use the host python headers: - env["CFLAGS"] += ' -I{}/sources/python/{}/include/python/'.\ - format(self.ctx.ndk_dir, self.ctx.python_recipe.version[0:3]) + env['STRIP'] = '{}-strip --strip-unneeded'.format(command_prefix) env['MAKE'] = 'make -j5' env['READELF'] = '{}-readelf'.format(command_prefix) @@ -180,9 +174,6 @@ def get_env(self, with_flags_in_cc=True, clang=False): env['ARCH'] = self.arch env['NDK_API'] = 'android-{}'.format(str(self.ctx.ndk_api)) - if self.ctx.python_recipe and self.ctx.python_recipe.from_crystax: - env['CRYSTAX_PYTHON_VERSION'] = self.ctx.python_recipe.version - return env diff --git a/pythonforandroid/bootstrap.py b/pythonforandroid/bootstrap.py index d58e20f2bf..cd11c6e1a9 100755 --- a/pythonforandroid/bootstrap.py +++ b/pythonforandroid/bootstrap.py @@ -80,10 +80,7 @@ class Bootstrap(object): distribution = None # All bootstraps should include Python in some way: - recipe_depends = [ - ("python2", "python3", "python3crystax"), - 'android', - ] + recipe_depends = [("python2", "python3"), 'android'] can_be_chosen_automatically = True '''Determines whether the bootstrap can be chosen as one that @@ -345,9 +342,6 @@ def _unpack_aar(self, aar, arch): def strip_libraries(self, arch): info('Stripping libraries') - if self.ctx.python_recipe.from_crystax: - info('Python was loaded from CrystaX, skipping strip') - return env = arch.get_env() tokens = shlex.split(env['STRIP']) strip = sh.Command(tokens[0]) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 2b69082f14..ed5e708892 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -332,9 +332,7 @@ def make_package(args): shutil.copyfile(join(args.private, "main.py"), join(main_py_only_dir, "main.py")) tar_dirs.append(main_py_only_dir) - for python_bundle_dir in ('private', - 'crystax_python', - '_python_bundle'): + for python_bundle_dir in ('private', '_python_bundle'): if exists(python_bundle_dir): tar_dirs.append(python_bundle_dir) if get_bootstrap_name() == "webview": @@ -783,14 +781,13 @@ def _read_configuration(): if args.try_system_python_compile: # Hardcoding python2.7 is okay for now, as python3 skips the # compilation anyway - if not exists('crystax_python'): - python_executable = 'python2.7' - try: - subprocess.call([python_executable, '--version']) - except (OSError, subprocess.CalledProcessError): - pass - else: - PYTHON = python_executable + python_executable = 'python2.7' + try: + subprocess.call([python_executable, '--version']) + except (OSError, subprocess.CalledProcessError): + pass + else: + PYTHON = python_executable if args.no_compile_pyo: PYTHON = None diff --git a/pythonforandroid/bootstraps/common/build/jni/application/src/Android.mk b/pythonforandroid/bootstraps/common/build/jni/application/src/Android.mk index 4a442eeb32..fb2b17719d 100644 --- a/pythonforandroid/bootstraps/common/build/jni/application/src/Android.mk +++ b/pythonforandroid/bootstraps/common/build/jni/application/src/Android.mk @@ -21,7 +21,3 @@ LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog $(EXTRA_LDLIBS) LOCAL_LDFLAGS += -L$(PYTHON_LINK_ROOT) $(APPLICATION_ADDITIONAL_LDFLAGS) include $(BUILD_SHARED_LIBRARY) - -ifdef CRYSTAX_PYTHON_VERSION - $(call import-module,python/$(CRYSTAX_PYTHON_VERSION)) -endif diff --git a/pythonforandroid/bootstraps/common/build/jni/application/src/start.c b/pythonforandroid/bootstraps/common/build/jni/application/src/start.c index a88ec74c74..24297accdb 100644 --- a/pythonforandroid/bootstraps/common/build/jni/application/src/start.c +++ b/pythonforandroid/bootstraps/common/build/jni/application/src/start.c @@ -165,26 +165,14 @@ int main(int argc, char *argv[]) { // Set up the python path char paths[256]; - char crystax_python_dir[256]; - snprintf(crystax_python_dir, 256, - "%s/crystax_python", getenv("ANDROID_UNPACK")); char python_bundle_dir[256]; snprintf(python_bundle_dir, 256, "%s/_python_bundle", getenv("ANDROID_UNPACK")); - if (dir_exists(crystax_python_dir) || dir_exists(python_bundle_dir)) { - if (dir_exists(crystax_python_dir)) { - LOGP("crystax_python exists"); - snprintf(paths, 256, - "%s/stdlib.zip:%s/modules", - crystax_python_dir, crystax_python_dir); - } - - if (dir_exists(python_bundle_dir)) { - LOGP("_python_bundle dir exists"); - snprintf(paths, 256, - "%s/stdlib.zip:%s/modules", - python_bundle_dir, python_bundle_dir); - } + if (dir_exists(python_bundle_dir)) { + LOGP("_python_bundle dir exists"); + snprintf(paths, 256, + "%s/stdlib.zip:%s/modules", + python_bundle_dir, python_bundle_dir); LOGP("calculated paths to be..."); LOGP(paths); @@ -196,10 +184,8 @@ int main(int argc, char *argv[]) { LOGP("set wchar paths..."); } else { - // We do not expect to see crystax_python any more, so no point - // reminding the user about it. If it does exist, we'll have - // logged it earlier. - LOGP("_python_bundle does not exist"); + LOGP("_python_bundle does not exist...this not looks good, all python" + " recipes should have this folder, should we expect a crash soon?"); } Py_Initialize(); @@ -234,18 +220,6 @@ int main(int argc, char *argv[]) { PyRun_SimpleString("import sys, posix\n"); char add_site_packages_dir[256]; - if (dir_exists(crystax_python_dir)) { - snprintf(add_site_packages_dir, 256, - "sys.path.append('%s/site-packages')", - crystax_python_dir); - - PyRun_SimpleString("import sys\n" - "sys.argv = ['notaninterpreterreally']\n" - "from os.path import realpath, join, dirname"); - PyRun_SimpleString(add_site_packages_dir); - /* "sys.path.append(join(dirname(realpath(__file__)), 'site-packages'))") */ - PyRun_SimpleString("sys.path = ['.'] + sys.path"); - } if (dir_exists(python_bundle_dir)) { snprintf(add_site_packages_dir, 256, diff --git a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java index 1f2673850d..2bb1cf3607 100644 --- a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java +++ b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java @@ -32,7 +32,6 @@ protected static void addLibraryIfExists(ArrayList<String> libsList, String patt protected static ArrayList<String> getLibraries(File libsDir) { ArrayList<String> libsList = new ArrayList<String>(); - addLibraryIfExists(libsList, "crystax", libsDir); addLibraryIfExists(libsList, "sqlite3", libsDir); addLibraryIfExists(libsList, "ffi", libsDir); addLibraryIfExists(libsList, "ssl.*", libsDir); diff --git a/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java b/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java index c1180addfa..d7eb704f12 100644 --- a/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java +++ b/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java @@ -31,7 +31,6 @@ protected static void addLibraryIfExists(ArrayList<String> libsList, String patt protected static ArrayList<String> getLibraries(File libsDir) { ArrayList<String> libsList = new ArrayList<String>(); - addLibraryIfExists(libsList, "crystax", libsDir); addLibraryIfExists(libsList, "sqlite3", libsDir); addLibraryIfExists(libsList, "ffi", libsDir); addLibraryIfExists(libsList, "png16", libsDir); diff --git a/pythonforandroid/bootstraps/service_only/build/jni/application/src/Android.mk b/pythonforandroid/bootstraps/service_only/build/jni/application/src/Android.mk index 0bc42bfb89..dc351a3319 100644 --- a/pythonforandroid/bootstraps/service_only/build/jni/application/src/Android.mk +++ b/pythonforandroid/bootstraps/service_only/build/jni/application/src/Android.mk @@ -16,7 +16,3 @@ LOCAL_LDLIBS := -llog $(EXTRA_LDLIBS) LOCAL_LDFLAGS += -L$(PYTHON_LINK_ROOT) $(APPLICATION_ADDITIONAL_LDFLAGS) include $(BUILD_SHARED_LIBRARY) - -ifdef CRYSTAX_PYTHON_VERSION - $(call import-module,python/$(CRYSTAX_PYTHON_VERSION)) -endif diff --git a/pythonforandroid/bootstraps/webview/build/jni/application/src/Android.mk b/pythonforandroid/bootstraps/webview/build/jni/application/src/Android.mk index 20399573c9..5fbc4cd365 100644 --- a/pythonforandroid/bootstraps/webview/build/jni/application/src/Android.mk +++ b/pythonforandroid/bootstraps/webview/build/jni/application/src/Android.mk @@ -18,7 +18,3 @@ LOCAL_LDLIBS := -llog $(EXTRA_LDLIBS) LOCAL_LDFLAGS += -L$(PYTHON_LINK_ROOT) $(APPLICATION_ADDITIONAL_LDFLAGS) include $(BUILD_SHARED_LIBRARY) - -ifdef CRYSTAX_PYTHON_VERSION - $(call import-module,python/$(CRYSTAX_PYTHON_VERSION)) -endif diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index 19893d1619..f0fbc86e9d 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -561,10 +561,13 @@ def build_recipes(build_order, python_modules, ctx, project_dir, # 4) biglink everything info_main('# Biglinking object files') - if not ctx.python_recipe or not ctx.python_recipe.from_crystax: + if not ctx.python_recipe: biglink(ctx, arch) else: - info('NDK is crystax, skipping biglink (will this work?)') + warning( + "Context's python recipe found, " + "skipping biglink (will this work?)" + ) # 5) postbuild packages info_main('# Postbuilding recipes') diff --git a/pythonforandroid/python.py b/pythonforandroid/python.py index 3a214ee714..ab9035e11a 100755 --- a/pythonforandroid/python.py +++ b/pythonforandroid/python.py @@ -49,13 +49,9 @@ class GuestPythonRecipe(TargetPythonRecipe): this limitation. ''' - from_crystax = False - '''True if the python is used from CrystaX, False otherwise (i.e. if - it is built by p4a).''' - configure_args = () '''The configure arguments needed to build the python recipe. Those are - used in method :meth:`build_arch` (if not overwritten like python3crystax's + used in method :meth:`build_arch` (if not overwritten like python3's recipe does). .. note:: This variable should be properly set in subclass. @@ -108,10 +104,6 @@ def __init__(self, *args, **kwargs): super(GuestPythonRecipe, self).__init__(*args, **kwargs) def get_recipe_env(self, arch=None, with_flags_in_cc=True): - if self.from_crystax: - return super(GuestPythonRecipe, self).get_recipe_env( - arch=arch, with_flags_in_cc=with_flags_in_cc) - env = environ.copy() android_host = env['HOSTARCH'] = arch.command_prefix @@ -215,10 +207,6 @@ def add_flags(include_flags, link_dirs, link_libs): def prebuild_arch(self, arch): super(TargetPythonRecipe, self).prebuild_arch(arch) - if self.from_crystax and self.ctx.ndk != 'crystax': - raise BuildInterruptingException( - 'The {} recipe can only be built when using the CrystaX NDK. ' - 'Exiting.'.format(self.name)) self.ctx.python_recipe = self def build_arch(self, arch): diff --git a/pythonforandroid/recipe.py b/pythonforandroid/recipe.py index 9b07a3cf1b..4de888306a 100644 --- a/pythonforandroid/recipe.py +++ b/pythonforandroid/recipe.py @@ -725,14 +725,37 @@ class PythonRecipe(Recipe): This is almost always what you want to do.''' setup_extra_args = [] - '''List of extra arugments to pass to setup.py''' + '''List of extra arguments to pass to setup.py''' + + depends = [('python2', 'python3')] + ''' + .. note:: it's important to keep this depends as a class attribute outside + `__init__` because sometimes we only initialize the class, so the + `__init__` call won't be called and the deps would be missing + (which breaks the dependency graph computation) + + .. warning:: don't forget to call `super().__init__()` in any recipe's + `__init__`, or otherwise it may not be ensured that it depends + on python2 or python3 which can break the dependency graph + ''' def __init__(self, *args, **kwargs): super(PythonRecipe, self).__init__(*args, **kwargs) - depends = self.depends - depends.append(('python2', 'python3', 'python3crystax')) - depends = list(set(depends)) - self.depends = depends + if not any( + [ + d + for d in {'python2', 'python3', ('python2', 'python3')} + if d in self.depends + ] + ): + # We ensure here that the recipe depends on python even it overrode + # `depends`. We only do this if it doesn't already depend on any + # python, since some recipes intentionally don't depend on/work + # with all python variants + depends = self.depends + depends.append(('python2', 'python3')) + depends = list(set(depends)) + self.depends = depends def clean_build(self, arch=None): super(PythonRecipe, self).clean_build(arch=arch) @@ -753,8 +776,6 @@ def real_hostpython_location(self): host_build = Recipe.get_recipe(host_name, self.ctx).get_build_dir() if host_name in ['hostpython2', 'hostpython3']: return join(host_build, 'native-build', 'python') - elif host_name in ['hostpython3crystax']: - return join(host_build, 'hostpython') else: python_recipe = self.ctx.python_recipe return 'python{}'.format(python_recipe.version) @@ -783,27 +804,16 @@ def get_recipe_env(self, arch=None, with_flags_in_cc=True): env['LANG'] = "en_GB.UTF-8" if not self.call_hostpython_via_targetpython: - # sets python headers/linkages...depending on python's recipe python_name = self.ctx.python_recipe.name - python_version = self.ctx.python_recipe.version - python_short_version = '.'.join(python_version.split('.')[:2]) - if not self.ctx.python_recipe.from_crystax: - env['CFLAGS'] += ' -I{}'.format( - self.ctx.python_recipe.include_root(arch.arch)) - env['LDFLAGS'] += ' -L{} -lpython{}'.format( - self.ctx.python_recipe.link_root(arch.arch), - self.ctx.python_recipe.major_minor_version_string) - if python_name == 'python3': - env['LDFLAGS'] += 'm' - else: - ndk_dir_python = join(self.ctx.ndk_dir, 'sources', - 'python', python_version) - env['CFLAGS'] += ' -I{} '.format( - join(ndk_dir_python, 'include', - 'python')) - env['LDFLAGS'] += ' -L{}'.format( - join(ndk_dir_python, 'libs', arch.arch)) - env['LDFLAGS'] += ' -lpython{}m'.format(python_short_version) + env['CFLAGS'] += ' -I{}'.format( + self.ctx.python_recipe.include_root(arch.arch) + ) + env['LDFLAGS'] += ' -L{} -lpython{}'.format( + self.ctx.python_recipe.link_root(arch.arch), + self.ctx.python_recipe.major_minor_version_string, + ) + if python_name == 'python3': + env['LDFLAGS'] += 'm' hppath = [] hppath.append(join(dirname(self.hostpython_location), 'Lib')) @@ -951,13 +961,6 @@ class CythonRecipe(PythonRecipe): cython_args = [] call_hostpython_via_targetpython = False - def __init__(self, *args, **kwargs): - super(CythonRecipe, self).__init__(*args, **kwargs) - depends = self.depends - depends.append(('python2', 'python3', 'python3crystax')) - depends = list(set(depends)) - self.depends = depends - def build_arch(self, arch): '''Build any cython components, then install the Python module by calling setup.py install with the target Python dir. @@ -1021,8 +1024,7 @@ def cythonize_file(self, env, build_dir, filename): del cyenv['PYTHONPATH'] if 'PYTHONNOUSERSITE' in cyenv: cyenv.pop('PYTHONNOUSERSITE') - cython = 'cython' if self.ctx.python_recipe.from_crystax else self.ctx.cython - cython_command = sh.Command(cython) + cython_command = sh.Command(self.ctx.cython) shprint(cython_command, filename, *self.cython_args, _env=cyenv) def cythonize_build(self, env, build_dir="."): @@ -1041,9 +1043,6 @@ def get_recipe_env(self, arch, with_flags_in_cc=True): ' -L{} '.format(self.ctx.libs_dir) + ' -L{}'.format(join(self.ctx.bootstrap.build_dir, 'obj', 'local', arch.arch))) - if self.ctx.python_recipe.from_crystax: - env['LDFLAGS'] = (env['LDFLAGS'] + - ' -L{}'.format(join(self.ctx.bootstrap.build_dir, 'libs', arch.arch))) env['LDSHARED'] = env['CC'] + ' -shared' # shprint(sh.whereis, env['LDSHARED'], _env=env) @@ -1059,24 +1058,6 @@ def get_recipe_env(self, arch, with_flags_in_cc=True): env['LIBLINK_PATH'] = liblink_path ensure_dir(liblink_path) - # Add crystax-specific site packages: - if self.ctx.python_recipe.from_crystax: - command = sh.Command('python{}'.format(self.ctx.python_recipe.version)) - site_packages_dirs = command( - '-c', 'import site; print("\\n".join(site.getsitepackages()))') - site_packages_dirs = site_packages_dirs.stdout.decode('utf-8').split('\n') - if 'PYTHONPATH' in env: - env['PYTHONPATH'] = env['PYTHONPATH'] +\ - ':{}'.format(':'.join(site_packages_dirs)) - else: - env['PYTHONPATH'] = ':'.join(site_packages_dirs) - while env['PYTHONPATH'].find("::") > 0: - env['PYTHONPATH'] = env['PYTHONPATH'].replace("::", ":") - if env['PYTHONPATH'].endswith(":"): - env['PYTHONPATH'] = env['PYTHONPATH'][:-1] - if env['PYTHONPATH'].startswith(":"): - env['PYTHONPATH'] = env['PYTHONPATH'][1:] - return env @@ -1084,20 +1065,12 @@ class TargetPythonRecipe(Recipe): '''Class for target python recipes. Sets ctx.python_recipe to point to itself, so as to know later what kind of Python was built or used.''' - from_crystax = False - '''True if the python is used from CrystaX, False otherwise (i.e. if - it is built by p4a).''' - def __init__(self, *args, **kwargs): self._ctx = None super(TargetPythonRecipe, self).__init__(*args, **kwargs) def prebuild_arch(self, arch): super(TargetPythonRecipe, self).prebuild_arch(arch) - if self.from_crystax and self.ctx.ndk != 'crystax': - raise BuildInterruptingException( - 'The {} recipe can only be built when ' - 'using the CrystaX NDK. Exiting.'.format(self.name)) self.ctx.python_recipe = self def include_root(self, arch): diff --git a/pythonforandroid/recipes/cymunk/__init__.py b/pythonforandroid/recipes/cymunk/__init__.py index 96d4169710..272c18f9e6 100644 --- a/pythonforandroid/recipes/cymunk/__init__.py +++ b/pythonforandroid/recipes/cymunk/__init__.py @@ -6,7 +6,5 @@ class CymunkRecipe(CythonRecipe): url = 'https://github.com/tito/cymunk/archive/{version}.zip' name = 'cymunk' - depends = [('python2', 'python3crystax', 'python3')] - recipe = CymunkRecipe() diff --git a/pythonforandroid/recipes/flask/__init__.py b/pythonforandroid/recipes/flask/__init__.py index 1a9b685256..05d59eebdf 100644 --- a/pythonforandroid/recipes/flask/__init__.py +++ b/pythonforandroid/recipes/flask/__init__.py @@ -9,7 +9,7 @@ class FlaskRecipe(PythonRecipe): version = '0.10.1' url = 'https://github.com/pallets/flask/archive/{version}.zip' - depends = [('python2', 'python3', 'python3crystax'), 'setuptools'] + depends = ['setuptools'] python_depends = ['jinja2', 'werkzeug', 'markupsafe', 'itsdangerous', 'click'] diff --git a/pythonforandroid/recipes/genericndkbuild/__init__.py b/pythonforandroid/recipes/genericndkbuild/__init__.py index d91f946c88..e6cccb6e8d 100644 --- a/pythonforandroid/recipes/genericndkbuild/__init__.py +++ b/pythonforandroid/recipes/genericndkbuild/__init__.py @@ -7,7 +7,7 @@ class GenericNDKBuildRecipe(BootstrapNDKRecipe): version = None url = None - depends = [('python2', 'python3', 'python3crystax')] + depends = [('python2', 'python3')] conflicts = ['sdl2'] def should_build(self, arch): diff --git a/pythonforandroid/recipes/hostpython2/__init__.py b/pythonforandroid/recipes/hostpython2/__init__.py index 08d45ba564..36eb178d8a 100644 --- a/pythonforandroid/recipes/hostpython2/__init__.py +++ b/pythonforandroid/recipes/hostpython2/__init__.py @@ -12,7 +12,7 @@ class Hostpython2Recipe(HostPythonRecipe): ''' version = '2.7.15' name = 'hostpython2' - conflicts = ['hostpython3', 'hostpython3crystax'] + conflicts = ['hostpython3'] recipe = Hostpython2Recipe() diff --git a/pythonforandroid/recipes/hostpython3/__init__.py b/pythonforandroid/recipes/hostpython3/__init__.py index 8b268bdd4f..a23f0b9fa2 100644 --- a/pythonforandroid/recipes/hostpython3/__init__.py +++ b/pythonforandroid/recipes/hostpython3/__init__.py @@ -11,7 +11,7 @@ class Hostpython3Recipe(HostPythonRecipe): ''' version = '3.7.1' name = 'hostpython3' - conflicts = ['hostpython2', 'hostpython3crystax'] + conflicts = ['hostpython2'] recipe = Hostpython3Recipe() diff --git a/pythonforandroid/recipes/hostpython3crystax/__init__.py b/pythonforandroid/recipes/hostpython3crystax/__init__.py deleted file mode 100644 index 88cee35938..0000000000 --- a/pythonforandroid/recipes/hostpython3crystax/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -from pythonforandroid.toolchain import Recipe, shprint -from os.path import join -import sh - - -class Hostpython3CrystaXRecipe(Recipe): - version = 'auto' # the version is taken from the python3crystax recipe - name = 'hostpython3crystax' - - conflicts = ['hostpython2'] - - def get_build_container_dir(self, arch=None): - choices = self.check_recipe_choices() - dir_name = '-'.join([self.name] + choices) - return join(self.ctx.build_dir, 'other_builds', dir_name, 'desktop') - - # def prebuild_armeabi(self): - # # Override hostpython Setup? - # shprint(sh.cp, join(self.get_recipe_dir(), 'Setup'), - # join(self.get_build_dir('armeabi'), 'Modules', 'Setup')) - - def get_build_dir(self, arch=None): - return join(self.get_build_container_dir(), self.name) - - def build_arch(self, arch): - """ - Creates expected build and symlinks system Python version. - """ - self.ctx.hostpython = '/usr/bin/false' - # creates the sub buildir (used by other recipes) - # https://github.com/kivy/python-for-android/issues/1154 - sub_build_dir = join(self.get_build_dir(), 'build') - shprint(sh.mkdir, '-p', sub_build_dir) - python3crystax = self.get_recipe('python3crystax', self.ctx) - system_python = sh.which("python" + python3crystax.version) - if system_python is None: - raise OSError( - ('Trying to use python3crystax=={} but this Python version ' - 'is not installed locally.').format(python3crystax.version)) - link_dest = join(self.get_build_dir(), 'hostpython') - shprint(sh.ln, '-sf', system_python, link_dest) - - -recipe = Hostpython3CrystaXRecipe() diff --git a/pythonforandroid/recipes/jedi/__init__.py b/pythonforandroid/recipes/jedi/__init__.py index 6338a52f24..17168e85a3 100644 --- a/pythonforandroid/recipes/jedi/__init__.py +++ b/pythonforandroid/recipes/jedi/__init__.py @@ -5,8 +5,6 @@ class JediRecipe(PythonRecipe): version = 'v0.9.0' url = 'https://github.com/davidhalter/jedi/archive/{version}.tar.gz' - depends = [('python2', 'python3crystax', 'python3')] - patches = ['fix_MergedNamesDict_get.patch'] # This apparently should be fixed in jedi 0.10 (not released to # pypi yet), but it still occurs on Android, I could not reproduce diff --git a/pythonforandroid/recipes/numpy/__init__.py b/pythonforandroid/recipes/numpy/__init__.py index 97df43524d..4e47e9d890 100644 --- a/pythonforandroid/recipes/numpy/__init__.py +++ b/pythonforandroid/recipes/numpy/__init__.py @@ -8,7 +8,6 @@ class NumpyRecipe(CompiledComponentsPythonRecipe): version = '1.16.4' url = 'https://pypi.python.org/packages/source/n/numpy/numpy-{version}.zip' site_packages_name = 'numpy' - depends = [('python2', 'python3', 'python3crystax')] patches = [ join('patches', 'add_libm_explicitly_to_build.patch'), @@ -42,10 +41,6 @@ def get_recipe_env(self, arch): py_ver = self.ctx.python_recipe.major_minor_version_string py_inc_dir = self.ctx.python_recipe.include_root(arch.arch) py_lib_dir = self.ctx.python_recipe.link_root(arch.arch) - if self.ctx.ndk == 'crystax': - src_dir = join(self.ctx.ndk_dir, 'sources') - flags += " -I{}".format(join(src_dir, 'crystax', 'include')) - flags += " -L{}".format(join(src_dir, 'crystax', 'libs', arch.arch)) flags += ' -I{}'.format(py_inc_dir) flags += ' -L{} -lpython{}'.format(py_lib_dir, py_ver) if 'python3' in self.ctx.python_recipe.name: diff --git a/pythonforandroid/recipes/openal/__init__.py b/pythonforandroid/recipes/openal/__init__.py index ad93065f4d..cfb62f6148 100644 --- a/pythonforandroid/recipes/openal/__init__.py +++ b/pythonforandroid/recipes/openal/__init__.py @@ -24,9 +24,6 @@ def build_arch(self, arch): '-DCMAKE_TOOLCHAIN_FILE={}'.format('XCompile-Android.txt'), '-DHOST={}'.format(self.ctx.toolchain_prefix) ] - if self.ctx.ndk == 'crystax': - # avoids a segfault in libcrystax when calling lrintf - cmake_args += ['-DHAVE_LRINTF=0'] shprint( sh.cmake, '.', *cmake_args, diff --git a/pythonforandroid/recipes/openssl/__init__.py b/pythonforandroid/recipes/openssl/__init__.py index 38dbaeeb42..d3033a3594 100644 --- a/pythonforandroid/recipes/openssl/__init__.py +++ b/pythonforandroid/recipes/openssl/__init__.py @@ -20,11 +20,6 @@ class OpenSSLRecipe(Recipe): using the methods: :meth:`include_flags`, :meth:`link_dirs_flags` and :meth:`link_libs_flags`. - .. note:: the python2legacy version is too old to support openssl 1.1+, so - we must use version 1.0.x. Also python3crystax is not building - successfully with openssl libs 1.1+ so we use the legacy version as - we do with python2legacy. - .. warning:: This recipe is very sensitive because is used for our core recipes, the python recipes. The used API should match with the one used in our python build, otherwise we will be unable to build the diff --git a/pythonforandroid/recipes/pysha3/__init__.py b/pythonforandroid/recipes/pysha3/__init__.py index 35cfff84a8..c171c3f662 100644 --- a/pythonforandroid/recipes/pysha3/__init__.py +++ b/pythonforandroid/recipes/pysha3/__init__.py @@ -13,16 +13,11 @@ def get_recipe_env(self, arch=None, with_flags_in_cc=True): env = super(Pysha3Recipe, self).get_recipe_env(arch, with_flags_in_cc) # CFLAGS may only be used to specify C compiler flags, for macro definitions use CPPFLAGS env['CPPFLAGS'] = env['CFLAGS'] - if self.ctx.ndk == 'crystax': - env['CPPFLAGS'] += ' -I{}/sources/python/{}/include/python/'.format( - self.ctx.ndk_dir, self.ctx.python_recipe.version[0:3]) env['CFLAGS'] = '' # LDFLAGS may only be used to specify linker flags, for libraries use LIBS - env['LDFLAGS'] = env['LDFLAGS'].replace('-lm', '').replace('-lcrystax', '') + env['LDFLAGS'] = env['LDFLAGS'].replace('-lm', '') env['LDFLAGS'] += ' -L{}'.format(os.path.join(self.ctx.bootstrap.build_dir, 'libs', arch.arch)) env['LIBS'] = ' -lm' - if self.ctx.ndk == 'crystax': - env['LIBS'] += ' -lcrystax -lpython{}m'.format(self.ctx.python_recipe.version[0:3]) env['LDSHARED'] += env['LIBS'] return env diff --git a/pythonforandroid/recipes/python2/__init__.py b/pythonforandroid/recipes/python2/__init__.py index ba1fa9a671..78e666fa2a 100644 --- a/pythonforandroid/recipes/python2/__init__.py +++ b/pythonforandroid/recipes/python2/__init__.py @@ -21,7 +21,7 @@ class Python2Recipe(GuestPythonRecipe): name = 'python2' depends = ['hostpython2'] - conflicts = ['python3crystax', 'python3'] + conflicts = ['python3'] patches = [ # new 2.7.15 patches diff --git a/pythonforandroid/recipes/python3/__init__.py b/pythonforandroid/recipes/python3/__init__.py index f22dce8e91..963fad635f 100644 --- a/pythonforandroid/recipes/python3/__init__.py +++ b/pythonforandroid/recipes/python3/__init__.py @@ -28,7 +28,7 @@ class Python3Recipe(GuestPythonRecipe): patches = patches + ["patches/remove-fix-cortex-a8.patch"] depends = ['hostpython3', 'sqlite3', 'openssl', 'libffi'] - conflicts = ['python3crystax', 'python2'] + conflicts = ['python2'] configure_args = ( '--host={android_host}', diff --git a/pythonforandroid/recipes/python3crystax/__init__.py b/pythonforandroid/recipes/python3crystax/__init__.py deleted file mode 100644 index 805be0dd12..0000000000 --- a/pythonforandroid/recipes/python3crystax/__init__.py +++ /dev/null @@ -1,102 +0,0 @@ - -from pythonforandroid.recipe import TargetPythonRecipe -from pythonforandroid.toolchain import shprint -from pythonforandroid.logger import info, error -from pythonforandroid.util import ensure_dir, temp_directory -from os.path import exists, join -import sh - -prebuilt_download_locations = { - '3.6': ('https://github.com/inclement/crystax_python_builds/' - 'releases/download/0.1/crystax_python_3.6_armeabi_armeabi-v7a.tar.gz')} - - -class Python3CrystaXRecipe(TargetPythonRecipe): - version = '3.6' - url = '' - name = 'python3crystax' - - depends = ['hostpython3crystax'] - conflicts = ['python3', 'python2'] - - from_crystax = True - - def get_dir_name(self): - name = super(Python3CrystaXRecipe, self).get_dir_name() - name += '-version{}'.format(self.version) - return name - - def build_arch(self, arch): - # We don't have to actually build anything as CrystaX comes - # with the necessary modules. They are included by modifying - # the Android.mk in the jni folder. - - # If the Python version to be used is not prebuilt with the CrystaX - # NDK, we do have to download it. - - crystax_python_dir = join(self.ctx.ndk_dir, 'sources', 'python') - if not exists(join(crystax_python_dir, self.version)): - info(('The NDK does not have a prebuilt Python {}, trying ' - 'to obtain one.').format(self.version)) - - if self.version not in prebuilt_download_locations: - error(('No prebuilt version for Python {} could be found, ' - 'the built cannot continue.')) - exit(1) - - with temp_directory() as td: - self.download_file(prebuilt_download_locations[self.version], - join(td, 'downloaded_python')) - shprint(sh.tar, 'xf', join(td, 'downloaded_python'), - '--directory', crystax_python_dir) - - if not exists(join(crystax_python_dir, self.version)): - error(('Something went wrong, the directory at {} should ' - 'have been created but does not exist.').format( - join(crystax_python_dir, self.version))) - - if not exists(join( - crystax_python_dir, self.version, 'libs', arch.arch)): - error(('The prebuilt Python for version {} does not contain ' - 'binaries for your chosen architecture "{}".').format( - self.version, arch.arch)) - exit(1) - - # TODO: We should have an option to build a new Python. This - # would also allow linking to openssl and sqlite from CrystaX. - - dirn = self.ctx.get_python_install_dir() - ensure_dir(dirn) - - # Instead of using a locally built hostpython, we use the - # user's Python for now. They must have the right version - # available. Using e.g. pyenv makes this easy. - self.ctx.hostpython = 'python{}'.format(self.version) - - def create_python_bundle(self, dirn, arch): - ndk_dir = self.ctx.ndk_dir - py_recipe = self.ctx.python_recipe - python_dir = join(ndk_dir, 'sources', 'python', - py_recipe.version, 'libs', arch.arch) - shprint(sh.cp, '-r', join(python_dir, - 'stdlib.zip'), dirn) - shprint(sh.cp, '-r', join(python_dir, - 'modules'), dirn) - shprint(sh.cp, '-r', self.ctx.get_python_install_dir(), - join(dirn, 'site-packages')) - - info('Renaming .so files to reflect cross-compile') - self.reduce_object_file_names(join(dirn, "site-packages")) - - return join(dirn, 'site-packages') - - def include_root(self, arch_name): - return join(self.ctx.ndk_dir, 'sources', 'python', self.major_minor_version_string, - 'include', 'python') - - def link_root(self, arch_name): - return join(self.ctx.ndk_dir, 'sources', 'python', self.major_minor_version_string, - 'libs', arch_name) - - -recipe = Python3CrystaXRecipe() diff --git a/pythonforandroid/recipes/secp256k1/__init__.py b/pythonforandroid/recipes/secp256k1/__init__.py index 889803100f..338c7b90c3 100644 --- a/pythonforandroid/recipes/secp256k1/__init__.py +++ b/pythonforandroid/recipes/secp256k1/__init__.py @@ -10,9 +10,14 @@ class Secp256k1Recipe(CppCompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False depends = [ - 'openssl', ('hostpython3', 'hostpython2', 'hostpython3crystax'), - ('python2', 'python3', 'python3crystax'), 'setuptools', - 'libffi', 'cffi', 'libsecp256k1'] + 'openssl', + ('hostpython3', 'hostpython2'), + ('python2', 'python3'), + 'setuptools', + 'libffi', + 'cffi', + 'libsecp256k1' + ] patches = [ "cross_compile.patch", "drop_setup_requires.patch", diff --git a/pythonforandroid/recipes/setuptools/__init__.py b/pythonforandroid/recipes/setuptools/__init__.py index 512d61a843..8e248bd874 100644 --- a/pythonforandroid/recipes/setuptools/__init__.py +++ b/pythonforandroid/recipes/setuptools/__init__.py @@ -6,7 +6,6 @@ class SetuptoolsRecipe(PythonRecipe): url = 'https://pypi.python.org/packages/source/s/setuptools/setuptools-{version}.zip' call_hostpython_via_targetpython = False install_in_hostpython = True - depends = [('python2', 'python3', 'python3crystax')] recipe = SetuptoolsRecipe() diff --git a/pythonforandroid/recipes/six/__init__.py b/pythonforandroid/recipes/six/__init__.py index 2e00432280..ca68e189f8 100644 --- a/pythonforandroid/recipes/six/__init__.py +++ b/pythonforandroid/recipes/six/__init__.py @@ -5,7 +5,7 @@ class SixRecipe(PythonRecipe): version = '1.10.0' url = 'https://pypi.python.org/packages/source/s/six/six-{version}.tar.gz' - depends = [('python2', 'python3', 'python3crystax')] + depends = ['setuptools'] recipe = SixRecipe() diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index b61c9ac54a..6cfb300763 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -982,7 +982,7 @@ def apk(self, args): gradlew = sh.Command('./gradlew') if exists('/usr/bin/dos2unix'): # .../dists/bdisttest_python3/gradlew - # .../build/bootstrap_builds/sdl2-python3crystax/gradlew + # .../build/bootstrap_builds/sdl2-python3/gradlew # if docker on windows, gradle contains CRLF output = shprint( sh.Command('dos2unix'), gradlew._path.decode('utf8'), diff --git a/testapps/setup_keyboard.py b/testapps/setup_keyboard.py index 026847764d..26499a639a 100644 --- a/testapps/setup_keyboard.py +++ b/testapps/setup_keyboard.py @@ -7,7 +7,7 @@ 'blacklist-requirements': 'openssl,sqlite3', 'android-api': 27, 'ndk-api': 21, - 'ndk-dir': '/home/asandy/android/crystax-ndk-10.3.2', + 'ndk-dir': '/home/asandy/android/android-ndk-r17c', 'dist-name': 'bdisttest', 'ndk-version': '10.3.2', 'permission': 'VIBRATE', diff --git a/testapps/setup_testapp_flask.py b/testapps/setup_testapp_flask.py index 3302e8595c..3b2536e579 100644 --- a/testapps/setup_testapp_flask.py +++ b/testapps/setup_testapp_flask.py @@ -7,7 +7,7 @@ 'blacklist-requirements': 'openssl,sqlite3', 'android-api': 27, 'ndk-api': 21, - 'ndk-dir': '/home/asandy/android/crystax-ndk-10.3.2', + 'ndk-dir': '/home/asandy/android/android-ndk-r17c', 'dist-name': 'testapp_flask', 'ndk-version': '10.3.2', 'bootstrap': 'webview', diff --git a/testapps/setup_testapp_python2.py b/testapps/setup_testapp_python2.py index 5aed64a44a..9499c80c73 100644 --- a/testapps/setup_testapp_python2.py +++ b/testapps/setup_testapp_python2.py @@ -5,7 +5,7 @@ options = {'apk': {'requirements': 'sdl2,numpy,pyjnius,kivy,python2', 'android-api': 27, 'ndk-api': 21, - 'ndk-dir': '/home/asandy/android/crystax-ndk-10.3.2', + 'ndk-dir': '/home/asandy/android/android-ndk-r17c', 'dist-name': 'bdisttest_python2', 'ndk-version': '10.3.2', 'permission': 'VIBRATE', diff --git a/testapps/setup_testapp_python2_sqlite_openssl.py b/testapps/setup_testapp_python2_sqlite_openssl.py index 18ce7c4fcd..c1dcf53efc 100644 --- a/testapps/setup_testapp_python2_sqlite_openssl.py +++ b/testapps/setup_testapp_python2_sqlite_openssl.py @@ -5,7 +5,7 @@ options = {'apk': {'requirements': 'sdl2,pyjnius,kivy,python2,openssl,requests,peewee,sqlite3', 'android-api': 27, 'ndk-api': 21, - 'ndk-dir': '/home/sandy/android/crystax-ndk-10.3.2', + 'ndk-dir': '/home/sandy/android/android-ndk-r17c', 'dist-name': 'bdisttest_python2_sqlite_openssl', 'ndk-version': '10.3.2', 'permissions': ['INTERNET', 'VIBRATE'], diff --git a/testapps/setup_testapp_python3crystax.py b/testapps/setup_testapp_python3crystax.py deleted file mode 100644 index 08ed0afa09..0000000000 --- a/testapps/setup_testapp_python3crystax.py +++ /dev/null @@ -1,30 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'requirements': 'sdl2,pyjnius,kivy,python3crystax', - 'android-api': 19, - 'ndk-api': 19, - 'ndk-dir': '/home/asandy/android/crystax-ndk-10.3.2', - 'dist-name': 'bdisttest_python3', - 'ndk-version': '10.3.2', - 'permission': 'VIBRATE', - }} - -package_data = {'': ['*.py', - '*.png'] - } - -packages = find_packages() -print('packages are', packages) - -setup( - name='testapp_python3', - version='1.1', - description='p4a setup.py test', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp': ['*.py', '*.png']} -) diff --git a/testapps/setup_vispy.py b/testapps/setup_vispy.py index a0863d0a1c..49ad47fda3 100644 --- a/testapps/setup_vispy.py +++ b/testapps/setup_vispy.py @@ -7,7 +7,7 @@ 'blacklist-requirements': 'openssl,sqlite3', 'android-api': 27, 'ndk-api': 21, - 'ndk-dir': '/home/asandy/android/crystax-ndk-10.3.2', + 'ndk-dir': '/home/asandy/android/android-ndk-r17c', 'dist-name': 'bdisttest', 'ndk-version': '10.3.2', 'permission': 'VIBRATE', diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index ad62a45b15..6f66925818 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -178,7 +178,8 @@ def test_expand_dependencies_with_pure_python_package(self): expanded_result = expand_dependencies( ["python3", "kivy", "peewee"], self.ctx ) - self.assertEqual(len(expanded_result), 3) + # we expect to have two results (one for python2 and one for python3) + self.assertEqual(len(expanded_result), 2) self.assertIsInstance(expanded_result, list) for i in expanded_result: self.assertIsInstance(i, list) diff --git a/tests/test_graph.py b/tests/test_graph.py index 0534d58290..ccade98561 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -19,14 +19,14 @@ Bootstrap.get_bootstrap('sdl2', ctx)] valid_combinations = list(product(name_sets, bootstraps)) valid_combinations.extend( - [(['python3crystax'], Bootstrap.get_bootstrap('sdl2', ctx)), - (['kivy', 'python3crystax'], Bootstrap.get_bootstrap('sdl2', ctx)), + [(['python3'], Bootstrap.get_bootstrap('sdl2', ctx)), + (['kivy', 'python3'], Bootstrap.get_bootstrap('sdl2', ctx)), (['flask'], Bootstrap.get_bootstrap('webview', ctx)), (['pysdl2'], None), # auto-detect bootstrap! important corner case ] ) invalid_combinations = [ - [['python2', 'python3crystax'], None], + [['python2', 'python3'], None], [['pysdl2', 'genericndkbuild'], None], ] invalid_combinations_simple = list(invalid_combinations) @@ -39,12 +39,11 @@ # non-tuple/non-ambiguous dependencies, e.g.: # # dependencies_1st = ["python2", "pillow"] -# dependencies_2nd = ["python3crystax", "pillow"] +# dependencies_2nd = ["python3", "pillow"] # # This however won't work: # # dependencies_1st = [("python2", "python3"), "pillow"] -# dependencies_2nd = [("python2legacy", "python3crystax"), "pillow"] # # (This is simply because the conflict checker doesn't resolve this to # keep the code ismple enough)