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). clang-18 is available in focal-security/universe as an official
64 # backport, and libstdc++-11-dev from the ubuntu-toolchain-r PPA provides
65 # headers with working pointer_traits/contiguous_range.
66 # Note: the prebuilt libwebrtc.a is compiled with libstdc++, so we must
67 # use libstdc++ (not libc++) to avoid ABI mismatches at link time.
68 $maysudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
69 deps+=( clang-18 libstdc++-11-dev )
70 fi
71
72 $maysudo "$apt" update
73 $maysudo "$apt" install -y "${deps[@]}"
74
75 finalize
76 exit 0
77fi
78
79# Fedora, CentOS, RHEL, Alma, Amazon 2023, Oracle, etc.
80dnf=$(command -v dnf || true)
81# Old Redhat (yum only): Amazon Linux 2, Oracle Linux 7, etc.
82yum=$(command -v yum || true)
83
84if [[ -n $dnf ]] || [[ -n $yum ]]; then
85 pkg_cmd="${dnf:-${yum}}"
86 deps=(
87 musl-gcc
88 gcc
89 clang
90 cmake
91 alsa-lib-devel
92 fontconfig-devel
93 glib2-devel
94 libva-devel
95 wayland-devel
96 libxcb-devel
97 libxkbcommon-x11-devel
98 openssl-devel
99 libzstd-devel
100 vulkan-loader
101 sqlite-devel
102 jq
103 git
104 tar
105 )
106 # perl used for building openssl-sys crate. See: https://docs.rs/openssl/latest/openssl/
107 if grep -qP '^ID="?(fedora)' /etc/os-release; then
108 deps+=(
109 perl-FindBin
110 perl-IPC-Cmd
111 perl-File-Compare
112 perl-File-Copy
113 mold
114 )
115 elif grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release; then
116 deps+=( perl-interpreter )
117 fi
118
119 # gcc-c++ is g++ on RHEL8 and 8.x clones
120 if grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release \
121 && grep -qP '^VERSION_ID="?(8)' /etc/os-release; then
122 deps+=( gcc-c++ )
123 else
124 deps+=( g++ )
125 fi
126
127 # libxkbcommon-x11-devel is in a non-default repo on RHEL 8.x/9.x (except on AmazonLinux)
128 if grep -qP '^VERSION_ID="?(8|9)' /etc/os-release && grep -qP '^ID="?(rhel|rocky|centos|alma|ol)' /etc/os-release; then
129 $maysudo dnf install -y 'dnf-command(config-manager)'
130 if grep -qP '^PRETTY_NAME="(AlmaLinux 8|Rocky Linux 8)' /etc/os-release; then
131 $maysudo dnf config-manager --set-enabled powertools
132 elif grep -qP '^PRETTY_NAME="((AlmaLinux|Rocky|CentOS Stream) 9|Red Hat.+(8|9))' /etc/os-release; then
133 $maysudo dnf config-manager --set-enabled crb
134 elif grep -qP '^PRETTY_NAME="Oracle Linux Server 8' /etc/os-release; then
135 $maysudo dnf config-manager --set-enabled ol8_codeready_builder
136 elif grep -qP '^PRETTY_NAME="Oracle Linux Server 9' /etc/os-release; then
137 $maysudo dnf config-manager --set-enabled ol9_codeready_builder
138 else
139 echo "Unexpected distro" && grep 'PRETTY_NAME' /etc/os-release && exit 1
140 fi
141 fi
142
143 $maysudo "$pkg_cmd" install -y "${deps[@]}"
144 finalize
145 exit 0
146fi
147
148# openSUSE
149# https://software.opensuse.org/
150zyp=$(command -v zypper || true)
151if [[ -n $zyp ]]; then
152 deps=(
153 alsa-devel
154 clang
155 cmake
156 fontconfig-devel
157 gcc
158 libva-devel
159 gcc-c++
160 glib2-devel
161 git
162 gzip
163 jq
164 libvulkan1
165 libx11-devel
166 libxcb-devel
167 libxkbcommon-devel
168 libxkbcommon-x11-devel
169 libzstd-devel
170 make
171 mold
172 openssl-devel
173 sqlite3-devel
174 tar
175 wayland-devel
176 xcb-util-devel
177 )
178 $maysudo "$zyp" install -y "${deps[@]}"
179 finalize
180 exit 0
181fi
182
183# Arch, Manjaro, etc.
184# https://archlinux.org/packages
185pacman=$(command -v pacman || true)
186if [[ -n $pacman ]]; then
187 deps=(
188 gcc
189 clang
190 musl
191 cmake
192 alsa-lib
193 fontconfig
194 glib2
195 libva
196 wayland
197 libgit2
198 libxcb
199 libxkbcommon-x11
200 openssl
201 zstd
202 pkgconf
203 mold
204 sqlite
205 jq
206 git
207 )
208 $maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}"
209 finalize
210 exit 0
211fi
212
213# Void
214# https://voidlinux.org/packages/
215xbps=$(command -v xbps-install || true)
216if [[ -n $xbps ]]; then
217 deps=(
218 gettext-devel
219 clang
220 cmake
221 jq
222 elfutils-devel
223 gcc
224 alsa-lib-devel
225 fontconfig-devel
226 glib-devel
227 libva-devel
228 libxcb-devel
229 libxkbcommon-devel
230 libzstd-devel
231 openssl-devel
232 wayland-devel
233 vulkan-loader
234 mold
235 sqlite-devel
236 )
237 $maysudo "$xbps" -Syu "${deps[@]}"
238 finalize
239 exit 0
240fi
241
242# Gentoo
243# https://packages.gentoo.org/
244emerge=$(command -v emerge || true)
245if [[ -n $emerge ]]; then
246 deps=(
247 app-arch/zstd
248 app-misc/jq
249 dev-libs/glib
250 dev-libs/openssl
251 dev-libs/wayland
252 dev-util/cmake
253 media-libs/alsa-lib
254 media-libs/fontconfig
255 media-libs/libva
256 media-libs/vulkan-loader
257 x11-libs/libxcb
258 x11-libs/libxkbcommon
259 sys-devel/mold
260 dev-db/sqlite
261 )
262 $maysudo "$emerge" -u "${deps[@]}"
263 finalize
264 exit 0
265fi
266
267echo "Unsupported Linux distribution in script/linux"
268exit 1