summaryrefslogtreecommitdiffstats
path: root/python/mozboot/mozboot/archlinux.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozboot/mozboot/archlinux.py')
-rw-r--r--python/mozboot/mozboot/archlinux.py223
1 files changed, 223 insertions, 0 deletions
diff --git a/python/mozboot/mozboot/archlinux.py b/python/mozboot/mozboot/archlinux.py
new file mode 100644
index 000000000..12ce6b4a4
--- /dev/null
+++ b/python/mozboot/mozboot/archlinux.py
@@ -0,0 +1,223 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import os
+import sys
+import tempfile
+import subprocess
+import glob
+
+from mozboot.base import BaseBootstrapper
+
+
+class ArchlinuxBootstrapper(BaseBootstrapper):
+ '''Archlinux experimental bootstrapper.'''
+
+ SYSTEM_PACKAGES = [
+ 'autoconf2.13',
+ 'base-devel',
+ 'ccache',
+ 'mercurial',
+ 'python2',
+ 'python2-setuptools',
+ 'unzip',
+ 'zip',
+ ]
+
+ BROWSER_PACKAGES = [
+ 'alsa-lib',
+ 'dbus-glib',
+ 'desktop-file-utils',
+ 'gconf',
+ 'gtk2',
+ 'gtk3',
+ 'hicolor-icon-theme',
+ 'hunspell',
+ 'icu',
+ 'libevent',
+ 'libvpx',
+ 'libxt',
+ 'mime-types',
+ 'mozilla-common',
+ 'nss',
+ 'sqlite',
+ 'startup-notification',
+ 'diffutils',
+ 'gst-plugins-base-libs',
+ 'imake',
+ 'inetutils',
+ 'libpulse',
+ 'mercurial',
+ 'mesa',
+ 'python2',
+ 'unzip',
+ 'xorg-server-xvfb',
+ 'yasm',
+ 'zip',
+ 'gst-libav',
+ 'gst-plugins-good',
+ 'networkmanager',
+ ]
+
+ BROWSER_AUR_PACKAGES = [
+ 'https://aur.archlinux.org/cgit/aur.git/snapshot/uuid.tar.gz',
+ ]
+
+ MOBILE_ANDROID_COMMON_PACKAGES = [
+ 'zlib', # mobile/android requires system zlib.
+ 'jdk7-openjdk', # It would be nice to handle alternative JDKs. See https://wiki.archlinux.org/index.php/Java.
+ 'wget', # For downloading the Android SDK and NDK.
+ 'multilib/lib32-libstdc++5', # See comment about 32 bit binaries and multilib below.
+ 'multilib/lib32-ncurses',
+ 'multilib/lib32-readline',
+ 'multilib/lib32-zlib',
+ ]
+
+ 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.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.
+
+ # 1. This is hard to believe, but the Android SDK binaries are 32-bit
+ # and that conflicts with 64-bit Arch installations out of the box. The
+ # solution is to add the multilibs repository; unfortunately, this
+ # requires manual intervention.
+ try:
+ self.pacman_install(*self.MOBILE_ANDROID_COMMON_PACKAGES)
+ except e:
+ print('Failed to install all packages. The Android developer '
+ 'toolchain requires 32 bit binaries be enabled (see '
+ 'https://wiki.archlinux.org/index.php/Android). You may need to '
+ 'manually enable the multilib repository following the instructions '
+ 'at https://wiki.archlinux.org/index.php/Multilib.')
+ raise e
+
+ # 2. The user may have an external Android SDK (in which case we save
+ # them a lengthy download), or they may have already completed the
+ # download. We unpack to ~/.mozbuild/{android-sdk-linux, android-ndk-r11b}.
+ mozbuild_path = os.environ.get('MOZBUILD_STATE_PATH', os.path.expanduser(os.path.join('~', '.mozbuild')))
+ self.sdk_path = os.environ.get('ANDROID_SDK_HOME', os.path.join(mozbuild_path, 'android-sdk-linux'))
+ self.ndk_path = os.environ.get('ANDROID_NDK_HOME', os.path.join(mozbuild_path, 'android-ndk-r11b'))
+ self.sdk_url = 'https://dl.google.com/android/android-sdk_r24.0.1-linux.tgz'
+ self.ndk_url = android.android_ndk_url('linux')
+
+ android.ensure_android_sdk_and_ndk(path=mozbuild_path,
+ sdk_path=self.sdk_path, sdk_url=self.sdk_url,
+ ndk_path=self.ndk_path, ndk_url=self.ndk_url,
+ artifact_mode=artifact_mode)
+ android_tool = os.path.join(self.sdk_path, 'tools', 'android')
+ android.ensure_android_packages(android_tool=android_tool)
+
+ def suggest_mobile_android_mozconfig(self, artifact_mode=False):
+ import android
+ android.suggest_mozconfig(sdk_path=self.sdk_path,
+ ndk_path=self.ndk_path,
+ artifact_mode=artifact_mode)
+
+ def suggest_mobile_android_artifact_mode_mozconfig(self):
+ self.suggest_mobile_android_mozconfig(artifact_mode=True)
+
+ def _update_package_manager(self):
+ self.pacman_update
+
+ def upgrade_mercurial(self, current):
+ self.pacman_install('mercurial')
+
+ def upgrade_python(self, current):
+ self.pacman_install('python2')
+
+ def pacman_install(self, *packages):
+ command = ['pacman', '-S', '--needed']
+ if self.no_interactive:
+ command.append('--noconfirm')
+
+ command.extend(packages)
+
+ self.run_as_root(command)
+
+ def pacman_update(self):
+ command = ['pacman', '-S', '--refresh']
+
+ self.run_as_root(command)
+
+ def run(self, command, env=None):
+ subprocess.check_call(command, stdin=sys.stdin, env=env)
+
+ def download(self, uri):
+ command = ['curl', '-L', '-O', uri]
+ self.run(command)
+
+ def unpack(self, path, name, ext):
+ if ext == 'gz':
+ compression = '-z'
+ elif ext == 'bz':
+ compression == '-j'
+ elif exit == 'xz':
+ compression == 'x'
+
+ name = os.path.join(path, name) + '.tar.' + ext
+ command = ['tar', '-x', compression, '-f', name, '-C', path]
+ self.run(command)
+
+ def makepkg(self, name):
+ command = ['makepkg', '-s']
+ makepkg_env = os.environ.copy()
+ makepkg_env['PKGEXT'] = '.pkg.tar.xz'
+ self.run(command, env=makepkg_env)
+ pack = glob.glob(name + '*.pkg.tar.xz')[0]
+ command = ['pacman', '-U']
+ if self.no_interactive:
+ command.append('--noconfirm')
+ command.append(pack)
+ self.run_as_root(command)
+
+ def aur_install(self, *packages):
+ path = tempfile.mkdtemp()
+ if not self.no_interactive:
+ print('WARNING! This script requires to install packages from the AUR '
+ 'This is potentially unsecure so I recommend that you carefully '
+ 'read each package description and check the sources.'
+ 'These packages will be built in ' + path + '.')
+ choice = raw_input('Do you want to continue? (yes/no) [no]')
+ if choice != 'yes':
+ sys.exit(1)
+
+ base_dir = os.getcwd()
+ os.chdir(path)
+ for package in packages:
+ name, _, ext = package.split('/')[-1].split('.')
+ directory = os.path.join(path, name)
+ self.download(package)
+ self.unpack(path, name, ext)
+ os.chdir(directory)
+ self.makepkg(name)
+
+ os.chdir(base_dir)