def do_build(args): """build [ --no-sandbox ] [ --shell | --force | --clean ]""" buildenv = BuildEnv() sels = buildenv.get_selections() parser = OptionParser(usage="usage: %prog build [options]") parser.add_option('', "--no-sandbox", help="disable use of sandboxing", action='store_true') parser.add_option("-s", "--shell", help="run a shell instead of building", action='store_true') parser.add_option("-c", "--clean", help="remove the build directories", action='store_true') parser.add_option("-f", "--force", help="build even if dependencies have changed", action='store_true') parser.disable_interspersed_args() (options, args2) = parser.parse_args(args) builddir = os.path.realpath('build') changes = buildenv.get_build_changes() if changes: if not (options.force or options.clean): raise SafeException("Build dependencies have changed:\n" + '\n'.join(changes) + "\n\n" + "To build anyway, use: 0compile build --force\n" + "To do a clean build: 0compile build --clean") if not options.no_sandbox: print("Build dependencies have changed:\n" + '\n'.join(changes)) ensure_dir(builddir, options.clean) ensure_dir(buildenv.distdir, options.clean) if options.no_sandbox: return do_build_internal(options, args2) tmpdir = tempfile.mkdtemp(prefix = '0compile-') try: my_dir = os.path.dirname(__file__) readable = ['.', my_dir] writable = ['build', buildenv.distdir, tmpdir] env('TMPDIR', tmpdir) for selection in list(sels.selections.values()): if not is_package_impl(selection): readable.append(lookup(selection)) options = [] if __main__.options.verbose: options.append('--verbose') readable.append('/etc') # /etc/ld.* spawn_and_check_maybe_sandboxed(readable, writable, tmpdir, sys.executable, ['-u', sys.argv[0]] + options + ['build', '--no-sandbox'] + args) finally: info("Deleting temporary directory '%s'" % tmpdir) shutil.rmtree(tmpdir)
def do_build(args): """build [ --no-sandbox ] [ --shell | --force | --clean ]""" buildenv = BuildEnv() sels = buildenv.get_selections() parser = OptionParser(usage="usage: %prog build [options]") parser.add_option('', "--no-sandbox", help="disable use of sandboxing", action='store_true') parser.add_option("-s", "--shell", help="run a shell instead of building", action='store_true') parser.add_option("-c", "--clean", help="remove the build directories", action='store_true') parser.add_option("-f", "--force", help="build even if dependencies have changed", action='store_true') parser.disable_interspersed_args() (options, args2) = parser.parse_args(args) builddir = os.path.realpath('build') changes = buildenv.get_build_changes() if changes: if not (options.force or options.clean): raise SafeException("Build dependencies have changed:\n" + '\n'.join(changes) + "\n\n" + "To build anyway, use: 0compile build --force\n" + "To do a clean build: 0compile build --clean") if not options.no_sandbox: print "Build dependencies have changed:\n" + '\n'.join(changes) ensure_dir(builddir, options.clean) ensure_dir(buildenv.distdir, options.clean) if options.no_sandbox: return do_build_internal(options, args2) tmpdir = tempfile.mkdtemp(prefix = '0compile-') try: my_dir = os.path.dirname(__file__) readable = ['.', my_dir] writable = ['build', buildenv.distdir, tmpdir] env('TMPDIR', tmpdir) for selection in sels.selections.values(): if not is_package_impl(selection): readable.append(lookup(selection)) options = [] if __main__.options.verbose: options.append('--verbose') readable.append('/etc') # /etc/ld.* spawn_and_check_maybe_sandboxed(readable, writable, tmpdir, sys.executable, ['-u', sys.argv[0]] + options + ['build', '--no-sandbox'] + args) finally: info("Deleting temporary directory '%s'" % tmpdir) shutil.rmtree(tmpdir)
def response(box, resp): if resp == RESPONSE_SETUP: def done_setup(): self.add_msg('Now use Build to compile the chosen source code.') self.run_command((sys.executable, main_path, 'setup'), done_setup) elif resp == RESPONSE_BUILD: def done_build(): self.add_msg('\nBuild successful. Now register or publish the build.') def build_failed(): self.add_msg('\nIf the messages displayed above indicate a missing dependency (e.g. no C compiler ' "or a library that isn't available through Zero Install) then install it using your " 'normal package manager and click on Build again. Note that for libraries you often ' 'need the -dev version of the package. ' '\nOtherwise, please notify the developers of this problem (this will transmit ' 'the contents of the build/build-failure.log file):') end = self.buffer.get_end_iter() anchor = self.buffer.create_child_anchor(end) align = gtk.Alignment(0.0, 0.0, 1.0, 1.0) button = ButtonMixed(gtk.STOCK_YES, 'Notify developers') align.add(button) align.set_padding(8, 8, 8, 8) align.show_all() self.tv.add_child_at_anchor(align, anchor) self.add_msg('\n') def report_bug(button): def done_notify(): self.add_msg("\nReport sent. Thank you! (note: you won't get a reply, as " "no contact details were sent; write to the project's mailing " "list if you want to discuss the problem)") self.run_command((sys.executable, main_path, 'report-bug'), done_notify) button.connect('clicked', report_bug) buildenv = BuildEnv() changes = buildenv.get_build_changes() if changes: options = get_build_options(box, '\n'.join(changes) + '\n\nIt would be best to do a clean (full) build.') else: options = [] if options is not None: box.run_command([sys.executable, main_path, 'build'] + options, done_build, build_failed) elif resp == RESPONSE_REGISTER: buildenv = BuildEnv() iface = iface_cache.get_interface(interface) reader.update_from_cache(iface) # Register using the feed-for, if available real_iface = iface for uri in iface.feed_for or []: real_iface = iface_cache.get_interface(uri) self.add_msg("Registering as a feed for %s" % real_iface.uri) break else: if os.path.isabs(iface.uri): self.add_msg("Warning: no <feed-for> in local feed %s!" % iface.uri) feed = buildenv.local_iface_file for f in real_iface.feeds or []: if f.uri == feed: self.add_msg("Feed '%s' is already registered for interface '%s'!\n" % (feed, real_iface.uri)) return box.buffer.insert_at_cursor("Registering feed '%s'\n" % feed) real_iface.extra_feeds.append(model.Feed(feed, arch = None, user_override = True)) writer.save_interface(real_iface) box.buffer.insert_at_cursor("Done. You can now close this window.\n") elif resp == RESPONSE_PUBLISH: buildenv = BuildEnv() box = PublishBox(self, buildenv) resp = box.run() box.destroy() if resp == gtk.RESPONSE_OK: def done_publish(): self.add_msg("\nYou can use '0publish --local' to add this " "into the main feed. If you don't have a main feed then this " "will create one. See " "http://0install.net/injector-packagers.html for more information.") self.run_command((sys.executable, main_path, 'publish', box.archive_dir.get_text()), done_publish) elif resp == gtk.RESPONSE_CANCEL or resp == gtk.RESPONSE_DELETE_EVENT: if self.kill_child(): return self.destroy() else: self.add_msg('Unknown response: %s' % resp)