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