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