linux

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