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 Then add these lines to your ~/.cargo/config.toml:
18
19[target.x86_64-unknown-linux-gnu]
20linker = "clang"
21rustflags = ["-C", "link-arg=--ld-path=wild"]
22
23[target.aarch64-unknown-linux-gnu]
24linker = "clang"
25rustflags = ["-C", "link-arg=--ld-path=wild"]
26
27
28
29Finished installing Linux dependencies with script/linux
30EOF
31}
32
33# Ubuntu, Debian, Mint, Kali, Pop!_OS, Raspbian, etc.
34apt=$(command -v apt-get || true)
35if [[ -n $apt ]]; then
36 deps=(
37 gcc
38 g++
39 libasound2-dev
40 libfontconfig-dev
41 libwayland-dev
42 libx11-xcb-dev
43 libxkbcommon-x11-dev
44 libssl-dev
45 libzstd-dev
46 libvulkan1
47 libgit2-dev
48 make
49 cmake
50 clang
51 jq
52 git
53 curl
54 gettext-base
55 elfutils
56 libsqlite3-dev
57 musl-tools
58 musl-dev
59 build-essential
60 )
61 if (grep -qP 'PRETTY_NAME="(Debian|Raspbian).+13' /etc/os-release); then
62 # libstdc++-14-dev is in build-essential
63 deps+=( mold )
64 elif (grep -qP 'PRETTY_NAME="(Linux Mint 22|.+24\.(04|10))' /etc/os-release); then
65 deps+=( mold libstdc++-14-dev )
66 elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+12|Linux Mint 21|.+22\.04)' /etc/os-release); then
67 deps+=( mold libstdc++-12-dev )
68 elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+11|Linux Mint 20|.+20\.04)' /etc/os-release); then
69 deps+=( libstdc++-10-dev )
70 fi
71
72 $maysudo "$apt" update
73 $maysudo "$apt" install -y "${deps[@]}"
74 finalize
75 exit 0
76fi
77
78# Fedora, CentOS, RHEL, Alma, Amazon 2023, Oracle, etc.
79dnf=$(command -v dnf || true)
80# Old Redhat (yum only): Amazon Linux 2, Oracle Linux 7, etc.
81yum=$(command -v yum || true)
82
83if [[ -n $dnf ]] || [[ -n $yum ]]; then
84 pkg_cmd="${dnf:-${yum}}"
85 deps=(
86 musl-gcc
87 gcc
88 clang
89 cmake
90 alsa-lib-devel
91 fontconfig-devel
92 wayland-devel
93 libxcb-devel
94 libxkbcommon-x11-devel
95 openssl-devel
96 libzstd-devel
97 vulkan-loader
98 sqlite-devel
99 jq
100 git
101 tar
102 )
103 # perl used for building openssl-sys crate. See: https://docs.rs/openssl/latest/openssl/
104 if grep -qP '^ID="?(fedora)' /etc/os-release; then
105 deps+=(
106 perl-FindBin
107 perl-IPC-Cmd
108 perl-File-Compare
109 perl-File-Copy
110 mold
111 )
112 elif grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release; then
113 deps+=( perl-interpreter )
114 fi
115
116 # gcc-c++ is g++ on RHEL8 and 8.x clones
117 if grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release \
118 && grep -qP '^VERSION_ID="?(8)' /etc/os-release; then
119 deps+=( gcc-c++ )
120 else
121 deps+=( g++ )
122 fi
123
124 # libxkbcommon-x11-devel is in a non-default repo on RHEL 8.x/9.x (except on AmazonLinux)
125 if grep -qP '^VERSION_ID="?(8|9)' /etc/os-release && grep -qP '^ID="?(rhel|rocky|centos|alma|ol)' /etc/os-release; then
126 $maysudo dnf install -y 'dnf-command(config-manager)'
127 if grep -qP '^PRETTY_NAME="(AlmaLinux 8|Rocky Linux 8)' /etc/os-release; then
128 $maysudo dnf config-manager --set-enabled powertools
129 elif grep -qP '^PRETTY_NAME="((AlmaLinux|Rocky|CentOS Stream) 9|Red Hat.+(8|9))' /etc/os-release; then
130 $maysudo dnf config-manager --set-enabled crb
131 elif grep -qP '^PRETTY_NAME="Oracle Linux Server 8' /etc/os-release; then
132 $maysudo dnf config-manager --set-enabled ol8_codeready_builder
133 elif grep -qP '^PRETTY_NAME="Oracle Linux Server 9' /etc/os-release; then
134 $maysudo dnf config-manager --set-enabled ol9_codeready_builder
135 else
136 echo "Unexpected distro" && grep 'PRETTY_NAME' /etc/os-release && exit 1
137 fi
138 fi
139
140 $maysudo "$pkg_cmd" install -y "${deps[@]}"
141 finalize
142 exit 0
143fi
144
145# openSUSE
146# https://software.opensuse.org/
147zyp=$(command -v zypper || true)
148if [[ -n $zyp ]]; then
149 deps=(
150 alsa-devel
151 clang
152 cmake
153 fontconfig-devel
154 gcc
155 gcc-c++
156 git
157 gzip
158 jq
159 libvulkan1
160 libx11-devel
161 libxcb-devel
162 libxkbcommon-devel
163 libxkbcommon-x11-devel
164 libzstd-devel
165 make
166 mold
167 openssl-devel
168 sqlite3-devel
169 tar
170 wayland-devel
171 xcb-util-devel
172 )
173 $maysudo "$zyp" install -y "${deps[@]}"
174 finalize
175 exit 0
176fi
177
178# Arch, Manjaro, etc.
179# https://archlinux.org/packages
180pacman=$(command -v pacman || true)
181if [[ -n $pacman ]]; then
182 deps=(
183 gcc
184 clang
185 musl
186 cmake
187 alsa-lib
188 fontconfig
189 wayland
190 libgit2
191 libxcb
192 libxkbcommon-x11
193 openssl
194 zstd
195 pkgconf
196 mold
197 sqlite
198 jq
199 git
200 )
201 $maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}"
202 finalize
203 exit 0
204fi
205
206# Void
207# https://voidlinux.org/packages/
208xbps=$(command -v xbps-install || true)
209if [[ -n $xbps ]]; then
210 deps=(
211 gettext-devel
212 clang
213 cmake
214 jq
215 elfutils-devel
216 gcc
217 alsa-lib-devel
218 fontconfig-devel
219 libxcb-devel
220 libxkbcommon-devel
221 libzstd-devel
222 openssl-devel
223 wayland-devel
224 vulkan-loader
225 mold
226 sqlite-devel
227 )
228 $maysudo "$xbps" -Syu "${deps[@]}"
229 finalize
230 exit 0
231fi
232
233# Gentoo
234# https://packages.gentoo.org/
235emerge=$(command -v emerge || true)
236if [[ -n $emerge ]]; then
237 deps=(
238 app-arch/zstd
239 app-misc/jq
240 dev-libs/openssl
241 dev-libs/wayland
242 dev-util/cmake
243 media-libs/alsa-lib
244 media-libs/fontconfig
245 media-libs/vulkan-loader
246 x11-libs/libxcb
247 x11-libs/libxkbcommon
248 sys-devel/mold
249 dev-db/sqlite
250 )
251 $maysudo "$emerge" -u "${deps[@]}"
252 finalize
253 exit 0
254fi
255
256echo "Unsupported Linux distribution in script/linux"
257exit 1