diff options
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/install-buildtools | 103 |
1 files changed, 79 insertions, 24 deletions
diff --git a/scripts/install-buildtools b/scripts/install-buildtools index 92fb1eb7d2..9da364981e 100755 --- a/scripts/install-buildtools +++ b/scripts/install-buildtools @@ -4,7 +4,7 @@ # # Copyright (C) 2017-2020 Intel Corporation # -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: GPL-2.0-only # # NOTE: --with-extended-buildtools is on by default # @@ -37,6 +37,7 @@ import logging import os import re import shutil +import shlex import stat import subprocess import sys @@ -49,21 +50,56 @@ sys.path = sys.path + [lib_path] import scriptutils import scriptpath -# Figure out where is the bitbake/lib/bb since we need bb.utils.md5_file -bitbakepath = scriptpath.add_bitbake_lib_path() -if not bitbakepath: - sys.stderr.write("Unable to find bitbake by searching parent directory " - "of this script or PATH\n") - sys.exit(1) PROGNAME = 'install-buildtools' logger = scriptutils.logger_create(PROGNAME, stream=sys.stdout) -DEFAULT_INSTALL_DIR: str = os.path.join(os.path.split(scripts_path)[0],'buildtools') -DEFAULT_BASE_URL: str = 'http://downloads.yoctoproject.org/releases/yocto' -DEFAULT_RELEASE: str = 'yocto-3.1_M3' -DEFAULT_INSTALLER_VERSION: str = '3.0+snapshot' -DEFAULT_BUILDDATE: str = "20200315" +DEFAULT_INSTALL_DIR = os.path.join(os.path.split(scripts_path)[0],'buildtools') +DEFAULT_BASE_URL = 'http://downloads.yoctoproject.org/releases/yocto' +DEFAULT_RELEASE = 'yocto-3.1_M3' +DEFAULT_INSTALLER_VERSION = '3.0+snapshot' +DEFAULT_BUILDDATE = "20200315" + +# Python version sanity check +if not (sys.version_info.major == 3 and sys.version_info.minor >= 4): + logger.error("This script requires Python 3.4 or greater") + logger.error("You have Python %s.%s" % + (sys.version_info.major, sys.version_info.minor)) + sys.exit(1) + +# The following three functions are copied directly from +# bitbake/lib/bb/utils.py, in order to allow this script +# to run on versions of python earlier than what bitbake +# supports (e.g. less than Python 3.5 for YP 3.1 release) + +def _hasher(method, filename): + import mmap + + with open(filename, "rb") as f: + try: + with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm: + for chunk in iter(lambda: mm.read(8192), b''): + method.update(chunk) + except ValueError: + # You can't mmap() an empty file so silence this exception + pass + return method.hexdigest() + + +def md5_file(filename): + """ + Return the hex string representation of the MD5 checksum of filename. + """ + import hashlib + return _hasher(hashlib.md5(), filename) + +def sha256_file(filename): + """ + Return the hex string representation of the 256-bit SHA checksum of + filename. + """ + import hashlib + return _hasher(hashlib.sha256(), filename) def main(): @@ -72,10 +108,10 @@ def main(): global DEFAULT_RELEASE global DEFAULT_INSTALLER_VERSION global DEFAULT_BUILDDATE - filename: str = "" - release: str = "" - buildtools_url: str = "" - install_dir: str = "" + filename = "" + release = "" + buildtools_url = "" + install_dir = "" parser = argparse.ArgumentParser( description="Buildtools installation helper", @@ -187,10 +223,9 @@ def main(): # Verify checksum if args.check: - import bb logger.info("Fetching buildtools installer checksum") checksum_type = "" - for checksum_type in ["md5sum", "sha256"]: + for checksum_type in ["md5sum", "sha256"]: check_url = "{}.{}".format(buildtools_url, checksum_type) checksum_filename = "{}.{}".format(filename, checksum_type) tmpbuildtools_checksum = os.path.join(tmpsdk_dir, checksum_filename) @@ -215,9 +250,9 @@ def main(): return 1 checksum = m.group('checksum') if checksum_type == "md5sum": - checksum_value = bb.utils.md5_file(tmpbuildtools) + checksum_value = md5_file(tmpbuildtools) else: - checksum_value = bb.utils.sha256_file(tmpbuildtools) + checksum_value = sha256_file(tmpbuildtools) if checksum == checksum_value: logger.info("Checksum success") else: @@ -239,6 +274,21 @@ def main(): if ret != 0: logger.error("Could not run buildtools installer") + # Setup the environment + logger.info("Setting up the environment") + regex = re.compile(r'^(?P<export>export )?(?P<env_var>[A-Z_]+)=(?P<env_val>.+)$') + with open("%s/environment-setup-x86_64-pokysdk-linux" % + install_dir, 'rb') as f: + for line in f: + match = regex.search(line.decode('utf-8')) + logger.debug("export regex: %s" % match) + if match: + env_var = match.group('env_var') + logger.debug("env_var: %s" % env_var) + env_val = match.group('env_val') + logger.debug("env_val: %s" % env_val) + os.environ[env_var] = env_val + # Test installation logger.info("Testing installation") tool = "" @@ -252,10 +302,15 @@ def main(): else: tool = 'tar' logger.debug("install_dir: %s" % install_dir) - proc = subprocess.run(". %s/environment-setup-x86_64-pokysdk-linux && which %s" % - (install_dir, tool), - shell=True, stdout=subprocess.PIPE) - which_tool = proc.stdout.decode("utf-8") + cmd = shlex.split("/usr/bin/which %s" % tool) + logger.debug("cmd: %s" % cmd) + logger.debug("tool: %s" % tool) + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) + output, errors = proc.communicate() + logger.debug("proc.args: %s" % proc.args) + logger.debug("proc.communicate(): output %s" % output) + logger.debug("proc.communicate(): errors %s" % errors) + which_tool = output.decode('utf-8') logger.debug("which %s: %s" % (tool, which_tool)) ret = proc.returncode if not which_tool.startswith(install_dir): |