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  # 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