def run(args = sys.argv): ec = 0 get_sources_error = True try: # # The RSB options support cannot be used because it loads the defaults # for the host which we cannot do here. # description = 'RTEMS Get Sources downloads all the source a build set ' description += 'references for all hosts.' argsp = argparse.ArgumentParser(prog = 'rtems-get-sources', description = description) argsp.add_argument('--rtems-version', help = 'Set the RTEMS version.', type = str, default = version.version()) argsp.add_argument('--list-hosts', help = 'List the hosts.', action = 'store_true') argsp.add_argument('--list-bsets', help = 'List the hosts.', action = 'store_true') argsp.add_argument('--download-dir', help = 'Download directory.', type = str) argsp.add_argument('--clean', help = 'Clean the download directory.', action = 'store_true') argsp.add_argument('--tar', help = 'Create a tarball of all the source.', action = 'store_true') argsp.add_argument('--log', help = 'Log file.', type = str, default = log_default()) argsp.add_argument('--trace', help = 'Enable trace logging for debugging.', action = 'store_true') argsp.add_argument('bsets', nargs='*', help = 'Build sets.') argopts = argsp.parse_args(args[2:]) load_log(argopts.log) log.notice('RTEMS Source Builder - Get Sources, %s' % (version.str())) log.tracing = argopts.trace opts = load_options(args, argopts) configs = build.get_configs(opts) if argopts.list_bsets: list_bset_files(opts, configs) else: if argopts.clean: if argopts.download_dir is None: raise error.general('cleaning of the default download directories is not supported') if path.exists(argopts.download_dir): log.notice('Cleaning source directory: %s' % (argopts.download_dir)) path.removeall(argopts.download_dir) if len(argopts.bsets) == 0: raise error.general('no build sets provided on the command line') for bset in argopts.bsets: get_sources_error = True b = buildset(bset, configs, opts) get_sources_error = False for host in host_profiles: b.build(host) b = None except error.general as gerr: if get_sources_error: log.stderr(str(gerr)) log.stderr('Build FAILED') ec = 1 except error.internal as ierr: if get_sources_error: log.stderr(str(ierr)) log.stderr('Internal Build FAILED') ec = 1 except error.exit as eerr: pass except KeyboardInterrupt: log.notice('abort: user terminated') ec = 1 except: raise log.notice('abort: unknown error') ec = 1 sys.exit(ec)
def rmdir(self, rmpath): log.output('removing: %s' % (path.host(rmpath))) if not self.opts.dry_run(): if path.exists(rmpath): path.removeall(rmpath)
def build(self, deps=None, nesting_count=0, mail=None): build_error = False nesting_count += 1 if self.mail_active(mail, nesting_count): mail['output'].clear() mail['log'] = '' mail['reports'] = [] mail['failure'] = None log.trace('_bset: %2d: %s: make' % (nesting_count, self.bset)) log.notice('Build Set: %s' % (self.bset)) current_path = os.environ['PATH'] start = datetime.datetime.now() mail_report = False have_errors = False interrupted = False # # If this is the outter most buildset it's files are installed. Nested # build sets staged their installed file. The staged files are install # when the outtter most build finishes. # if nesting_count != 1: if self.installing(): self.macros['install_mode'] = 'staging' # # Only the outter build set can have staging to install. Get the staging # root via the config because it could require a valid config. # have_staging = False try: configs = self.load() log.trace('_bset: %2d: %s: configs: %s' % (nesting_count, self.bset, ', '.join(configs))) if nesting_count == 1 and len(configs) > 1: # # Prepend staging areas, bin directory to the # path. Lets the later package depend on the earlier # ones. # pathprepend = ['%{stagingroot}/bin'] + \ macro_expand(self.macros, '%{_pathprepend}').split(':') pathprepend = [pp for pp in pathprepend if len(pp)] if len(pathprepend) == 1: self.macros['_pathprepend'] = pathprepend[0] else: self.macros['_pathprepend'] = ':'.join(pathprepend) sizes_valid = False builds = [] for s in range(0, len(configs)): b = None try: # # Each section of the build set gets a separate set of # macros so we do not contaminate one configuration with # another. # opts = copy.copy(self.opts) macros = copy.copy(self.macros) if configs[s].endswith('.bset'): log.trace('_bset: %2d: %s %s' % (nesting_count, configs[s], '=' * (74 - len(configs[s])))) bs = buildset(configs[s], self.configs, opts, macros) bs.build(deps, nesting_count, mail) if self.installing(): have_staging = True del bs elif configs[s].endswith('.cfg'): if mail: mail_report = True log.trace('_bset: %2d: %s %s' % (nesting_count, configs[s], '=' * (74 - len(configs[s])))) try: b = build.build( configs[s], self.opts.get_arg('--pkg-tar-files'), opts, macros) except: build_error = True raise if b.macros.get('%{_disable_reporting}'): mail_report = False if deps is None: self.build_package(configs[s], b) self.report(configs[s], b, copy.copy(self.opts), copy.copy(self.macros), mail=mail) # Always produce an XML report. self.report(configs[s], b, copy.copy(self.opts), copy.copy(self.macros), format='xml', mail=mail) if s == len(configs) - 1 and not have_errors: self.bset_tar(b) else: deps += b.config.includes() builds += [b] # # Dump post build macros. # log.trace('_bset: : macros post-build') log.trace(str(b.macros)) else: raise error.general('invalid config type: %s' % (configs[s])) except error.general as gerr: have_errors = True if b is not None: if self.build_failure is None: self.build_failure = b.name() self.write_mail_header('') self.write_mail_header('= ' * 40) self.write_mail_header('Build FAILED: %s' % (b.name())) self.write_mail_header('- ' * 40) self.write_mail_header(str(log.default)) self.write_mail_header('- ' * 40) if self.opts.keep_going(): log.notice(str(gerr)) if self.opts.always_clean(): builds += [b] else: raise else: raise # # Installing or staging ... # log.trace('_bset: %2d: %s: deps:%r no-install:%r' % \ (nesting_count, self.install_mode(), deps is None, self.opts.no_install())) log.trace('_bset: %2d: %s: builds: %s' % \ (nesting_count, self.install_mode(), ', '.join([b.name() for b in builds]))) if deps is None and not self.opts.no_install() and not have_errors: for b in builds: log.trace('_bset: : %s: %r' % (self.install_mode(), b.installable())) if b.installable(): prefix = b.config.expand('%{_prefix}') buildroot = path.join(b.config.expand('%{buildroot}'), prefix) if self.staging(): prefix = b.config.expand('%{stagingroot}') self.install(self.install_mode(), b.name(), buildroot, prefix) # # Sizes ... # if len(builds) > 1: size_build = 0 size_installed = 0 size_build_max = 0 for b in builds: s = b.get_build_size() size_build += s if s > size_build_max: size_build_max = s size_installed += b.get_installed_size() size_sources = 0 for p in builds[0].config.expand('%{_sourcedir}').split(':'): size_sources += path.get_size(p) size_patches = 0 for p in builds[0].config.expand('%{_patchdir}').split(':'): size_patches += path.get_size(p) size_total = size_sources + size_patches + size_installed build_max_size_human = build.humanize_number( size_build_max + size_installed, 'B') build_total_size_human = build.humanize_number(size_total, 'B') build_sources_size_human = build.humanize_number( size_sources, 'B') build_patches_size_human = build.humanize_number( size_patches, 'B') build_installed_size_human = build.humanize_number( size_installed, 'B') build_size = 'usage: %s' % (build_max_size_human) build_size += ' total: %s' % (build_total_size_human) build_size += ' (sources: %s' % (build_sources_size_human) build_size += ', patches: %s' % (build_patches_size_human) build_size += ', installed %s)' % (build_installed_size_human) sizes_valid = True # # Cleaning ... # if deps is None and \ (not self.opts.no_clean() or self.opts.always_clean()): for b in builds: if not b.disabled(): log.notice('cleaning: %s' % (b.name())) b.cleanup() # # Log the build size message # if len(builds) > 1: log.notice('Build Sizes: %s' % (build_size)) # # Clear out the builds ... # for b in builds: del b # # If builds have been staged install into the finaly prefix. # if have_staging and not self.opts.no_install() and not have_errors: stagingroot = macro_expand(self.macros, '%{stagingroot}') have_stagingroot = path.exists(stagingroot) log.trace('_bset: %2d: install staging, present: %s' % \ (nesting_count, have_stagingroot)) if have_stagingroot: prefix = macro_expand(self.macros, '%{_prefix}') self.install(self.install_mode(), self.bset, stagingroot, prefix) staging_size = path.get_size(stagingroot) if not self.opts.no_clean() or self.opts.always_clean(): log.notice('clean staging: %s' % (self.bset)) log.trace('removing: %s' % (stagingroot)) if not self.opts.dry_run(): if path.exists(stagingroot): path.removeall(stagingroot) log.notice('Staging Size: %s' % \ (build.humanize_number(staging_size, 'B'))) except error.general as gerr: if not build_error: log.stderr(str(gerr)) raise except KeyboardInterrupt: interrupted = True raise except: self.build_failure = 'RSB general failure' interrupted = True raise finally: end = datetime.datetime.now() os.environ['PATH'] = current_path build_time = str(end - start) if self.mail_single_report() and nesting_count == 1: mail_report = True if interrupted or self.macros.defined('mail_disable'): mail_report = False if mail_report and mail is not None: if self.installing(): self.write_mail_header('Build Time: %s' % (build_time), True) self.write_mail_header('', True) self.write_mail_header(mail['header'], True) self.write_mail_header('') log.notice('Mailing report: %s' % (mail['to'])) mail['log'] += self.get_mail_header() if sizes_valid: mail['log'] += 'Sizes' + os.linesep mail['log'] += '=====' + os.linesep + os.linesep mail['log'] += \ 'Maximum build usage: ' + build_max_size_human + os.linesep mail['log'] += \ 'Total size: ' + build_total_size_human + os.linesep mail['log'] += \ 'Installed : ' + build_installed_size_human + os.linesep mail[ 'log'] += 'Sources: ' + build_sources_size_human + os.linesep mail[ 'log'] += 'Patches: ' + build_patches_size_human + os.linesep mail['log'] += os.linesep mail['log'] += 'Output' + os.linesep mail['log'] += '======' + os.linesep + os.linesep mail['log'] += os.linesep.join(mail['output'].get()) mail['log'] += os.linesep + os.linesep mail['log'] += 'Report' + os.linesep mail['log'] += '======' + os.linesep + os.linesep mail['reports'] += [self.get_mail_report()] if self.build_failure is not None: mail['failure'] = self.build_failure if self.mail_active(mail, nesting_count): try: self.mail_send(mail) except error.general as gerr: log.notice('Mail Send Failure: %s' % (gerr)) log.notice('Build Set: Time %s' % (build_time))
def run(args=sys.argv): ec = 0 get_sources_error = True try: # # The RSB options support cannot be used because it loads the defaults # for the host which we cannot do here. # description = 'RTEMS Get Sources downloads all the source a build set ' description += 'references for all hosts.' argsp = argparse.ArgumentParser(prog='rtems-get-sources', description=description) argsp.add_argument('--rtems-version', help='Set the RTEMS version.', type=str, default=version.version()) argsp.add_argument('--list-hosts', help='List the hosts.', action='store_true') argsp.add_argument('--list-bsets', help='List the hosts.', action='store_true') argsp.add_argument('--download-dir', help='Download directory.', type=str) argsp.add_argument('--clean', help='Clean the download directory.', action='store_true') argsp.add_argument('--tar', help='Create a tarball of all the source.', action='store_true') argsp.add_argument('--log', help='Log file.', type=str, default=log_default()) argsp.add_argument('--trace', help='Enable trace logging for debugging.', action='store_true') argsp.add_argument('bsets', nargs='*', help='Build sets.') argopts = argsp.parse_args(args[2:]) load_log(argopts.log) log.notice('RTEMS Source Builder - Get Sources, %s' % (version.str())) log.tracing = argopts.trace opts = load_options(args, argopts) configs = build.get_configs(opts) if argopts.list_bsets: list_bset_files(opts, configs) else: if argopts.clean: if argopts.download_dir is None: raise error.general( 'cleaning of the default download directories is not supported' ) if path.exists(argopts.download_dir): log.notice('Cleaning source directory: %s' % (argopts.download_dir)) path.removeall(argopts.download_dir) if len(argopts.bsets) == 0: raise error.general( 'no build sets provided on the command line') for bset in argopts.bsets: get_sources_error = True b = buildset(bset, configs, opts) get_sources_error = False for host in host_profiles: b.build(host) b = None except error.general as gerr: if get_sources_error: log.stderr(str(gerr)) log.stderr('Build FAILED') ec = 1 except error.internal as ierr: if get_sources_error: log.stderr(str(ierr)) log.stderr('Internal Build FAILED') ec = 1 except error.exit as eerr: pass except KeyboardInterrupt: log.notice('abort: user terminated') ec = 1 except: raise log.notice('abort: unknown error') ec = 1 sys.exit(ec)