chromium/tools/nix/shell.nix

# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

{ pkgs ? import <nixpkgs> {} }:
(pkgs.buildFHSEnv {
  name = "chromium-env";

  targetPkgs = pkgs: (with pkgs; [
    ## for reclient...

    # E0508 08:28:41.337763 2357393 auth.go:527] Credentials helper warnings and
    # ... errors: E0508 08:28:41.335345 2357400 main.go:64] Failed to initialize
    # ... credentials: failed to retrieve gcloud credentials. gcloud not
    # ... installed: exec: "gcloud": executable file not found in $PATH
    google-cloud-sdk

    ## for `autoninja -C out/Debug content_shell`...

    # ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned
    # ... non-zero exit code.
    # FileNotFoundError: [Errno 2] No such file or directory: 'pkg-config'
    pkg-config

    # ../../third_party/llvm-build/Release+Asserts/bin/clang++: error while
    # ... loading shared libraries: libz.so.1: cannot open shared object file:
    # ... No such file or directory
    # ../../third_party/rust-toolchain/bin/rustc: error while loading shared
    # ... libraries: libz.so.1: cannot open shared object file: No such file or
    # ... directory
    zlib

    # FileNotFoundError: [Errno 2] No such file or directory: 'gperf'
    gperf

    # subprocess.CalledProcessError: Command '['/cuffs/build/chromium/src/out/
    # ...Reclient/wayland_scanner', '--version']' returned non-zero exit status
    # ... 127.
    # => /cuffs/build/chromium/src/out/Reclient/wayland_scanner: error while
    # ... loading shared libraries: libexpat.so.1: cannot open shared object
    # ... file: No such file or directory
    expat

    # ./root_store_tool: error while loading shared libraries: <soname>: cannot
    # ... open shared object file: No such file or directory
    glib # libglib-2.0.so.0
    nss # libnss3.so

    # ./transport_security_state_generator: error while loading shared
    # ... libraries: libnspr4.so: cannot open shared object file: No such file
    # ... or directory
    nspr

    # ././v8_context_snapshot_generator: error while loading shared libraries:
    # ... <soname>: cannot open shared object file: No such file or directory
    xorg.libX11 # libX11.so.6
    xorg.libXcomposite # libXcomposite.so.1
    xorg.libXdamage # libXdamage.so.1
    xorg.libXext # libXext.so.6
    xorg.libXfixes # libXfixes.so.3
    xorg.libXrandr # libXrandr.so.2
    xorg.libXtst # libXtst.so.6
    mesa # libgbm.so.1
    libdrm # libdrm.so.2
    alsa-lib # libasound.so.2
    libxkbcommon # libxkbcommon.so.0
    pango # libpango-1.0.so.0
    dbus # libdbus-1.so.3

    ## for `content_shell`...

    # out/Default/content_shell: error while loading shared libraries: <soname>:
    # ... cannot open shared object file: No such file or directory
    at-spi2-atk # libatk-1.0.so.0
    xorg.libxcb # libxcb.so.1
    cairo # libcairo.so.2

    # [788412:788449:0502/062912.187804:FATAL:udev_loader.cc(48)] Check failed:
    # ... false.
    systemd

    ## for `third_party/blink/tools/run_web_tests.py`...

    # FileNotFoundError raised: [Errno 2] No such file or directory: 'xdpyinfo'
    xorg.xdpyinfo

    ## for `chrome`...

    # out/Default/chrome: error while loading shared libraries: libcups.so.2:
    # cannot open shared object file: No such file or directory
    cups

    ## for clangd with remote indexing support...
    ## (see <https://github.com/clangd/chrome-remote-index>)
    (stdenv.mkDerivation rec {
      pname = "clangd";
      version = "18.1.3";
      src = fetchTarball "https://github.com/clangd/clangd/releases/download/${version}/${pname}-linux-${version}.zip";
      # autoPatchelfHook lets you run clangd (and your editor) outside this nix-shell
      nativeBuildInputs = [ autoPatchelfHook ];
      installPhase = ''
        mkdir -p $out
        mv bin $out
        mv lib $out
      '';
    })
  ]);

  # workaround for `nix-shell --run '...'` not working with buildFHSEnv.
  # instead use `NIX_SHELL_RUN='...' nix-shell`.
  runScript = pkgs.writeShellScript "chromium-env-run" (''
    if [ -n "$''+''{NIX_SHELL_RUN:+set}" ]; then
      eval "$NIX_SHELL_RUN"
    else
      exec bash
    fi
  '');
}).env