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