1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
# 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/.
from __future__ import absolute_import, print_function, unicode_literals
import os
import sys
import tempfile
import subprocess
import glob
from mozboot.base import BaseBootstrapper
from mozboot.linux_common import LinuxBootstrapper
# NOTE: This script is intended to be run with a vanilla Python install. We
# have to rely on the standard library instead of Python 2+3 helpers like
# the six module.
if sys.version_info < (3,):
input = raw_input # noqa
class ArchlinuxBootstrapper(LinuxBootstrapper, BaseBootstrapper):
"""Archlinux experimental bootstrapper."""
SYSTEM_PACKAGES = [
"base-devel",
"nodejs",
"unzip",
"zip",
]
BROWSER_PACKAGES = [
"alsa-lib",
"dbus-glib",
"gtk2",
"gtk3",
"libevent",
"libvpx",
"libxt",
"mime-types",
"nasm",
"startup-notification",
"gst-plugins-base-libs",
"libpulse",
"xorg-server-xvfb",
"yasm",
"gst-libav",
"gst-plugins-good",
]
BROWSER_AUR_PACKAGES = [
"https://aur.archlinux.org/cgit/aur.git/snapshot/uuid.tar.gz",
]
MOBILE_ANDROID_COMMON_PACKAGES = [
# It would be nice to handle alternative JDKs. See
# https://wiki.archlinux.org/index.php/Java.
"jdk8-openjdk",
# For downloading the Android SDK and NDK.
"wget",
# 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, mozconfig_builder):
self.ensure_browser_packages()
def install_browser_artifact_mode_packages(self, mozconfig_builder):
self.ensure_browser_packages(artifact_mode=True)
def install_mobile_android_packages(self, mozconfig_builder):
self.ensure_mobile_android_packages(mozconfig_builder)
def install_mobile_android_artifact_mode_packages(self, mozconfig_builder):
self.ensure_mobile_android_packages(mozconfig_builder, 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_nasm_packages(self, state_dir, checkout_root):
# installed via ensure_browser_packages
pass
def ensure_mobile_android_packages(self, mozconfig_builder, artifact_mode=False):
# Multi-part process:
# 1. System packages.
# 2. Android SDK. Android NDK only if we are not in artifact mode. 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 Exception as 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. Android pieces.
self.ensure_java(mozconfig_builder)
super().ensure_mobile_android_packages(artifact_mode=artifact_mode)
def _update_package_manager(self):
self.pacman_update()
def upgrade_mercurial(self, current):
self.pacman_install("mercurial")
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["PKGDEST"] = "."
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 = 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)
|