|
6 | 6 | This module defines the entry point for command line and programmatic use.
|
7 | 7 | """
|
8 | 8 |
|
| 9 | +from appdirs import user_data_dir |
| 10 | +import argparse |
| 11 | +from functools import wraps |
| 12 | +import glob |
| 13 | +import logging |
| 14 | +import os |
9 | 15 | from os import environ
|
10 |
| -from pythonforandroid import __version__ |
11 |
| -from pythonforandroid.pythonpackage import get_dep_names_of_package |
12 |
| -from pythonforandroid.recommendations import ( |
13 |
| - RECOMMENDED_NDK_API, RECOMMENDED_TARGET_API, print_recommendations) |
14 |
| -from pythonforandroid.util import BuildInterruptingException, load_source |
15 |
| -from pythonforandroid.entrypoints import main |
16 |
| -from pythonforandroid.prerequisites import check_and_install_default_prerequisites |
17 |
| - |
18 |
| - |
19 |
| -def check_python_dependencies(): |
20 |
| - # Check if the Python requirements are installed. This appears |
21 |
| - # before the imports because otherwise they're imported elsewhere. |
22 |
| - |
23 |
| - # Using the ok check instead of failing immediately so that all |
24 |
| - # errors are printed at once |
25 |
| - |
26 |
| - from distutils.version import LooseVersion |
27 |
| - from importlib import import_module |
28 |
| - import sys |
29 |
| - |
30 |
| - ok = True |
31 |
| - |
32 |
| - modules = [('colorama', '0.3.3'), 'appdirs', ('sh', '1.10'), 'jinja2'] |
33 |
| - |
34 |
| - for module in modules: |
35 |
| - if isinstance(module, tuple): |
36 |
| - module, version = module |
37 |
| - else: |
38 |
| - version = None |
39 |
| - |
40 |
| - try: |
41 |
| - import_module(module) |
42 |
| - except ImportError: |
43 |
| - if version is None: |
44 |
| - print('ERROR: The {} Python module could not be found, please ' |
45 |
| - 'install it.'.format(module)) |
46 |
| - ok = False |
47 |
| - else: |
48 |
| - print('ERROR: The {} Python module could not be found, ' |
49 |
| - 'please install version {} or higher'.format( |
50 |
| - module, version)) |
51 |
| - ok = False |
52 |
| - else: |
53 |
| - if version is None: |
54 |
| - continue |
55 |
| - try: |
56 |
| - cur_ver = sys.modules[module].__version__ |
57 |
| - except AttributeError: # this is sometimes not available |
58 |
| - continue |
59 |
| - if LooseVersion(cur_ver) < LooseVersion(version): |
60 |
| - print('ERROR: {} version is {}, but python-for-android needs ' |
61 |
| - 'at least {}.'.format(module, cur_ver, version)) |
62 |
| - ok = False |
63 |
| - |
64 |
| - if not ok: |
65 |
| - print('python-for-android is exiting due to the errors logged above') |
66 |
| - exit(1) |
67 |
| - |
68 |
| - |
69 |
| -if not environ.get('SKIP_PREREQUISITES_CHECK', '0') == '1': |
70 |
| - check_and_install_default_prerequisites() |
71 |
| -check_python_dependencies() |
72 |
| - |
73 |
| - |
74 |
| -import sys |
75 |
| -from sys import platform |
76 | 16 | from os.path import (join, dirname, realpath, exists, expanduser, basename)
|
77 |
| -import os |
78 |
| -import glob |
79 |
| -import shutil |
80 | 17 | import re
|
81 | 18 | import shlex
|
82 |
| -from functools import wraps |
| 19 | +import shutil |
| 20 | +import sys |
| 21 | +from sys import platform |
83 | 22 |
|
84 |
| -import argparse |
| 23 | +# This must be imported and run before other third-party or p4a |
| 24 | +# packages. |
| 25 | +from pythonforandroid.checkdependencies import check |
| 26 | +check() |
| 27 | + |
| 28 | +from packaging.version import Version, InvalidVersion |
85 | 29 | import sh
|
86 |
| -from appdirs import user_data_dir |
87 |
| -import logging |
88 |
| -from distutils.version import LooseVersion |
89 | 30 |
|
90 |
| -from pythonforandroid.recipe import Recipe |
91 |
| -from pythonforandroid.logger import (logger, info, warning, setup_color, |
92 |
| - Out_Style, Out_Fore, |
93 |
| - info_notify, info_main, shprint) |
94 |
| -from pythonforandroid.util import current_directory |
| 31 | +from pythonforandroid import __version__ |
95 | 32 | from pythonforandroid.bootstrap import Bootstrap
|
| 33 | +from pythonforandroid.build import Context, build_recipes |
96 | 34 | from pythonforandroid.distribution import Distribution, pretty_log_dists
|
| 35 | +from pythonforandroid.entrypoints import main |
97 | 36 | from pythonforandroid.graph import get_recipe_order_and_bootstrap
|
98 |
| -from pythonforandroid.build import Context, build_recipes |
| 37 | +from pythonforandroid.logger import (logger, info, warning, setup_color, |
| 38 | + Out_Style, Out_Fore, |
| 39 | + info_notify, info_main, shprint) |
| 40 | +from pythonforandroid.pythonpackage import get_dep_names_of_package |
| 41 | +from pythonforandroid.recipe import Recipe |
| 42 | +from pythonforandroid.recommendations import ( |
| 43 | + RECOMMENDED_NDK_API, RECOMMENDED_TARGET_API, print_recommendations) |
| 44 | +from pythonforandroid.util import ( |
| 45 | + current_directory, BuildInterruptingException, load_source) |
99 | 46 |
|
100 | 47 | user_dir = dirname(realpath(os.path.curdir))
|
101 | 48 | toolchain_dir = dirname(__file__)
|
@@ -1068,13 +1015,22 @@ def _build_package(self, args, package_type):
|
1068 | 1015 | self.hook("before_apk_assemble")
|
1069 | 1016 | build_tools_versions = os.listdir(join(ctx.sdk_dir,
|
1070 | 1017 | 'build-tools'))
|
1071 |
| - build_tools_versions = sorted(build_tools_versions, |
1072 |
| - key=LooseVersion) |
| 1018 | + |
| 1019 | + def sort_key(version_text): |
| 1020 | + try: |
| 1021 | + # Historically, Android build release candidates have had |
| 1022 | + # spaces in the version number. |
| 1023 | + return Version(version_text.replace(" ", "")) |
| 1024 | + except InvalidVersion: |
| 1025 | + # Put badly named versions at worst position. |
| 1026 | + return Version("0") |
| 1027 | + |
| 1028 | + build_tools_versions.sort(key=sort_key) |
1073 | 1029 | build_tools_version = build_tools_versions[-1]
|
1074 | 1030 | info(('Detected highest available build tools '
|
1075 | 1031 | 'version to be {}').format(build_tools_version))
|
1076 | 1032 |
|
1077 |
| - if build_tools_version < '25.0': |
| 1033 | + if Version(build_tools_version.replace(" ", "")) < Version('25.0'): |
1078 | 1034 | raise BuildInterruptingException(
|
1079 | 1035 | 'build_tools >= 25 is required, but %s is installed' % build_tools_version)
|
1080 | 1036 | if not exists("gradlew"):
|
|
0 commit comments