|
33 | 33 | from urllib.request import FancyURLopener |
34 | 34 | except ImportError: |
35 | 35 | from urllib import FancyURLopener |
| 36 | +from urlparse import urlparse |
36 | 37 |
|
37 | 38 | import argparse |
38 | 39 | from appdirs import user_data_dir |
@@ -833,19 +834,41 @@ def prepare_build_environment(self, user_sdk_dir, user_ndk_dir, |
833 | 834 | py_platform = 'linux' |
834 | 835 | if self.ndk_ver == 'r5b': |
835 | 836 | toolchain_prefix = 'arm-eabi' |
836 | | - toolchain_version = '4.4.0' |
837 | | - elif self.ndk_ver[:2] in ('r7', 'r8'): |
| 837 | + elif self.ndk_ver[:2] in ('r7', 'r8', 'r9'): |
838 | 838 | toolchain_prefix = 'arm-linux-androideabi' |
839 | | - toolchain_version = '4.4.3' |
840 | | - elif self.ndk_ver[:2] == 'r9': |
841 | | - toolchain_prefix = 'arm-linux-androideabi' |
842 | | - toolchain_version = '4.8' |
843 | 839 | elif self.ndk_ver[:3] == 'r10': |
844 | 840 | toolchain_prefix = 'arm-linux-androideabi' |
845 | | - toolchain_version = '4.9' |
846 | 841 | else: |
847 | 842 | warning('Error: NDK not supported by these tools?') |
848 | 843 | exit(1) |
| 844 | + |
| 845 | + toolchain_versions = [] |
| 846 | + toolchain_path = join( self.ndk_dir, 'toolchains') |
| 847 | + if os.path.isdir(toolchain_path): |
| 848 | + toolchain_contents = os.listdir(toolchain_path) |
| 849 | + for toolchain_content in toolchain_contents: |
| 850 | + if toolchain_content.startswith(toolchain_prefix) and os.path.isdir(os.path.join(toolchain_path, toolchain_content)): |
| 851 | + toolchain_version = toolchain_content[len(toolchain_prefix)+1:] |
| 852 | + debug("Found toolchain version: %s" %(toolchain_version)) |
| 853 | + toolchain_versions.append(toolchain_version) |
| 854 | + else: |
| 855 | + warning('Could not find toolchain subdirectory!') |
| 856 | + ok = False |
| 857 | + toolchain_versions.sort() |
| 858 | + |
| 859 | + toolchain_versions_gcc = [] |
| 860 | + for toolchain_version in toolchain_versions: |
| 861 | + if toolchain_version[0].isdigit(): # GCC toolchains begin with a number |
| 862 | + toolchain_versions_gcc.append(toolchain_version) |
| 863 | + |
| 864 | + if toolchain_versions: |
| 865 | + info('Found the following toolchain versions: %s' %(repr(toolchain_versions))) |
| 866 | + info('Picking the latest gcc toolchain, here %s' %(repr(toolchain_versions_gcc[-1]))) |
| 867 | + toolchain_version = toolchain_versions_gcc[-1] |
| 868 | + else: |
| 869 | + warning('Could not find any toolchain for %s!' %(toolchain_prefix)) |
| 870 | + ok = False |
| 871 | + |
849 | 872 | self.toolchain_prefix = toolchain_prefix |
850 | 873 | self.toolchain_version = toolchain_version |
851 | 874 | environ['PATH'] = ('{ndk_dir}/toolchains/{toolchain_prefix}-{toolchain_version}/' |
@@ -1341,51 +1364,76 @@ def versioned_url(self): |
1341 | 1364 | return None |
1342 | 1365 | return self.url.format(version=self.version) |
1343 | 1366 |
|
1344 | | - def download_file(self, url, filename, cwd=None): |
| 1367 | + def download_file(self, url, target, cwd=None): |
1345 | 1368 | """ |
1346 | | - (internal) Download an ``url`` to a ``filename``. |
| 1369 | + (internal) Download an ``url`` to a ``target``. |
1347 | 1370 | """ |
1348 | 1371 | if not url: |
1349 | 1372 | return |
1350 | | - def report_hook(index, blksize, size): |
1351 | | - if size <= 0: |
1352 | | - progression = '{0} bytes'.format(index * blksize) |
1353 | | - else: |
1354 | | - progression = '{0:.2f}%'.format( |
1355 | | - index * blksize * 100. / float(size)) |
1356 | | - stdout.write('- Download {}\r'.format(progression)) |
1357 | | - stdout.flush() |
| 1373 | + info('Downloading {} from {}'.format(self.name, url)) |
1358 | 1374 |
|
1359 | 1375 | if cwd: |
1360 | | - filename = join(cwd, filename) |
1361 | | - if exists(filename): |
1362 | | - unlink(filename) |
| 1376 | + target = join(cwd, target) |
1363 | 1377 |
|
1364 | | - info('Downloading {} from {}'.format(self.name, url)) |
1365 | | - urlretrieve(url, filename, report_hook) |
1366 | | - return filename |
| 1378 | + parsed_url = urlparse(url) |
| 1379 | + if parsed_url.scheme in ('http', 'https'): |
| 1380 | + def report_hook(index, blksize, size): |
| 1381 | + if size <= 0: |
| 1382 | + progression = '{0} bytes'.format(index * blksize) |
| 1383 | + else: |
| 1384 | + progression = '{0:.2f}%'.format( |
| 1385 | + index * blksize * 100. / float(size)) |
| 1386 | + stdout.write('- Download {}\r'.format(progression)) |
| 1387 | + stdout.flush() |
| 1388 | + |
| 1389 | + if exists(target): |
| 1390 | + unlink(target) |
| 1391 | + |
| 1392 | + urlretrieve(url, target, report_hook) |
| 1393 | + return target |
| 1394 | + elif parsed_url.scheme in ('git',): |
| 1395 | + if os.path.isdir(target): |
| 1396 | + with current_directory(target): |
| 1397 | + shprint(sh.git, 'pull') |
| 1398 | + shprint(sh.git, 'pull', '--recurse-submodules') |
| 1399 | + shprint(sh.git, 'submodule', 'update', '--recursive') |
| 1400 | + else: |
| 1401 | + shprint(sh.git, 'clone', '--recursive', url, target) |
| 1402 | + return target |
1367 | 1403 |
|
1368 | | - def extract_file(self, filename, cwd): |
| 1404 | + def extract_source(self, source, cwd): |
1369 | 1405 | """ |
1370 | | - (internal) Extract the `filename` into the directory `cwd`. |
| 1406 | + (internal) Extract the `source` into the directory `cwd`. |
1371 | 1407 | """ |
1372 | | - if not filename: |
| 1408 | + if not source: |
1373 | 1409 | return |
1374 | | - info("Extract {} into {}".format(filename, cwd)) |
1375 | | - if filename.endswith(".tgz") or filename.endswith(".tar.gz"): |
1376 | | - shprint(sh.tar, "-C", cwd, "-xvzf", filename) |
| 1410 | + if os.path.isfile(source): |
| 1411 | + info("Extract {} into {}".format(source, cwd)) |
| 1412 | + |
| 1413 | + if source.endswith(".tgz") or source.endswith(".tar.gz"): |
| 1414 | + shprint(sh.tar, "-C", cwd, "-xvzf", source) |
| 1415 | + |
| 1416 | + elif source.endswith(".tbz2") or source.endswith(".tar.bz2"): |
| 1417 | + shprint(sh.tar, "-C", cwd, "-xvjf", source) |
| 1418 | + |
| 1419 | + elif source.endswith(".zip"): |
| 1420 | + zf = zipfile.ZipFile(source) |
| 1421 | + zf.extractall(path=cwd) |
| 1422 | + zf.close() |
| 1423 | + |
| 1424 | + else: |
| 1425 | + warning("Error: cannot extract, unrecognized extension for {}".format( |
| 1426 | + source)) |
| 1427 | + raise Exception() |
1377 | 1428 |
|
1378 | | - elif filename.endswith(".tbz2") or filename.endswith(".tar.bz2"): |
1379 | | - shprint(sh.tar, "-C", cwd, "-xvjf", filename) |
| 1429 | + elif os.path.isdir(source): |
| 1430 | + info("Copying {} into {}".format(source, cwd)) |
1380 | 1431 |
|
1381 | | - elif filename.endswith(".zip"): |
1382 | | - zf = zipfile.ZipFile(filename) |
1383 | | - zf.extractall(path=cwd) |
1384 | | - zf.close() |
| 1432 | + shprint(sh.cp, '-a', source, cwd) |
1385 | 1433 |
|
1386 | 1434 | else: |
1387 | | - warning("Error: cannot extract, unrecognized extension for {}".format( |
1388 | | - filename)) |
| 1435 | + warning("Error: cannot extract or copy, unrecognized path {}".format( |
| 1436 | + source)) |
1389 | 1437 | raise Exception() |
1390 | 1438 |
|
1391 | 1439 | # def get_archive_rootdir(self, filename): |
@@ -1545,7 +1593,7 @@ def download(self): |
1545 | 1593 | do_download = True |
1546 | 1594 |
|
1547 | 1595 | marker_filename = '.mark-{}'.format(filename) |
1548 | | - if exists(filename): |
| 1596 | + if exists(filename) and os.path.isfile(filename): |
1549 | 1597 | if not exists(marker_filename): |
1550 | 1598 | shprint(sh.rm, filename) |
1551 | 1599 | elif self.md5sum: |
@@ -1609,32 +1657,40 @@ def unpack(self, arch): |
1609 | 1657 | # AND: Could use tito's get_archive_rootdir here |
1610 | 1658 | if not exists(directory_name) or not isdir(directory_name): |
1611 | 1659 | extraction_filename = join(self.ctx.packages_path, self.name, filename) |
1612 | | - if (extraction_filename.endswith('.tar.gz') or |
1613 | | - extraction_filename.endswith('.tgz')): |
1614 | | - sh.tar('xzf', extraction_filename) |
1615 | | - root_directory = shprint( |
1616 | | - sh.tar, 'tzf', extraction_filename).stdout.decode( |
1617 | | - 'utf-8').split('\n')[0].strip('/') |
1618 | | - if root_directory != directory_name: |
1619 | | - shprint(sh.mv, root_directory, directory_name) |
1620 | | - elif (extraction_filename.endswith('.tar.bz2') or |
1621 | | - extraction_filename.endswith('.tbz2')): |
1622 | | - info('Extracting {} at {}'.format(extraction_filename, filename)) |
1623 | | - sh.tar('xjf', extraction_filename) |
1624 | | - root_directory = sh.tar('tjf', extraction_filename).stdout.decode( |
1625 | | - 'utf-8').split('\n')[0].strip('/') |
1626 | | - if root_directory != directory_name: |
1627 | | - shprint(sh.mv, root_directory, directory_name) |
1628 | | - elif extraction_filename.endswith('.zip'): |
1629 | | - sh.unzip(extraction_filename) |
1630 | | - import zipfile |
1631 | | - fileh = zipfile.ZipFile(extraction_filename, 'r') |
1632 | | - root_directory = fileh.filelist[0].filename.strip('/') |
1633 | | - if root_directory != directory_name: |
1634 | | - shprint(sh.mv, root_directory, directory_name) |
| 1660 | + if os.path.isfile(extraction_filename): |
| 1661 | + if (extraction_filename.endswith('.tar.gz') or |
| 1662 | + extraction_filename.endswith('.tgz')): |
| 1663 | + sh.tar('xzf', extraction_filename) |
| 1664 | + root_directory = shprint( |
| 1665 | + sh.tar, 'tzf', extraction_filename).stdout.decode( |
| 1666 | + 'utf-8').split('\n')[0].strip('/') |
| 1667 | + if root_directory != directory_name: |
| 1668 | + shprint(sh.mv, root_directory, directory_name) |
| 1669 | + elif (extraction_filename.endswith('.tar.bz2') or |
| 1670 | + extraction_filename.endswith('.tbz2')): |
| 1671 | + info('Extracting {} at {}'.format(extraction_filename, filename)) |
| 1672 | + sh.tar('xjf', extraction_filename) |
| 1673 | + root_directory = sh.tar('tjf', extraction_filename).stdout.decode( |
| 1674 | + 'utf-8').split('\n')[0].strip('/') |
| 1675 | + if root_directory != directory_name: |
| 1676 | + shprint(sh.mv, root_directory, directory_name) |
| 1677 | + elif extraction_filename.endswith('.zip'): |
| 1678 | + sh.unzip(extraction_filename) |
| 1679 | + import zipfile |
| 1680 | + fileh = zipfile.ZipFile(extraction_filename, 'r') |
| 1681 | + root_directory = fileh.filelist[0].filename.strip('/') |
| 1682 | + if root_directory != directory_name: |
| 1683 | + shprint(sh.mv, root_directory, directory_name) |
| 1684 | + else: |
| 1685 | + raise Exception('Could not extract {} download, it must be .zip, ' |
| 1686 | + '.tar.gz or .tar.bz2') |
| 1687 | + elif os.path.isdir(extraction_filename): |
| 1688 | + os.mkdir(directory_name) |
| 1689 | + for entry in os.listdir(extraction_filename): |
| 1690 | + if entry not in ('.git',): |
| 1691 | + shprint(sh.cp, '-Rv', os.path.join(extraction_filename, entry), directory_name) |
1635 | 1692 | else: |
1636 | | - raise Exception('Could not extract {} download, it must be .zip, ' |
1637 | | - '.tar.gz or .tar.bz2') |
| 1693 | + raise Exception('Given path is neither a file nor a directory: {}'.format(extraction_filename)) |
1638 | 1694 |
|
1639 | 1695 | else: |
1640 | 1696 | info('{} is already unpacked, skipping'.format(self.name)) |
|
0 commit comments