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
 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    libglib2.0-dev
 32    libssl-dev
 33    libva-dev
 34    libvulkan1
 35    libwayland-dev
 36    libx11-xcb-dev
 37    libxkbcommon-x11-dev
 38    libzstd-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="(Debian|Raspbian).+13' /etc/os-release); then
 53      # libstdc++-14-dev is in build-essential
 54      deps+=( mold )
 55  elif (grep -qP 'PRETTY_NAME="(Linux Mint 22|.+24\.(04|10))' /etc/os-release); then
 56    deps+=( mold libstdc++-14-dev )
 57  elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+12|Linux Mint 21|.+22\.04)' /etc/os-release); then
 58    deps+=( mold libstdc++-12-dev )
 59  elif (grep -qP 'PRETTY_NAME="((Debian|Raspbian).+11|Linux Mint 20|.+20\.04)' /etc/os-release); then
 60    # Ubuntu 20.04 ships clang-10 and libstdc++-10 which lack adequate C++20
 61    # support for building webrtc-sys (requires -std=c++20, lambdas in
 62    # unevaluated contexts from clang 17+, and working std::ranges in the
 63    # stdlib). clang-18 is available in focal-security/universe as an official
 64    # backport, and libstdc++-11-dev from the ubuntu-toolchain-r PPA provides
 65    # headers with working pointer_traits/contiguous_range.
 66    # Note: the prebuilt libwebrtc.a is compiled with libstdc++, so we must
 67    # use libstdc++ (not libc++) to avoid ABI mismatches at link time.
 68    $maysudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
 69    deps+=( clang-18 libstdc++-11-dev )
 70  fi
 71
 72  $maysudo "$apt" update
 73  $maysudo "$apt" install -y "${deps[@]}"
 74
 75  finalize
 76  exit 0
 77fi
 78
 79# Fedora, CentOS, RHEL, Alma, Amazon 2023, Oracle, etc.
 80dnf=$(command -v dnf || true)
 81# Old Redhat (yum only): Amazon Linux 2, Oracle Linux 7, etc.
 82yum=$(command -v yum || true)
 83
 84if [[ -n $dnf ]] || [[ -n $yum ]]; then
 85  pkg_cmd="${dnf:-${yum}}"
 86  deps=(
 87    musl-gcc
 88    gcc
 89    clang
 90    cmake
 91    alsa-lib-devel
 92    fontconfig-devel
 93    glib2-devel
 94    libva-devel
 95    wayland-devel
 96    libxcb-devel
 97    libxkbcommon-x11-devel
 98    openssl-devel
 99    libzstd-devel
100    vulkan-loader
101    sqlite-devel
102    jq
103    git
104    tar
105  )
106  # perl used for building openssl-sys crate. See: https://docs.rs/openssl/latest/openssl/
107  if grep -qP '^ID="?(fedora)' /etc/os-release; then
108    deps+=(
109      perl-FindBin
110      perl-IPC-Cmd
111      perl-File-Compare
112      perl-File-Copy
113      mold
114    )
115  elif grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release; then
116    deps+=( perl-interpreter )
117  fi
118
119  # gcc-c++ is g++ on RHEL8 and 8.x clones
120  if grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release \
121      && grep -qP '^VERSION_ID="?(8)' /etc/os-release; then
122    deps+=( gcc-c++ )
123  else
124    deps+=( g++ )
125  fi
126
127  # libxkbcommon-x11-devel is in a non-default repo on RHEL 8.x/9.x (except on AmazonLinux)
128  if grep -qP '^VERSION_ID="?(8|9)' /etc/os-release && grep -qP '^ID="?(rhel|rocky|centos|alma|ol)' /etc/os-release; then
129    $maysudo dnf install -y 'dnf-command(config-manager)'
130    if grep -qP '^PRETTY_NAME="(AlmaLinux 8|Rocky Linux 8)' /etc/os-release; then
131      $maysudo dnf config-manager --set-enabled powertools
132    elif grep -qP '^PRETTY_NAME="((AlmaLinux|Rocky|CentOS Stream) 9|Red Hat.+(8|9))' /etc/os-release; then
133      $maysudo dnf config-manager --set-enabled crb
134    elif grep -qP '^PRETTY_NAME="Oracle Linux Server 8' /etc/os-release; then
135      $maysudo dnf config-manager --set-enabled ol8_codeready_builder
136    elif grep -qP '^PRETTY_NAME="Oracle Linux Server 9' /etc/os-release; then
137      $maysudo dnf config-manager --set-enabled ol9_codeready_builder
138    else
139      echo "Unexpected distro" && grep 'PRETTY_NAME' /etc/os-release && exit 1
140    fi
141  fi
142
143  $maysudo "$pkg_cmd" install -y "${deps[@]}"
144  finalize
145  exit 0
146fi
147
148# openSUSE
149# https://software.opensuse.org/
150zyp=$(command -v zypper || true)
151if [[ -n $zyp ]]; then
152  deps=(
153    alsa-devel
154    clang
155    cmake
156    fontconfig-devel
157    gcc
158    libva-devel
159    gcc-c++
160    glib2-devel
161    git
162    gzip
163    jq
164    libvulkan1
165    libx11-devel
166    libxcb-devel
167    libxkbcommon-devel
168    libxkbcommon-x11-devel
169    libzstd-devel
170    make
171    mold
172    openssl-devel
173    sqlite3-devel
174    tar
175    wayland-devel
176    xcb-util-devel
177  )
178  $maysudo "$zyp" install -y "${deps[@]}"
179  finalize
180  exit 0
181fi
182
183# Arch, Manjaro, etc.
184# https://archlinux.org/packages
185pacman=$(command -v pacman || true)
186if [[ -n $pacman ]]; then
187  deps=(
188    gcc
189    clang
190    musl
191    cmake
192    alsa-lib
193    fontconfig
194    glib2
195    libva
196    wayland
197    libgit2
198    libxcb
199    libxkbcommon-x11
200    openssl
201    zstd
202    pkgconf
203    mold
204    sqlite
205    jq
206    git
207  )
208  $maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}"
209  finalize
210  exit 0
211fi
212
213# Void
214# https://voidlinux.org/packages/
215xbps=$(command -v xbps-install || true)
216if [[ -n $xbps ]]; then
217  deps=(
218    gettext-devel
219    clang
220    cmake
221    jq
222    elfutils-devel
223    gcc
224    alsa-lib-devel
225    fontconfig-devel
226    glib-devel
227    libva-devel
228    libxcb-devel
229    libxkbcommon-devel
230    libzstd-devel
231    openssl-devel
232    wayland-devel
233    vulkan-loader
234    mold
235    sqlite-devel
236  )
237  $maysudo "$xbps" -Syu "${deps[@]}"
238  finalize
239  exit 0
240fi
241
242# Gentoo
243# https://packages.gentoo.org/
244emerge=$(command -v emerge || true)
245if [[ -n $emerge ]]; then
246  deps=(
247    app-arch/zstd
248    app-misc/jq
249    dev-libs/glib
250    dev-libs/openssl
251    dev-libs/wayland
252    dev-util/cmake
253    media-libs/alsa-lib
254    media-libs/fontconfig
255    media-libs/libva
256    media-libs/vulkan-loader
257    x11-libs/libxcb
258    x11-libs/libxkbcommon
259    sys-devel/mold
260    dev-db/sqlite
261  )
262  $maysudo "$emerge" -u "${deps[@]}"
263  finalize
264  exit 0
265fi
266
267echo "Unsupported Linux distribution in script/linux"
268exit 1