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