1#!/usr/bin/env bash
2
3set -xeuo pipefail
4
5# if root or if sudo/unavailable, define an empty variable
6if [ "$(id -u)" -eq 0 ]
7then maysudo=''
8else maysudo="$(command -v sudo || command -v doas || true)"
9fi
10
11function finalize {
12 # after packages install (curl, etc), get the rust toolchain
13 which rustup > /dev/null 2>&1 || curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
14 cat <<EOF
15Note: It's recommended to install and configure Wild or Mold for faster builds.
16 Run script/install-wild or script/install-mold.
17
18Finished installing Linux dependencies with script/linux
19EOF
20}
21
22# Ubuntu, Debian, Mint, Kali, Pop!_OS, Raspbian, etc.
23apt=$(command -v apt-get || true)
24if [[ -n $apt ]]; then
25 deps=(
26 gcc
27 g++
28 libasound2-dev
29 libfontconfig-dev
30 libgit2-dev
31 libglib2.0-dev
32 libssl-dev
33 libva-dev
34 libvulkan1
35 libwayland-dev
36 libx11-xcb-dev
37 libxkbcommon-x11-dev
38 libzstd-dev
39 make
40 cmake
41 clang
42 lld
43 llvm
44 jq
45 git
46 curl
47 gettext-base
48 elfutils
49 libsqlite3-dev
50 musl-tools
51 musl-dev
52 build-essential
53 pipewire
54 xdg-desktop-portal
55 )
56 if (grep -qP 'PRETTY_NAME="(Debian|Raspbian).+13' /etc/os-release); then
57 # libstdc++-14-dev is in build-essential
58 deps+=( mold )
59 elif (grep -qP 'PRETTY_NAME="(Linux Mint 22|.+24\.(04|10))' /etc/os-release); then
60 deps+=( mold libstdc++-14-dev )
61 elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+12|Linux Mint 21|.+22\.04)' /etc/os-release); then
62 deps+=( mold libstdc++-12-dev )
63 elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+11|Linux Mint 20|.+20\.04)' /etc/os-release); then
64 # Ubuntu 20.04 ships clang-10 and libstdc++-10 which lack adequate C++20
65 # support for building webrtc-sys (requires -std=c++20, lambdas in
66 # unevaluated contexts from clang 17+, and working std::ranges in the
67 # stdlib).
68 # Note: the prebuilt libwebrtc.a is compiled with libstdc++, so we must
69 # use libstdc++ (not libc++) to avoid ABI mismatches at link time.
70
71 # libstdc++-11-dev (headers with working pointer_traits/contiguous_range)
72 # is only available from the ubuntu-toolchain-r PPA. Add the source list
73 # and GPG key manually instead of using add-apt-repository, whose HKP
74 # keyserver lookups (port 11371) frequently time out in CI.
75 $maysudo "$apt" install -y curl gnupg
76 codename=$(lsb_release -cs)
77 echo "deb https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu $codename main" | \
78 $maysudo tee /etc/apt/sources.list.d/ubuntu-toolchain-r-test.list > /dev/null
79 curl -fsSL 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x1E9377A2BA9EF27F' | \
80 sed -n '/-----BEGIN PGP PUBLIC KEY BLOCK-----/,/-----END PGP PUBLIC KEY BLOCK-----/p' | \
81 $maysudo gpg --dearmor -o /etc/apt/trusted.gpg.d/ubuntu-toolchain-r-test.gpg
82 deps+=( clang-18 libstdc++-11-dev )
83 fi
84
85 $maysudo "$apt" update
86 $maysudo "$apt" install -y "${deps[@]}"
87
88 finalize
89 exit 0
90fi
91
92# Fedora, CentOS, RHEL, Alma, Amazon 2023, Oracle, etc.
93dnf=$(command -v dnf || true)
94# Old Redhat (yum only): Amazon Linux 2, Oracle Linux 7, etc.
95yum=$(command -v yum || true)
96
97if [[ -n $dnf ]] || [[ -n $yum ]]; then
98 pkg_cmd="${dnf:-${yum}}"
99 deps=(
100 musl-gcc
101 gcc
102 clang
103 cmake
104 alsa-lib-devel
105 fontconfig-devel
106 glib2-devel
107 libva-devel
108 wayland-devel
109 libxcb-devel
110 libxkbcommon-x11-devel
111 openssl-devel
112 libzstd-devel
113 vulkan-loader
114 sqlite-devel
115 pipewire
116 xdg-desktop-portal
117 jq
118 git
119 tar
120 )
121 # perl used for building openssl-sys crate. See: https://docs.rs/openssl/latest/openssl/
122 if grep -qP '^ID="?(fedora)' /etc/os-release; then
123 deps+=(
124 perl-FindBin
125 perl-IPC-Cmd
126 perl-File-Compare
127 perl-File-Copy
128 mold
129 )
130 elif grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release; then
131 deps+=( perl-interpreter )
132 fi
133
134 # gcc-c++ is g++ on RHEL8 and 8.x clones
135 if grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release \
136 && grep -qP '^VERSION_ID="?(8)' /etc/os-release; then
137 deps+=( gcc-c++ )
138 else
139 deps+=( g++ )
140 fi
141
142 # libxkbcommon-x11-devel is in a non-default repo on RHEL 8.x/9.x (except on AmazonLinux)
143 if grep -qP '^VERSION_ID="?(8|9)' /etc/os-release && grep -qP '^ID="?(rhel|rocky|centos|alma|ol)' /etc/os-release; then
144 $maysudo dnf install -y 'dnf-command(config-manager)'
145 if grep -qP '^PRETTY_NAME="(AlmaLinux 8|Rocky Linux 8)' /etc/os-release; then
146 $maysudo dnf config-manager --set-enabled powertools
147 elif grep -qP '^PRETTY_NAME="((AlmaLinux|Rocky|CentOS Stream) 9|Red Hat.+(8|9))' /etc/os-release; then
148 $maysudo dnf config-manager --set-enabled crb
149 elif grep -qP '^PRETTY_NAME="Oracle Linux Server 8' /etc/os-release; then
150 $maysudo dnf config-manager --set-enabled ol8_codeready_builder
151 elif grep -qP '^PRETTY_NAME="Oracle Linux Server 9' /etc/os-release; then
152 $maysudo dnf config-manager --set-enabled ol9_codeready_builder
153 else
154 echo "Unexpected distro" && grep 'PRETTY_NAME' /etc/os-release && exit 1
155 fi
156 fi
157
158 $maysudo "$pkg_cmd" install -y "${deps[@]}"
159 finalize
160 exit 0
161fi
162
163# openSUSE
164# https://software.opensuse.org/
165zyp=$(command -v zypper || true)
166if [[ -n $zyp ]]; then
167 deps=(
168 alsa-devel
169 clang
170 cmake
171 fontconfig-devel
172 gcc
173 libva-devel
174 gcc-c++
175 glib2-devel
176 git
177 gzip
178 jq
179 libvulkan1
180 libx11-devel
181 libxcb-devel
182 libxkbcommon-devel
183 libxkbcommon-x11-devel
184 libzstd-devel
185 make
186 mold
187 openssl-devel
188 sqlite3-devel
189 tar
190 wayland-devel
191 xcb-util-devel
192 pipewire
193 xdg-desktop-portal
194 )
195 $maysudo "$zyp" install -y "${deps[@]}"
196 finalize
197 exit 0
198fi
199
200# Arch, Manjaro, etc.
201# https://archlinux.org/packages
202pacman=$(command -v pacman || true)
203if [[ -n $pacman ]]; then
204 deps=(
205 gcc
206 clang
207 musl
208 cmake
209 alsa-lib
210 fontconfig
211 glib2
212 libva
213 wayland
214 libgit2
215 libxcb
216 libxkbcommon-x11
217 openssl
218 zstd
219 pkgconf
220 mold
221 sqlite
222 pipewire
223 xdg-desktop-portal
224 jq
225 git
226 )
227 $maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}"
228 finalize
229 exit 0
230fi
231
232# Void
233# https://voidlinux.org/packages/
234xbps=$(command -v xbps-install || true)
235if [[ -n $xbps ]]; then
236 deps=(
237 gettext-devel
238 clang
239 cmake
240 jq
241 elfutils-devel
242 gcc
243 alsa-lib-devel
244 fontconfig-devel
245 glib-devel
246 libva-devel
247 libxcb-devel
248 libxkbcommon-devel
249 libzstd-devel
250 openssl-devel
251 wayland-devel
252 vulkan-loader
253 mold
254 sqlite-devel
255 pipewire
256 xdg-desktop-portal
257 )
258 $maysudo "$xbps" -Syu "${deps[@]}"
259 finalize
260 exit 0
261fi
262
263# Gentoo
264# https://packages.gentoo.org/
265emerge=$(command -v emerge || true)
266if [[ -n $emerge ]]; then
267 deps=(
268 app-arch/zstd
269 app-misc/jq
270 dev-libs/glib
271 dev-libs/openssl
272 dev-libs/wayland
273 dev-util/cmake
274 media-libs/alsa-lib
275 media-libs/fontconfig
276 media-libs/libva
277 media-libs/vulkan-loader
278 x11-libs/libxcb
279 x11-libs/libxkbcommon
280 sys-devel/mold
281 dev-db/sqlite
282 media-video/pipewire
283 sys-apps/xdg-desktop-portal
284 )
285 $maysudo "$emerge" -u "${deps[@]}"
286 finalize
287 exit 0
288fi
289
290echo "Unsupported Linux distribution in script/linux"
291exit 1