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