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