|
27 | 27 | RECOMMENDED_NDK_API, RECOMMENDED_TARGET_API) |
28 | 28 |
|
29 | 29 |
|
| 30 | +def get_ndk_platform_dir(ndk_dir, ndk_api, arch): |
| 31 | + ndk_platform_dir_exists = True |
| 32 | + platform_dir = arch.platform_dir |
| 33 | + ndk_platform = join( |
| 34 | + ndk_dir, |
| 35 | + 'platforms', |
| 36 | + 'android-{}'.format(ndk_api), |
| 37 | + platform_dir) |
| 38 | + if not exists(ndk_platform): |
| 39 | + warning("ndk_platform doesn't exist: {}".format(ndk_platform)) |
| 40 | + ndk_platform_dir_exists = False |
| 41 | + return ndk_platform, ndk_platform_dir_exists |
| 42 | + |
| 43 | + |
| 44 | +def get_toolchain_versions(ndk_dir, arch): |
| 45 | + toolchain_versions = [] |
| 46 | + toolchain_path_exists = True |
| 47 | + toolchain_prefix = arch.toolchain_prefix |
| 48 | + toolchain_path = join(ndk_dir, 'toolchains') |
| 49 | + if isdir(toolchain_path): |
| 50 | + toolchain_contents = glob.glob('{}/{}-*'.format(toolchain_path, |
| 51 | + toolchain_prefix)) |
| 52 | + toolchain_versions = [split(path)[-1][len(toolchain_prefix) + 1:] |
| 53 | + for path in toolchain_contents] |
| 54 | + else: |
| 55 | + warning('Could not find toolchain subdirectory!') |
| 56 | + toolchain_path_exists = False |
| 57 | + return toolchain_versions, toolchain_path_exists |
| 58 | + |
| 59 | + |
| 60 | +def get_targets(sdk_dir): |
| 61 | + if exists(join(sdk_dir, 'tools', 'bin', 'avdmanager')): |
| 62 | + avdmanager = sh.Command(join(sdk_dir, 'tools', 'bin', 'avdmanager')) |
| 63 | + targets = avdmanager('list', 'target').stdout.decode('utf-8').split('\n') |
| 64 | + elif exists(join(sdk_dir, 'tools', 'android')): |
| 65 | + android = sh.Command(join(sdk_dir, 'tools', 'android')) |
| 66 | + targets = android('list').stdout.decode('utf-8').split('\n') |
| 67 | + else: |
| 68 | + raise BuildInterruptingException( |
| 69 | + 'Could not find `android` or `sdkmanager` binaries in Android SDK', |
| 70 | + instructions='Make sure the path to the Android SDK is correct') |
| 71 | + return targets |
| 72 | + |
| 73 | + |
| 74 | +def get_available_apis(sdk_dir): |
| 75 | + targets = get_targets(sdk_dir) |
| 76 | + apis = [s for s in targets if re.match(r'^ *API level: ', s)] |
| 77 | + apis = [re.findall(r'[0-9]+', s) for s in apis] |
| 78 | + apis = [int(s[0]) for s in apis if s] |
| 79 | + return apis |
| 80 | + |
| 81 | + |
30 | 82 | class Context(object): |
31 | 83 | '''A build context. If anything will be built, an instance this class |
32 | 84 | will be instantiated and used to hold all the build state.''' |
@@ -238,20 +290,7 @@ def prepare_build_environment(self, |
238 | 290 | self.android_api = android_api |
239 | 291 |
|
240 | 292 | check_target_api(android_api, self.archs[0].arch) |
241 | | - |
242 | | - if exists(join(sdk_dir, 'tools', 'bin', 'avdmanager')): |
243 | | - avdmanager = sh.Command(join(sdk_dir, 'tools', 'bin', 'avdmanager')) |
244 | | - targets = avdmanager('list', 'target').stdout.decode('utf-8').split('\n') |
245 | | - elif exists(join(sdk_dir, 'tools', 'android')): |
246 | | - android = sh.Command(join(sdk_dir, 'tools', 'android')) |
247 | | - targets = android('list').stdout.decode('utf-8').split('\n') |
248 | | - else: |
249 | | - raise BuildInterruptingException( |
250 | | - 'Could not find `android` or `sdkmanager` binaries in Android SDK', |
251 | | - instructions='Make sure the path to the Android SDK is correct') |
252 | | - apis = [s for s in targets if re.match(r'^ *API level: ', s)] |
253 | | - apis = [re.findall(r'[0-9]+', s) for s in apis] |
254 | | - apis = [int(s[0]) for s in apis if s] |
| 293 | + apis = get_available_apis(self.sdk_dir) |
255 | 294 | info('Available Android APIs are ({})'.format( |
256 | 295 | ', '.join(map(str, apis)))) |
257 | 296 | if android_api in apis: |
@@ -340,33 +379,17 @@ def prepare_build_environment(self, |
340 | 379 |
|
341 | 380 | # This would need to be changed if supporting multiarch APKs |
342 | 381 | arch = self.archs[0] |
343 | | - platform_dir = arch.platform_dir |
344 | 382 | toolchain_prefix = arch.toolchain_prefix |
345 | | - toolchain_version = None |
346 | | - self.ndk_platform = join( |
347 | | - self.ndk_dir, |
348 | | - 'platforms', |
349 | | - 'android-{}'.format(self.ndk_api), |
350 | | - platform_dir) |
351 | | - if not exists(self.ndk_platform): |
352 | | - warning('ndk_platform doesn\'t exist: {}'.format( |
353 | | - self.ndk_platform)) |
354 | | - ok = False |
| 383 | + self.ndk_platform, ndk_platform_dir_exists = get_ndk_platform_dir( |
| 384 | + self.ndk_dir, self.ndk_api, arch) |
| 385 | + ok = ok and ndk_platform_dir_exists |
355 | 386 |
|
356 | 387 | py_platform = sys.platform |
357 | 388 | if py_platform in ['linux2', 'linux3']: |
358 | 389 | py_platform = 'linux' |
359 | | - |
360 | | - toolchain_versions = [] |
361 | | - toolchain_path = join(self.ndk_dir, 'toolchains') |
362 | | - if isdir(toolchain_path): |
363 | | - toolchain_contents = glob.glob('{}/{}-*'.format(toolchain_path, |
364 | | - toolchain_prefix)) |
365 | | - toolchain_versions = [split(path)[-1][len(toolchain_prefix) + 1:] |
366 | | - for path in toolchain_contents] |
367 | | - else: |
368 | | - warning('Could not find toolchain subdirectory!') |
369 | | - ok = False |
| 390 | + toolchain_versions, toolchain_path_exists = get_toolchain_versions( |
| 391 | + self.ndk_dir, arch) |
| 392 | + ok = ok and toolchain_path_exists |
370 | 393 | toolchain_versions.sort() |
371 | 394 |
|
372 | 395 | toolchain_versions_gcc = [] |
|
0 commit comments