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