blob: b4d1ad8cc152207a61ae4843c062446a0c2a083e [file] [log] [blame]
# 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',
'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.aur_install(*self.BROWSER_AUR_PACKAGES)
self.pacman_install(*self.BROWSER_PACKAGES)
def install_mobile_android_packages(self):
import android
# Multi-part process:
# 1. System packages.
# 2. Android SDK and NDK.
# 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-r10e}.
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-r10e'))
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)
android_tool = os.path.join(self.sdk_path, 'tools', 'android')
android.ensure_android_packages(android_tool=android_tool)
def suggest_mobile_android_mozconfig(self):
import android
android.suggest_mozconfig(sdk_path=self.sdk_path,
ndk_path=self.ndk_path)
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']
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):
subprocess.check_call(command, stdin=sys.stdin)
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']
self.run(command)
pack = glob.glob(name + '*.tar.xz')[0]
command = ['pacman', '-U', pack]
self.run_as_root(command)
def aur_install(self, *packages):
path = tempfile.mkdtemp()
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)