aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/install-buildtools
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/install-buildtools')
-rwxr-xr-xscripts/install-buildtools103
1 files changed, 79 insertions, 24 deletions
diff --git a/scripts/install-buildtools b/scripts/install-buildtools
index 92fb1eb7d25..9da364981e5 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):