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: 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    libx11-xcb-dev
 32    libxkbcommon-x11-dev
 33    libdbus-1-dev
 34    libpipewire-0.3-dev
 35    libssl-dev
 36    libzstd-dev
 37    libvulkan1
 38    libgit2-dev
 39    make
 40    cmake
 41    clang
 42    jq
 43    git
 44    curl
 45    gettext-base
 46    elfutils
 47    libsqlite3-dev
 48    musl-tools
 49    musl-dev
 50    build-essential
 51  )
 52  if (grep -qP 'PRETTY_NAME="(Linux Mint 22|.+24\.(04|10))' /etc/os-release); then
 53    deps+=( mold libstdc++-14-dev )
 54  elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+12|Linux Mint 21|.+22\.04)' /etc/os-release); then
 55    deps+=( mold libstdc++-12-dev )
 56  elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+11|Linux Mint 20|.+20\.04)' /etc/os-release); then
 57    deps+=( libstdc++-10-dev )
 58  fi
 59
 60  $maysudo "$apt" update
 61  $maysudo "$apt" install -y "${deps[@]}"
 62  finalize
 63  exit 0
 64fi
 65
 66# Fedora, CentOS, RHEL, Alma, Amazon 2023, Oracle, etc.
 67dnf=$(command -v dnf || true)
 68# Old Redhat (yum only): Amazon Linux 2, Oracle Linux 7, etc.
 69yum=$(command -v yum || true)
 70
 71if [[ -n $dnf ]] || [[ -n $yum ]]; then
 72  pkg_cmd="${dnf:-${yum}}"
 73  deps=(
 74    musl-gcc
 75    gcc
 76    clang
 77    cmake
 78    alsa-lib-devel
 79    fontconfig-devel
 80    wayland-devel
 81    libxcb-devel
 82    libxkbcommon-x11-devel
 83    dbus-devel
 84    pipewire-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    dbus-1-devel
144    fontconfig-devel
145    gcc
146    gcc-c++
147    git
148    gzip
149    jq
150    libvulkan1
151    libx11-devel
152    libxcb-devel
153    libxkbcommon-devel
154    libxkbcommon-x11-devel
155    libzstd-devel
156    make
157    mold
158    openssl-devel
159    pipewire-devel
160    sqlite3-devel
161    tar
162    wayland-devel
163    xcb-util-devel
164  )
165  $maysudo "$zyp" install -y "${deps[@]}"
166  finalize
167  exit 0
168fi
169
170# Arch, Manjaro, etc.
171# https://archlinux.org/packages
172pacman=$(command -v pacman || true)
173if [[ -n $pacman ]]; then
174  deps=(
175    gcc
176    clang
177    musl
178    cmake
179    alsa-lib
180    fontconfig
181    wayland
182    libgit2
183    libxcb
184    libxkbcommon-x11
185    dbus
186    libpipewire
187    openssl
188    zstd
189    pkgconf
190    mold
191    sqlite
192    jq
193    git
194  )
195  $maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}"
196  finalize
197  exit 0
198fi
199
200# Void
201# https://voidlinux.org/packages/
202xbps=$(command -v xbps-install || true)
203if [[ -n $xbps ]]; then
204  deps=(
205    gettext-devel
206    clang
207    cmake
208    jq
209    elfutils-devel
210    gcc
211    alsa-lib-devel
212    fontconfig-devel
213    libxcb-devel
214    libxkbcommon-devel
215    dbus-devel
216    pipewire-devel
217    libzstd-devel
218    openssl-devel
219    wayland-devel
220    vulkan-loader
221    mold
222    sqlite-devel
223  )
224  $maysudo "$xbps" -Syu "${deps[@]}"
225  finalize
226  exit 0
227fi
228
229# Gentoo
230# https://packages.gentoo.org/
231emerge=$(command -v emerge || true)
232if [[ -n $emerge ]]; then
233  deps=(
234    app-arch/zstd
235    app-misc/jq
236    dev-libs/openssl
237    dev-libs/wayland
238    dev-util/cmake
239    media-libs/alsa-lib
240    media-libs/fontconfig
241    media-libs/vulkan-loader
242    x11-libs/libxcb
243    x11-libs/libxkbcommon
244    sys-devel/mold
245    dev-db/sqlite
246  )
247  $maysudo "$emerge" -u "${deps[@]}"
248  finalize
249  exit 0
250fi
251
252echo "Unsupported Linux distribution in script/linux"
253exit 1