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