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    wayland-devel
 95    libxcb-devel
 96    libxkbcommon-x11-devel
 97    openssl-devel
 98    libzstd-devel
 99    vulkan-loader
100    sqlite-devel
101    jq
102    git
103    tar
104  )
105  # perl used for building openssl-sys crate. See: https://docs.rs/openssl/latest/openssl/
106  if grep -qP '^ID="?(fedora)' /etc/os-release; then
107    deps+=(
108      perl-FindBin
109      perl-IPC-Cmd
110      perl-File-Compare
111      perl-File-Copy
112      mold
113    )
114  elif grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release; then
115    deps+=( perl-interpreter )
116  fi
117
118  # gcc-c++ is g++ on RHEL8 and 8.x clones
119  if grep -qP '^ID="?(rhel|rocky|alma|centos|ol)' /etc/os-release \
120      && grep -qP '^VERSION_ID="?(8)' /etc/os-release; then
121    deps+=( gcc-c++ )
122  else
123    deps+=( g++ )
124  fi
125
126  # libxkbcommon-x11-devel is in a non-default repo on RHEL 8.x/9.x (except on AmazonLinux)
127  if grep -qP '^VERSION_ID="?(8|9)' /etc/os-release && grep -qP '^ID="?(rhel|rocky|centos|alma|ol)' /etc/os-release; then
128    $maysudo dnf install -y 'dnf-command(config-manager)'
129    if grep -qP '^PRETTY_NAME="(AlmaLinux 8|Rocky Linux 8)' /etc/os-release; then
130      $maysudo dnf config-manager --set-enabled powertools
131    elif grep -qP '^PRETTY_NAME="((AlmaLinux|Rocky|CentOS Stream) 9|Red Hat.+(8|9))' /etc/os-release; then
132      $maysudo dnf config-manager --set-enabled crb
133    elif grep -qP '^PRETTY_NAME="Oracle Linux Server 8' /etc/os-release; then
134      $maysudo dnf config-manager --set-enabled ol8_codeready_builder
135    elif grep -qP '^PRETTY_NAME="Oracle Linux Server 9' /etc/os-release; then
136      $maysudo dnf config-manager --set-enabled ol9_codeready_builder
137    else
138      echo "Unexpected distro" && grep 'PRETTY_NAME' /etc/os-release && exit 1
139    fi
140  fi
141
142  $maysudo "$pkg_cmd" install -y "${deps[@]}"
143  finalize
144  exit 0
145fi
146
147# openSUSE
148# https://software.opensuse.org/
149zyp=$(command -v zypper || true)
150if [[ -n $zyp ]]; then
151  deps=(
152    alsa-devel
153    clang
154    cmake
155    fontconfig-devel
156    gcc
157    gcc-c++
158    glib2-devel
159    git
160    gzip
161    jq
162    libvulkan1
163    libx11-devel
164    libxcb-devel
165    libxkbcommon-devel
166    libxkbcommon-x11-devel
167    libzstd-devel
168    make
169    mold
170    openssl-devel
171    sqlite3-devel
172    tar
173    wayland-devel
174    xcb-util-devel
175  )
176  $maysudo "$zyp" install -y "${deps[@]}"
177  finalize
178  exit 0
179fi
180
181# Arch, Manjaro, etc.
182# https://archlinux.org/packages
183pacman=$(command -v pacman || true)
184if [[ -n $pacman ]]; then
185  deps=(
186    gcc
187    clang
188    musl
189    cmake
190    alsa-lib
191    fontconfig
192    glib2
193    wayland
194    libgit2
195    libxcb
196    libxkbcommon-x11
197    openssl
198    zstd
199    pkgconf
200    mold
201    sqlite
202    jq
203    git
204  )
205  $maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}"
206  finalize
207  exit 0
208fi
209
210# Void
211# https://voidlinux.org/packages/
212xbps=$(command -v xbps-install || true)
213if [[ -n $xbps ]]; then
214  deps=(
215    gettext-devel
216    clang
217    cmake
218    jq
219    elfutils-devel
220    gcc
221    alsa-lib-devel
222    fontconfig-devel
223    glib-devel
224    libxcb-devel
225    libxkbcommon-devel
226    libzstd-devel
227    openssl-devel
228    wayland-devel
229    vulkan-loader
230    mold
231    sqlite-devel
232  )
233  $maysudo "$xbps" -Syu "${deps[@]}"
234  finalize
235  exit 0
236fi
237
238# Gentoo
239# https://packages.gentoo.org/
240emerge=$(command -v emerge || true)
241if [[ -n $emerge ]]; then
242  deps=(
243    app-arch/zstd
244    app-misc/jq
245    dev-libs/glib
246    dev-libs/openssl
247    dev-libs/wayland
248    dev-util/cmake
249    media-libs/alsa-lib
250    media-libs/fontconfig
251    media-libs/vulkan-loader
252    x11-libs/libxcb
253    x11-libs/libxkbcommon
254    sys-devel/mold
255    dev-db/sqlite
256  )
257  $maysudo "$emerge" -u "${deps[@]}"
258  finalize
259  exit 0
260fi
261
262echo "Unsupported Linux distribution in script/linux"
263exit 1