Пример #1
0
    def bootstrap(self, application_choice=None, no_interactive=False, no_system_changes=False):
        from mozboot.bootstrap import Bootstrapper

        bootstrapper = Bootstrapper(choice=application_choice,
                                    no_interactive=no_interactive,
                                    no_system_changes=no_system_changes)
        bootstrapper.bootstrap()
Пример #2
0
    def bootstrap(self, application_choice=None, no_system_changes=False):
        from mozboot.bootstrap import Bootstrapper

        bootstrapper = Bootstrapper(
            choice=application_choice,
            no_interactive=not self._mach_context.is_interactive,
            no_system_changes=no_system_changes,
            mach_context=self._mach_context,
        )
        bootstrapper.bootstrap()
Пример #3
0
def bootstrap(command_context,
              application_choice=None,
              no_system_changes=False):
    """Bootstrap system and mach for optimal development experience."""
    from mozboot.bootstrap import Bootstrapper

    bootstrapper = Bootstrapper(
        choice=application_choice,
        no_interactive=not command_context._mach_context.is_interactive,
        no_system_changes=no_system_changes,
        mach_context=command_context._mach_context,
    )
    bootstrapper.bootstrap(command_context.settings)
Пример #4
0
    def __init__(self, b2g_home):
        self.b2g_home = b2g_home
        self.mozboot_dir = None

        # don't subclass Bootstrapper to avoid global imports
        try:
            from mozboot.bootstrap import Bootstrapper
        except ImportError:
            from fetch import install_module
            self.mozboot_dir = install_module('python/mozboot/mozboot')
            from mozboot.bootstrap import Bootstrapper

        self.boot = Bootstrapper(finished=FINISHED+SEE_MDN_DOCS)
        self.extra_packages = []
Пример #5
0
    def bootstrap(self):
        from mozboot.bootstrap import Bootstrapper

        bootstrapper = Bootstrapper()
        bootstrapper.bootstrap()
Пример #6
0
    def bootstrap(self):
        from mozboot.bootstrap import Bootstrapper

        bootstrapper = Bootstrapper()
        bootstrapper.bootstrap()
Пример #7
0
class B2GBootstrapper(object):
    def __init__(self, b2g_home):
        self.b2g_home = b2g_home
        self.mozboot_dir = None

        # don't subclass Bootstrapper to avoid global imports
        try:
            from mozboot.bootstrap import Bootstrapper
        except ImportError:
            from fetch import install_module
            self.mozboot_dir = install_module('python/mozboot/mozboot')
            from mozboot.bootstrap import Bootstrapper

        self.boot = Bootstrapper(finished=FINISHED+SEE_MDN_DOCS)
        self.extra_packages = []

    def bootstrap(self):
        try:
            name = self.boot.instance.__class__.__name__
            name = name[:name.index('Bootstrapper')].lower()

            if hasattr(self, 'pre_bootstrap_%s' % name):
                getattr(self, 'pre_bootstrap_%s' % name)()
            else:
                self.boot.finished = PLATFORM_NOT_IMPLEMENTED + SEE_MDN_DOCS
            self.boot.instance.packages.extend(self.extra_packages)

            if name == 'osx':
                # for osx, use the shell script provided in the documentation
                self.boot.instance.ensure_xcode()
                self._download('https://raw.github.com/mozilla-b2g/B2G/master/scripts/bootstrap-mac.sh')
                print('Running the mac bootstrap script...')
                ret = subprocess.call(['bash', 'bootstrap-mac.sh'])
                os.remove('bootstrap-mac.sh')
                print(self.boot.finished)
                return ret

            self.boot.bootstrap()

            if hasattr(self, 'post_bootstrap_%s' % name):
                getattr(self, 'post_bootstrap_%s' % name)()
        finally:
            if self.mozboot_dir:
                import mozfile
                mozfile.remove(self.mozboot_dir)

    def pre_bootstrap_centos(self):
        # XXX please test me
        self.pre_bootstrap_fedora()

    def pre_bootstrap_debian(self):
        self.extra_packages.extend([
            'bison',
            'bzip2',
            'curl',
            'flex',
            'gawk',
            'g++-multilib',
            'git',
            'libgl1-mesa-dev',
            'libx11-dev',
            # 32 bit libraries required to build ics emulator, bug 897727
            'ia32-libs',
            'lib32ncurses5-dev',
            'lib32z1-dev',
        ])


    def pre_bootstrap_fedora(self):
        self.extra_packages.extend([
            'bison',
            'ccache',
            'curl',
            'flex',
            'gawk',
            'libX11-devel',
            'make',
            'patch',
            'zip',
            'perl-Digest-SHA',
            'wget',
            # 32 bit libraries required to build ics emulator, bug 897727
            'ncurses-devel.i686',
            'readline-devel.i686',
            'zlib-devel.i686',
            'libX11-devel.i686',
            'mesa-libGL-devel.i686',
            'glibc-devel.i686',
            'libstdc++.i686',
            'libXrandr.i686',
        ])

    def pre_bootstrap_osx(self):
        """Just use shell script provided in b2g build documentation."""

    def pre_bootstrap_ubuntu(self):
        dist = platform.linux_distribution()[:2]
        dist = (dist[0].lower(), version(dist[1]))

        # we require at least ubuntu 12.04 (linuxmint 13)
        if (dist[0] == 'ubuntu' and dist[1] < '12.04') or \
           (dist[0] == 'linuxmint' and dist[1] < '13') :
            print(OS_NOT_SUPPORTED)
            sys.exit(1)

        if dist in (('ubuntu', '12.04'), ('linuxmint', '13')):
            self.pre_bootstrap_debian()
        elif dist in (('ubuntu', '12.10'), ('linuxmint', '14')):
            # work around error about unmet dependencies for ia32-libs
            self.boot.instance.apt_add_architecture(['i386'])
            self.boot.instance.apt_update()

            self.pre_bootstrap_debian()
            self.extra_packages.extend([
                'gcc-4.6',
                'g++-4.6',
                'g++-4.6-multilib',
            ])
        elif dist in (('ubuntu', '13.04'), ('linuxmint', '15')):
            self.boot.instance.packages.insert(0, '--no-install-recommends')
            self.pre_bootstrap_debian()
            self.extra_packages.extend([
                'gcc-4.6',
                'g++-4.6',
                'g++-4.6-multilib',
            ])
        elif dist in (('ubuntu', '13.10'), ('linuxmint', '16')):
            self.boot.instance.packages.insert(0, '--no-install-recommends')

            # starting in 13.10, multi-arch packages are used
            self.boot.instance.apt_add_architecture(['i386'])
            self.boot.instance.apt_update()

            self.pre_bootstrap_debian()
            self.extra_packages.remove('ia32-libs')
            self.extra_packages.extend([
                'gcc-4.6',
                'g++-4.6',
                'g++-4.6-multilib',
                'zlib1g:amd64',
                'zlib1g-dev:amd64',
                'zlib1g:i386',
                'zlib1g-dev:i386',
                'libxml2-utils',
            ])

    def _append_to_userconfig(self, lines, prompt):
        userconfig = os.path.join(self.b2g_home, '.userconfig')

        lines = ['%s\n' % line for line in lines]
        lines_to_write = []
        if not os.path.isfile(userconfig):
            mode = 'w'
            lines_to_write = lines
        else:
            mode = 'a'
            with open(userconfig, 'r') as f:
                old_lines = f.readlines()
                for line in lines:
                    if line not in old_lines:
                        lines_to_write.append(line)

        if lines_to_write:
            c = raw_input(prompt).lower()
            while c not in ('y', 'n'):
                c = raw_input(prompt).lower()

            if c == 'y':
                with open(userconfig, mode) as f:
                    f.writelines(lines)
            else:
                print('Ok.. but make sure to remember to do it yourself!')

    def _download(self, url, savepath=''):
        print('Downloading %s...' % url)
        try:
            data = urllib2.urlopen(url)
        except urllib2.URLError:
            print('There was a problem downloading the file. Make sure you' \
                  'are connected to the network and try again.')
            sys.exit(1)
        if savepath == '' or os.path.isdir(savepath):
            parsed = urlparse.urlsplit(url)
            filename = parsed.path[parsed.path.rfind('/')+1:]
            savepath = os.path.join(savepath, filename)
        savedir = os.path.dirname(savepath)
        if savedir != '' and not os.path.exists(savedir):
            os.makedirs(savedir)
        outfile = open(savepath, 'wb')
        outfile.write(data.read())
        outfile.close()
        return os.path.realpath(savepath)

    def post_bootstrap_fedora(self):
        cc = None
        cxx = None
        try:
            import which
            try:
                cc = which.which('gcc-4.6')
                cxx = which.which('g++-4.6')
            except which.WhichError:
                pass
        except ImportError:
            pass

        if not cc or not cxx:
            path_names = glob.glob('/opt/gcc-4.6.[0-9]*/bin')
            if not path_names:
                print('gcc-4.6 not detected!')
                v = version(platform.linux_distribution()[1])
                if v in ('17', '18'):
                    path = self._download(FEDORA_18_GCC_4_6)
                    self.boot.instance.run_as_root(['tar', '-xa', '-C', '/opt', '-f', path])
                    os.remove(path)
                elif v in ('19', '20'):
                    path = self._download(FEDORA_19_GCC_4_6)
                    self.boot.instance.run_as_root(['tar', '-xa', '-C', '/opt', '-f', path])
                    os.remove(path)
                else:
                    print("Couldn't find a copy of gcc-4.6 for your platform. You'll need to download and set it up manually.")
                    return
                path_names = glob.glob('/opt/gcc-4.6.[0-9]*/bin')

            # get most recent version
            def sort_path_names(x):
                x = x.split('/')[2]
                return int(x[x.rfind('.')+1:])
            path = sorted(path_names, key=sort_path_names, reverse=True)[0]
            cc = os.path.join(path, 'gcc')
            cxx = os.path.join(path, 'g++')

        write_lines = [
            'export CC=%s' % cc,
            'export CXX=%s' % cxx,
        ]
        self._append_to_userconfig(write_lines, GCC_USERCONFIG_PROMPT)

    def post_bootstrap_ubuntu(self):
        dist = platform.linux_distribution()[:2]
        dist = (dist[0].lower(), version(dist[1]))

        if (dist[0] == 'ubuntu' and dist[1] > '12.04') or \
           (dist[0] == 'linuxmint' and dist[1] > '13'):
            write_lines = [
                'export CC=gcc-4.6',
                'export CXX=g++-4.6',
            ]
            self._append_to_userconfig(write_lines, GCC_USERCONFIG_PROMPT)