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