summaryrefslogtreecommitdiffstats
path: root/scripts/install-buildtools
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/install-buildtools')
-rwxr-xr-xscripts/install-buildtools83
1 files changed, 54 insertions, 29 deletions
diff --git a/scripts/install-buildtools b/scripts/install-buildtools
index 8554a5db67..aa23942858 100755
--- a/scripts/install-buildtools
+++ b/scripts/install-buildtools
@@ -56,10 +56,10 @@ PROGNAME = 'install-buildtools'
56logger = scriptutils.logger_create(PROGNAME, stream=sys.stdout) 56logger = scriptutils.logger_create(PROGNAME, stream=sys.stdout)
57 57
58DEFAULT_INSTALL_DIR = os.path.join(os.path.split(scripts_path)[0],'buildtools') 58DEFAULT_INSTALL_DIR = os.path.join(os.path.split(scripts_path)[0],'buildtools')
59DEFAULT_BASE_URL = 'http://downloads.yoctoproject.org/releases/yocto' 59DEFAULT_BASE_URL = 'https://downloads.yoctoproject.org/releases/yocto'
60DEFAULT_RELEASE = 'yocto-3.2_M3' 60DEFAULT_RELEASE = 'yocto-5.2.1'
61DEFAULT_INSTALLER_VERSION = '3.1+snapshot' 61DEFAULT_INSTALLER_VERSION = '5.2.1'
62DEFAULT_BUILDDATE = '20200923' 62DEFAULT_BUILDDATE = '202110XX'
63 63
64# Python version sanity check 64# Python version sanity check
65if not (sys.version_info.major == 3 and sys.version_info.minor >= 4): 65if not (sys.version_info.major == 3 and sys.version_info.minor >= 4):
@@ -102,6 +102,16 @@ def sha256_file(filename):
102 import hashlib 102 import hashlib
103 return _hasher(hashlib.sha256(), filename) 103 return _hasher(hashlib.sha256(), filename)
104 104
105def remove_quotes(var):
106 """
107 If a variable starts and ends with double quotes, remove them.
108 Assumption: if a variable starts with double quotes, it must also
109 end with them.
110 """
111 if var[0] == '"':
112 var = var[1:-1]
113 return var
114
105 115
106def main(): 116def main():
107 global DEFAULT_INSTALL_DIR 117 global DEFAULT_INSTALL_DIR
@@ -117,7 +127,8 @@ def main():
117 127
118 parser = argparse.ArgumentParser( 128 parser = argparse.ArgumentParser(
119 description="Buildtools installation helper", 129 description="Buildtools installation helper",
120 add_help=False) 130 add_help=False,
131 formatter_class=argparse.RawTextHelpFormatter)
121 parser.add_argument('-u', '--url', 132 parser.add_argument('-u', '--url',
122 help='URL from where to fetch buildtools SDK installer, not ' 133 help='URL from where to fetch buildtools SDK installer, not '
123 'including filename (optional)\n' 134 'including filename (optional)\n'
@@ -131,6 +142,9 @@ def main():
131 default=DEFAULT_INSTALL_DIR, 142 default=DEFAULT_INSTALL_DIR,
132 help='directory where buildtools SDK will be installed (optional)', 143 help='directory where buildtools SDK will be installed (optional)',
133 action='store') 144 action='store')
145 parser.add_argument('--downloads-directory',
146 help='use this directory for tarball/checksum downloads and do not erase them (default is a temporary directory which is deleted after unpacking and installing the buildtools)',
147 action='store')
134 parser.add_argument('-r', '--release', 148 parser.add_argument('-r', '--release',
135 default=DEFAULT_RELEASE, 149 default=DEFAULT_RELEASE,
136 help='Yocto Project release string for SDK which will be ' 150 help='Yocto Project release string for SDK which will be '
@@ -154,6 +168,8 @@ def main():
154 group.add_argument('--without-extended-buildtools', action='store_false', 168 group.add_argument('--without-extended-buildtools', action='store_false',
155 dest='with_extended_buildtools', 169 dest='with_extended_buildtools',
156 help='disable extended buildtools (traditional buildtools tarball)') 170 help='disable extended buildtools (traditional buildtools tarball)')
171 group.add_argument('--make-only', action='store_true',
172 help='only install make tarball')
157 group = parser.add_mutually_exclusive_group() 173 group = parser.add_mutually_exclusive_group()
158 group.add_argument('-c', '--check', help='enable checksum validation', 174 group.add_argument('-c', '--check', help='enable checksum validation',
159 default=True, action='store_true') 175 default=True, action='store_true')
@@ -170,6 +186,9 @@ def main():
170 186
171 args = parser.parse_args() 187 args = parser.parse_args()
172 188
189 if args.make_only:
190 args.with_extended_buildtools = False
191
173 if args.debug: 192 if args.debug:
174 logger.setLevel(logging.DEBUG) 193 logger.setLevel(logging.DEBUG)
175 elif args.quiet: 194 elif args.quiet:
@@ -197,7 +216,10 @@ def main():
197 if not args.build_date: 216 if not args.build_date:
198 logger.error("Milestone installers require --build-date") 217 logger.error("Milestone installers require --build-date")
199 else: 218 else:
200 if args.with_extended_buildtools: 219 if args.make_only:
220 filename = "%s-buildtools-make-nativesdk-standalone-%s-%s.sh" % (
221 arch, args.installer_version, args.build_date)
222 elif args.with_extended_buildtools:
201 filename = "%s-buildtools-extended-nativesdk-standalone-%s-%s.sh" % ( 223 filename = "%s-buildtools-extended-nativesdk-standalone-%s-%s.sh" % (
202 arch, args.installer_version, args.build_date) 224 arch, args.installer_version, args.build_date)
203 else: 225 else:
@@ -207,6 +229,8 @@ def main():
207 buildtools_url = "%s/milestones/%s/buildtools/%s" % (base_url, args.release, safe_filename) 229 buildtools_url = "%s/milestones/%s/buildtools/%s" % (base_url, args.release, safe_filename)
208 # regular release SDK 230 # regular release SDK
209 else: 231 else:
232 if args.make_only:
233 filename = "%s-buildtools-make-nativesdk-standalone-%s.sh" % (arch, args.installer_version)
210 if args.with_extended_buildtools: 234 if args.with_extended_buildtools:
211 filename = "%s-buildtools-extended-nativesdk-standalone-%s.sh" % (arch, args.installer_version) 235 filename = "%s-buildtools-extended-nativesdk-standalone-%s.sh" % (arch, args.installer_version)
212 else: 236 else:
@@ -214,11 +238,14 @@ def main():
214 safe_filename = quote(filename) 238 safe_filename = quote(filename)
215 buildtools_url = "%s/%s/buildtools/%s" % (base_url, args.release, safe_filename) 239 buildtools_url = "%s/%s/buildtools/%s" % (base_url, args.release, safe_filename)
216 240
217 tmpsdk_dir = tempfile.mkdtemp() 241 sdk_dir = args.downloads_directory or tempfile.mkdtemp()
242 os.makedirs(sdk_dir, exist_ok=True)
218 try: 243 try:
219 # Fetch installer 244 # Fetch installer
220 logger.info("Fetching buildtools installer") 245 logger.info("Fetching buildtools installer")
221 tmpbuildtools = os.path.join(tmpsdk_dir, filename) 246 tmpbuildtools = os.path.join(sdk_dir, filename)
247 with open(os.path.join(sdk_dir, 'buildtools_url'), 'w') as f:
248 f.write(buildtools_url)
222 ret = subprocess.call("wget -q -O %s %s" % 249 ret = subprocess.call("wget -q -O %s %s" %
223 (tmpbuildtools, buildtools_url), shell=True) 250 (tmpbuildtools, buildtools_url), shell=True)
224 if ret != 0: 251 if ret != 0:
@@ -228,19 +255,17 @@ def main():
228 # Verify checksum 255 # Verify checksum
229 if args.check: 256 if args.check:
230 logger.info("Fetching buildtools installer checksum") 257 logger.info("Fetching buildtools installer checksum")
231 checksum_type = "" 258 checksum_type = "sha256sum"
232 for checksum_type in ["md5sum", "sha256sum"]: 259 checksum_url = "{}.{}".format(buildtools_url, checksum_type)
233 check_url = "{}.{}".format(buildtools_url, checksum_type) 260 checksum_filename = "{}.{}".format(filename, checksum_type)
234 checksum_filename = "{}.{}".format(filename, checksum_type) 261 tmpbuildtools_checksum = os.path.join(sdk_dir, checksum_filename)
235 tmpbuildtools_checksum = os.path.join(tmpsdk_dir, checksum_filename) 262 with open(os.path.join(sdk_dir, 'checksum_url'), 'w') as f:
236 ret = subprocess.call("wget -q -O %s %s" % 263 f.write(checksum_url)
237 (tmpbuildtools_checksum, check_url), shell=True) 264 ret = subprocess.call("wget -q -O %s %s" %
238 if ret == 0: 265 (tmpbuildtools_checksum, checksum_url), shell=True)
239 break 266 if ret != 0:
240 else: 267 logger.error("Could not download file from %s" % checksum_url)
241 if ret != 0: 268 return ret
242 logger.error("Could not download file from %s" % check_url)
243 return ret
244 regex = re.compile(r"^(?P<checksum>[0-9a-f]+)\s+(?P<path>.*/)?(?P<filename>.*)$") 269 regex = re.compile(r"^(?P<checksum>[0-9a-f]+)\s+(?P<path>.*/)?(?P<filename>.*)$")
245 with open(tmpbuildtools_checksum, 'rb') as f: 270 with open(tmpbuildtools_checksum, 'rb') as f:
246 original = f.read() 271 original = f.read()
@@ -253,10 +278,7 @@ def main():
253 logger.error("Filename does not match name in checksum") 278 logger.error("Filename does not match name in checksum")
254 return 1 279 return 1
255 checksum = m.group('checksum') 280 checksum = m.group('checksum')
256 if checksum_type == "md5sum": 281 checksum_value = sha256_file(tmpbuildtools)
257 checksum_value = md5_file(tmpbuildtools)
258 else:
259 checksum_value = sha256_file(tmpbuildtools)
260 if checksum == checksum_value: 282 if checksum == checksum_value:
261 logger.info("Checksum success") 283 logger.info("Checksum success")
262 else: 284 else:
@@ -270,7 +292,7 @@ def main():
270 os.chmod(tmpbuildtools, st.st_mode | stat.S_IEXEC) 292 os.chmod(tmpbuildtools, st.st_mode | stat.S_IEXEC)
271 logger.debug(os.stat(tmpbuildtools)) 293 logger.debug(os.stat(tmpbuildtools))
272 if args.directory: 294 if args.directory:
273 install_dir = args.directory 295 install_dir = os.path.abspath(args.directory)
274 ret = subprocess.call("%s -d %s -y" % 296 ret = subprocess.call("%s -d %s -y" %
275 (tmpbuildtools, install_dir), shell=True) 297 (tmpbuildtools, install_dir), shell=True)
276 else: 298 else:
@@ -291,7 +313,7 @@ def main():
291 if match: 313 if match:
292 env_var = match.group('env_var') 314 env_var = match.group('env_var')
293 logger.debug("env_var: %s" % env_var) 315 logger.debug("env_var: %s" % env_var)
294 env_val = match.group('env_val') 316 env_val = remove_quotes(match.group('env_val'))
295 logger.debug("env_val: %s" % env_val) 317 logger.debug("env_val: %s" % env_val)
296 os.environ[env_var] = env_val 318 os.environ[env_var] = env_val
297 319
@@ -303,7 +325,9 @@ def main():
303 if args.with_extended_buildtools and not m: 325 if args.with_extended_buildtools and not m:
304 logger.info("Ignoring --with-extended-buildtools as filename " 326 logger.info("Ignoring --with-extended-buildtools as filename "
305 "does not contain 'extended'") 327 "does not contain 'extended'")
306 if args.with_extended_buildtools and m: 328 if args.make_only:
329 tool = 'make'
330 elif args.with_extended_buildtools and m:
307 tool = 'gcc' 331 tool = 'gcc'
308 else: 332 else:
309 tool = 'tar' 333 tool = 'tar'
@@ -331,7 +355,8 @@ def main():
331 355
332 finally: 356 finally:
333 # cleanup tmp directory 357 # cleanup tmp directory
334 shutil.rmtree(tmpsdk_dir) 358 if not args.downloads_directory:
359 shutil.rmtree(sdk_dir)
335 360
336 361
337if __name__ == '__main__': 362if __name__ == '__main__':