Bug 1252976 - Offer |mach artifact| builds in |mach bootstrap| for non-Fennec builds r=nalexander draft
authorSambuddha Basu <sambuddhabasu1@gmail.com>
Mon, 08 Aug 2016 17:30:37 +0800
changeset 398367 971c124e1db8655194f2a126aa3f2458aa32ac12
parent 396804 0ba72e8027cfcbcbf3426770ac264a7ade2af090
child 398368 7ba21088836bacaed3a4482f704ce6b9be2d395e
push id25510
push userbmo:timdream@gmail.com
push dateTue, 09 Aug 2016 01:44:23 +0000
reviewersnalexander
bugs1252976
milestone51.0a1
Bug 1252976 - Offer |mach artifact| builds in |mach bootstrap| for non-Fennec builds r=nalexander MozReview-Commit-ID: 2lbrORiTjwH
python/mozboot/mozboot/archlinux.py
python/mozboot/mozboot/base.py
python/mozboot/mozboot/bootstrap.py
python/mozboot/mozboot/centosfedora.py
python/mozboot/mozboot/debian.py
python/mozboot/mozboot/freebsd.py
python/mozboot/mozboot/gentoo.py
python/mozboot/mozboot/openbsd.py
python/mozboot/mozboot/osx.py
--- a/python/mozboot/mozboot/archlinux.py
+++ b/python/mozboot/mozboot/archlinux.py
@@ -77,25 +77,32 @@ class ArchlinuxBootstrapper(BaseBootstra
     def __init__(self, version, dist_id, **kwargs):
         print 'Using an experimental bootstrapper for Archlinux.'
         BaseBootstrapper.__init__(self, **kwargs)
 
     def install_system_packages(self):
         self.pacman_install(*self.SYSTEM_PACKAGES)
 
     def install_browser_packages(self):
-        self.aur_install(*self.BROWSER_AUR_PACKAGES)
-        self.pacman_install(*self.BROWSER_PACKAGES)
+        self.ensure_browser_packages()
+
+    def install_browser_artifact_mode_packages(self):
+        self.ensure_browser_packages(artifact_mode=True)
 
     def install_mobile_android_packages(self):
         self.ensure_mobile_android_packages()
 
     def install_mobile_android_artifact_mode_packages(self):
         self.ensure_mobile_android_packages(artifact_mode=True)
 
+    def ensure_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
+        self.aur_install(*self.BROWSER_AUR_PACKAGES)
+        self.pacman_install(*self.BROWSER_PACKAGES)
+
     def ensure_mobile_android_packages(self, artifact_mode=False):
         import android
 
         # Multi-part process:
         # 1. System packages.
         # 2. Android SDK. Android NDK only if we are not in artifact mode.
         # 3. Android packages.
 
--- a/python/mozboot/mozboot/base.py
+++ b/python/mozboot/mozboot/base.py
@@ -68,16 +68,24 @@ the $PATH environment variable.
 
 We recommend the following tools for installing Python:
 
     pyenv   -- https://github.com/yyuu/pyenv)
     pythonz -- https://github.com/saghul/pythonz
     official installers -- http://www.python.org/
 '''
 
+BROWSER_ARTIFACT_MODE_MOZCONFIG = '''
+Paste the lines between the chevrons (>>> and <<<) into your mozconfig file:
+
+<<<
+# Automatically download and use compiled C++ components:
+ac_add_options --enable-artifact-builds
+>>>
+'''
 
 # Upgrade Mercurial older than this.
 # This should match OLDEST_NON_LEGACY_VERSION from
 # the hg setup wizard in version-control-tools.
 MODERN_MERCURIAL_VERSION = LooseVersion('3.7.3')
 
 # Upgrade Python older than this.
 MODERN_PYTHON_VERSION = LooseVersion('2.7.3')
@@ -113,16 +121,36 @@ class BaseBootstrapper(object):
         Print a message to the console detailing what the user's mozconfig
         should contain.
 
         Firefox for Desktop can in simple cases determine its build environment
         entirely from configure.
         '''
         pass
 
+    def install_browser_artifact_mode_packages(self):
+        '''
+        Install packages required to build Firefox for Desktop (application
+        'browser') in Artifact Mode.
+        '''
+        raise NotImplementedError(
+            'Cannot bootstrap Firefox for Desktop Artifact Mode: '
+            '%s does not yet implement install_browser_artifact_mode_packages()' %
+            __name__)
+
+    def suggest_browser_artifact_mode_mozconfig(self):
+        '''
+        Print a message to the console detailing what the user's mozconfig
+        should contain.
+
+        Firefox for Desktop Artifact Mode needs to enable artifact builds and
+        a path where the build artifacts will be written to.
+        '''
+        print(BROWSER_ARTIFACT_MODE_MOZCONFIG)
+
     def install_mobile_android_packages(self):
         '''
         Install packages required to build Firefox for Android (application
         'mobile/android', also known as Fennec).
         '''
         raise NotImplementedError('Cannot bootstrap Firefox for Android: '
                                   '%s does not yet implement install_mobile_android_packages()'
                                   % __name__)
--- a/python/mozboot/mozboot/bootstrap.py
+++ b/python/mozboot/mozboot/bootstrap.py
@@ -49,26 +49,28 @@ later.
 You can learn more about Artifact mode builds at
 https://developer.mozilla.org/en-US/docs/Artifact_builds.
 
 Your choice:
 '''
 
 APPLICATIONS_LIST=[
     ('Firefox for Desktop', 'browser'),
+    ('Firefox for Desktop Artifact Mode', 'browser_artifact_mode'),
     ('Firefox for Android Artifact Mode', 'mobile_android_artifact_mode'),
     ('Firefox for Android', 'mobile_android'),
 ]
 
 # This is a workaround for the fact that we must support python2.6 (which has
 # no OrderedDict)
 APPLICATIONS = dict(
     browser=APPLICATIONS_LIST[0],
-    mobile_android_artifact_mode=APPLICATIONS_LIST[1],
-    mobile_android=APPLICATIONS_LIST[2],
+    browser_artifact_mode=APPLICATIONS_LIST[1],
+    mobile_android_artifact_mode=APPLICATIONS_LIST[2],
+    mobile_android=APPLICATIONS_LIST[3],
 )
 
 STATE_DIR_INFO = '''
 The Firefox build system and related tools store shared, persistent state
 in a common directory on the filesystem. On this machine, that directory
 is:
 
   {statedir}
--- a/python/mozboot/mozboot/centosfedora.py
+++ b/python/mozboot/mozboot/centosfedora.py
@@ -78,38 +78,45 @@ class CentOSFedoraBootstrapper(BaseBoots
                 'zlib-devel.i686',
             ]
 
     def install_system_packages(self):
         self.dnf_groupinstall(*self.group_packages)
         self.dnf_install(*self.packages)
 
     def install_browser_packages(self):
-        self.dnf_groupinstall(*self.browser_group_packages)
-        self.dnf_install(*self.browser_packages)
+        self.ensure_browser_packages()
 
-        if self.distro in ('CentOS', 'CentOS Linux'):
-            yasm = 'http://pkgs.repoforge.org/yasm/yasm-1.1.0-1.el6.rf.i686.rpm'
-            if platform.architecture()[0] == '64bit':
-                yasm = 'http://pkgs.repoforge.org/yasm/yasm-1.1.0-1.el6.rf.x86_64.rpm'
-
-            self.run_as_root(['rpm', '-ivh', yasm])
+    def install_browser_artifact_mode_packages(self):
+        self.ensure_browser_packages(artifact_mode=True)
 
     def install_mobile_android_packages(self):
         if self.distro in ('CentOS', 'CentOS Linux'):
             BaseBootstrapper.install_mobile_android_packages(self)
         elif self.distro == 'Fedora':
             self.install_fedora_mobile_android_packages()
 
     def install_mobile_android_artifact_mode_packages(self):
         if self.distro in ('CentOS', 'CentOS Linux'):
             BaseBootstrapper.install_mobile_android_artifact_mode_packages(self)
         elif self.distro == 'Fedora':
             self.install_fedora_mobile_android_packages(artifact_mode=True)
 
+    def ensure_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
+        self.dnf_groupinstall(*self.browser_group_packages)
+        self.dnf_install(*self.browser_packages)
+
+        if self.distro in ('CentOS', 'CentOS Linux'):
+            yasm = 'http://pkgs.repoforge.org/yasm/yasm-1.1.0-1.el6.rf.i686.rpm'
+            if platform.architecture()[0] == '64bit':
+                yasm = 'http://pkgs.repoforge.org/yasm/yasm-1.1.0-1.el6.rf.x86_64.rpm'
+
+            self.run_as_root(['rpm', '-ivh', yasm])
+
     def install_fedora_mobile_android_packages(self, artifact_mode=False):
         import android
 
         # Install Android specific packages.
         self.dnf_install(*self.mobile_android_packages)
 
         # Fetch Android SDK and NDK.
         mozbuild_path = os.environ.get('MOZBUILD_STATE_PATH', os.path.expanduser(os.path.join('~', '.mozbuild')))
--- a/python/mozboot/mozboot/debian.py
+++ b/python/mozboot/mozboot/debian.py
@@ -94,24 +94,31 @@ class DebianBootstrapper(BaseBootstrappe
         self.browser_packages = self.BROWSER_COMMON_PACKAGES + self.BROWSER_DISTRO_PACKAGES
         self.mobile_android_packages = self.MOBILE_ANDROID_COMMON_PACKAGES + self.MOBILE_ANDROID_DISTRO_PACKAGES
 
 
     def install_system_packages(self):
         self.apt_install(*self.packages)
 
     def install_browser_packages(self):
-        self.apt_install(*self.browser_packages)
+        self.ensure_browser_packages()
+
+    def install_browser_artifact_mode_packages(self):
+        self.ensure_browser_packages(artifact_mode=True)
 
     def install_mobile_android_packages(self):
         self.ensure_mobile_android_packages()
 
     def install_mobile_android_artifact_mode_packages(self):
         self.ensure_mobile_android_packages(artifact_mode=True)
 
+    def ensure_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
+        self.apt_install(*self.browser_packages)
+
     def ensure_mobile_android_packages(self, artifact_mode=False):
         import android
 
         # Multi-part process:
         # 1. System packages.
         # 2. Android SDK. Android NDK only if we are not in artifact mode.
         # 3. Android packages.
 
--- a/python/mozboot/mozboot/freebsd.py
+++ b/python/mozboot/mozboot/freebsd.py
@@ -46,12 +46,19 @@ class FreeBSDBootstrapper(BaseBootstrapp
 
         command.extend(packages)
         self.run_as_root(command)
 
     def install_system_packages(self):
         self.pkg_install(*self.packages)
 
     def install_browser_packages(self):
+        self.ensure_browser_packages()
+
+    def install_browser_artifact_mode_packages(self):
+        self.ensure_browser_packages(artifact_mode=True)
+
+    def ensure_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
         self.pkg_install(*self.browser_packages)
 
     def upgrade_mercurial(self, current):
         self.pkg_install('mercurial')
--- a/python/mozboot/mozboot/gentoo.py
+++ b/python/mozboot/mozboot/gentoo.py
@@ -11,16 +11,23 @@ class GentooBootstrapper(BaseBootstrappe
 
         self.version = version
         self.dist_id = dist_id
 
     def install_system_packages(self):
         self.run_as_root(['emerge', '--quiet', 'dev-vcs/git', 'mercurial'])
 
     def install_browser_packages(self):
+        self.ensure_browser_packages()
+
+    def install_browser_artifact_mode_packages(self):
+        self.ensure_browser_packages(artifact_mode=True)
+
+    def ensure_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
         self.run_as_root(['emerge', '--onlydeps', '--quiet', 'firefox'])
         self.run_as_root(['emerge', '--quiet', 'gtk+'])
 
     def _update_package_manager(self):
         self.run_as_root(['emerge', '--sync'])
 
     def upgrade_mercurial(self, current):
         self.run_as_root(['emerge', '--update', 'mercurial'])
--- a/python/mozboot/mozboot/openbsd.py
+++ b/python/mozboot/mozboot/openbsd.py
@@ -29,10 +29,17 @@ class OpenBSDBootstrapper(BaseBootstrapp
             'pulseaudio',
         ]
 
     def install_system_packages(self):
         # we use -z because there's no other way to say "any autoconf-2.13"
         self.run_as_root(['pkg_add', '-z'] + self.packages)
 
     def install_browser_packages(self):
+        self.ensure_browser_packages()
+
+    def install_browser_artifact_mode_packages(self):
+        self.ensure_browser_packages(artifact_mode=True)
+
+    def ensure_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
         # we use -z because there's no other way to say "any autoconf-2.13"
         self.run_as_root(['pkg_add', '-z'] + self.browser_packages)
--- a/python/mozboot/mozboot/osx.py
+++ b/python/mozboot/mozboot/osx.py
@@ -185,16 +185,19 @@ class OSXBootstrapper(BaseBootstrapper):
 
         choice = self.ensure_package_manager()
         self.package_manager = choice
         getattr(self, 'ensure_%s_system_packages' % self.package_manager)()
 
     def install_browser_packages(self):
         getattr(self, 'ensure_%s_browser_packages' % self.package_manager)()
 
+    def install_browser_artifact_mode_packages(self):
+        getattr(self, 'ensure_%s_browser_packages' % self.package_manager)(artifact_mode=True)
+
     def install_mobile_android_packages(self):
         getattr(self, 'ensure_%s_mobile_android_packages' % self.package_manager)()
 
     def install_mobile_android_artifact_mode_packages(self):
         getattr(self, 'ensure_%s_mobile_android_packages' % self.package_manager)(artifact_mode=True)
 
     def suggest_mobile_android_mozconfig(self):
         getattr(self, 'suggest_%s_mobile_android_mozconfig' % self.package_manager)()
@@ -315,17 +318,18 @@ class OSXBootstrapper(BaseBootstrapper):
             ('git', 'git'),
             ('autoconf213', HOMEBREW_AUTOCONF213),
             ('gnu-tar', 'gnu-tar'),
             ('watchman', 'watchman',),
             ('terminal-notifier', 'terminal-notifier')
         ]
         self._ensure_homebrew_packages(packages)
 
-    def ensure_homebrew_browser_packages(self):
+    def ensure_homebrew_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
         packages = [
             ('yasm', 'yasm'),
         ]
         self._ensure_homebrew_packages(packages)
 
         installed = self.check_output([self.brew, 'list']).split()
         if self.os_version < StrictVersion('10.7') and b'llvm' not in installed:
             print(PACKAGE_MANAGER_OLD_CLANG % ('Homebrew',))
@@ -403,17 +407,18 @@ class OSXBootstrapper(BaseBootstrapper):
             'autoconf213',
             'gnutar',
             'watchman',
         ]
 
         self._ensure_macports_packages(packages)
         self.run_as_root([self.port, 'select', '--set', 'python', 'python27'])
 
-    def ensure_macports_browser_packages(self):
+    def ensure_macports_browser_packages(self, artifact_mode=False):
+        # TODO: Figure out what not to install for artifact mode
         packages = ['yasm']
 
         self._ensure_macports_packages(packages)
 
         installed = set(self.check_output([self.port, 'installed']).split())
         if self.os_version < StrictVersion('10.7') and MACPORTS_CLANG_PACKAGE not in installed:
             print(PACKAGE_MANAGER_OLD_CLANG % ('MacPorts',))
             self.run_as_root([self.port, '-v', 'install', MACPORTS_CLANG_PACKAGE])