Skip to content

Commit a1d64cf

Browse files
committed
Improved NDK dir and ver checks
1 parent 15e51f0 commit a1d64cf

File tree

1 file changed

+79
-21
lines changed

1 file changed

+79
-21
lines changed

pythonforandroid/toolchain.py

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def wrapper_func(self, args):
131131
ctx.prepare_build_environment(user_sdk_dir=self.sdk_dir,
132132
user_ndk_dir=self.ndk_dir,
133133
user_android_api=self.android_api,
134-
user_ndk_version=self.ndk_version)
134+
user_ndk_ver=self.ndk_version)
135135
dist = self._dist
136136
if dist.needs_build:
137137
info('No dist exists that meets your requirements, so one will '
@@ -543,7 +543,7 @@ def ndk_dir(self, value):
543543
self._ndk_dir = value
544544

545545
def prepare_build_environment(self, user_sdk_dir, user_ndk_dir,
546-
user_android_api, user_ndk_version):
546+
user_android_api, user_ndk_ver):
547547
'''Checks that build dependencies exist and sets internal variables
548548
for the Android SDK etc.
549549
@@ -559,10 +559,10 @@ def prepare_build_environment(self, user_sdk_dir, user_ndk_dir,
559559
sdk_dir = None
560560
if user_sdk_dir:
561561
sdk_dir = user_sdk_dir
562-
if sdk_dir is None:
562+
if sdk_dir is None: # This is the old P4A-specific var
563563
sdk_dir = environ.get('ANDROIDSDK', None)
564-
if sdk_dir is None:
565-
sdk_dir = environ.get('ANDROID_HOME', None)
564+
if sdk_dir is None: # This seems used more conventionally
565+
sdk_dir = environ.get('ANDROID_HOME', None)
566566
if sdk_dir is None:
567567
warning('Android SDK dir was not specified, exiting.')
568568
exit(1)
@@ -600,23 +600,81 @@ def prepare_build_environment(self, user_sdk_dir, user_ndk_dir,
600600
# AND: If the android api target doesn't exist, we should
601601
# offer to install it here
602602

603-
# AND: We should check for ndk-build and ant?
604-
self.ndk_ver = environ.get('ANDROIDNDKVER', 'r9')
605-
if self.sdk_dir is None:
606-
ok = False
607-
self.ndk_dir = environ.get('ANDROIDNDK', None)
608-
if self.ndk_dir is None:
609-
ok = False
603+
604+
# Find the Android NDK
605+
# Could also use ANDROID_NDK, but doesn't look like many tools use this
606+
ndk_dir = None
607+
if user_ndk_dir:
608+
ndk_dir = user_ndk_dir
609+
if ndk_dir is not None:
610+
info('Getting NDK dir from from user argument')
611+
if ndk_dir is None: # The old P4A-specific dir
612+
ndk_dir = environ.get('ANDROIDNDK', None)
613+
if ndk_dir is not None:
614+
info('Found NDK dir in $ANDROIDNDK')
615+
if ndk_dir is None: # Apparently the most common convention
616+
ndk_dir = environ.get('NDK_HOME', None)
617+
if ndk_dir is not None:
618+
info('Found NDK dir in $NDK_HOME')
619+
if ndk_dir is None: # Another convention (with maven?)
620+
ndk_dir = environ.get('ANDROID_NDK_HOME', None)
621+
if ndk_dir is not None:
622+
info('Found NDK dir in $ANDROID_NDK_HOME')
623+
if ndk_dir is None:
624+
warning('Android NDK dir was not specified, exiting.')
625+
exit(1)
626+
self.ndk_dir = ndk_dir
627+
628+
629+
# Find the NDK version, and check it against what the NDK dir
630+
# seems to report
631+
ndk_ver = None
632+
if user_ndk_ver:
633+
ndk_ver = user_ndk_ver
634+
if ndk_dir is not None:
635+
info('Got NDK version from from user argument')
636+
if ndk_ver is None:
637+
ndk_ver = environ.get('ANDROIDNDKVER', None)
638+
if ndk_dir is not None:
639+
info('Got NDK version from $ANDROIDNDKVER')
640+
641+
try:
642+
with open(join(ndk_dir, 'RELEASE.TXT')) as fileh:
643+
reported_ndk_ver = fileh.read().split(' ')[0]
644+
except IOError:
645+
pass
610646
else:
611-
self.ndk_platform = join(
612-
self.ndk_dir,
613-
'platforms',
614-
'android-{}'.format(self.android_api),
615-
'arch-arm')
616-
print('ndk platform', self.ndk_platform)
617-
if not exists(self.ndk_platform):
618-
warning('ndk_platform doesn\'t exist')
619-
ok = False
647+
if ndk_ver is None:
648+
ndk_ver = reported_ndk_ver
649+
info('Got Android NDK version from the NDK dir: it is {}'.format(ndk_ver))
650+
else:
651+
if ndk_ver != reported_ndk_ver:
652+
warning('NDK version was set as {}, but checking '
653+
'the NDK dir claims it is {}.'.format(
654+
ndk_ver, reported_ndk_ver))
655+
warning('The build will try to continue, but it may '
656+
'fail and you should check '
657+
'that your setting is correct.')
658+
warning('If the NDK dir result is correct, you don\'t '
659+
'need to manually set the NDK ver.')
660+
if ndk_ver is None:
661+
warning('Android NDK version could not be found, exiting.')
662+
663+
exit(1)
664+
665+
666+
667+
668+
669+
self.ndk_platform = join(
670+
self.ndk_dir,
671+
'platforms',
672+
'android-{}'.format(self.android_api),
673+
'arch-arm')
674+
print('ndk platform', self.ndk_platform)
675+
if not exists(self.ndk_platform):
676+
warning('ndk_platform doesn\'t exist')
677+
ok = False
620678

621679
virtualenv = None
622680
if virtualenv is None:

0 commit comments

Comments
 (0)