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