github: Minimize dependencies for document generation

Instead of install full dependencies with `install-deps` in GitHub
action, minimize dependencies because we use GitHub only for document
generation.

- Passed `CARGO_DOC` environment when running cargo-doc command so we
  can skip unnecessary build flow when we just want to generate API docs.
- Added a new script `install-docs-deps` to install only doc-related
  dependencies.

BUG=none
TEST=test on GitHub Action at my personal repository

Change-Id: Ibe988ab43215e285d946812bdd6c1536ae87b50e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3578144
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-by: Anton Romanov <romanton@google.com>
Commit-Queue: Keiichi Watanabe <keiichiw@chromium.org>
diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
index 02d9dec..f610126 100644
--- a/.github/workflows/gh-pages.yml
+++ b/.github/workflows/gh-pages.yml
@@ -20,7 +20,8 @@
           mdbook-version: 'latest'
       - name: Install Dependencies
         run: |
-          ./tools/install-deps
+          sudo apt update
+          ./tools/install-docs-deps
       - name: Run mdbook
         run: |
           mkdir -p docs/target/
diff --git a/base/build.rs b/base/build.rs
index 4517f2b..ffc6ef1 100644
--- a/base/build.rs
+++ b/base/build.rs
@@ -3,6 +3,11 @@
 // found in the LICENSE file.
 
 fn main() {
+    // Skip installing dependencies when generating documents.
+    if std::env::var("CARGO_DOC").is_ok() {
+        return;
+    }
+
     cc::Build::new()
         .file("src/windows/stdio_fileno.c")
         .compile("stdio_fileno");
diff --git a/gpu_display/build.rs b/gpu_display/build.rs
index 717c87a..41a44cb 100644
--- a/gpu_display/build.rs
+++ b/gpu_display/build.rs
@@ -71,6 +71,11 @@
 }
 
 fn main() {
+    // Skip installing dependencies when generating documents.
+    if std::env::var("CARGO_DOC").is_ok() {
+        return;
+    }
+
     println!("cargo:rerun-if-env-changed=WAYLAND_PROTOCOLS_PATH");
     let out_dir = env::var("OUT_DIR").unwrap();
 
diff --git a/media/libvda/build.rs b/media/libvda/build.rs
index 47fa015..95e71dc 100644
--- a/media/libvda/build.rs
+++ b/media/libvda/build.rs
@@ -3,6 +3,11 @@
 // found in the LICENSE file.
 
 fn main() {
+    // Skip installing dependencies when generating documents.
+    if std::env::var("CARGO_DOC").is_ok() {
+        return;
+    }
+
     #[allow(clippy::single_match)]
     match pkg_config::probe_library("libvda") {
         Ok(_) => (),
diff --git a/power_monitor/build.rs b/power_monitor/build.rs
index 174389d..77d6331 100644
--- a/power_monitor/build.rs
+++ b/power_monitor/build.rs
@@ -20,6 +20,11 @@
                 .collect()
         }
 
+        // Skip building dependencies when generating documents.
+        if std::env::var("CARGO_DOC").is_ok() {
+            return Ok(());
+        }
+
         let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
         let proto_root = match env::var("SYSROOT") {
             Ok(dir) => PathBuf::from(dir).join("usr/include/chromeos"),
diff --git a/rutabaga_gfx/build.rs b/rutabaga_gfx/build.rs
index da8e5ff..713ec02 100644
--- a/rutabaga_gfx/build.rs
+++ b/rutabaga_gfx/build.rs
@@ -165,6 +165,11 @@
 }
 
 fn main() -> Result<()> {
+    // Skip installing dependencies when generating documents.
+    if std::env::var("CARGO_DOC").is_ok() {
+        return Ok(());
+    }
+
     #[cfg(feature = "virgl_renderer")]
     virglrenderer()?;
 
diff --git a/tools/cargo-doc b/tools/cargo-doc
index 49df6e5..b48740f 100755
--- a/tools/cargo-doc
+++ b/tools/cargo-doc
@@ -38,6 +38,8 @@
     fi
 done
 
-cargo doc \
+# Set an environment variable 'CARGO_DOC' here so that each build.rs can skip
+# building unnecessary dependencies to generate documentations.
+CARGO_DOC="true" cargo doc \
       --manifest-path="${MANIFEST_PATH}" \
       --features="${features}" "$@"
diff --git a/tools/install-deps b/tools/install-deps
index 23aa211..dc11abf 100755
--- a/tools/install-deps
+++ b/tools/install-deps
@@ -15,7 +15,6 @@
     git \
     jq \
     libasound2-dev \
-    libcap-dev \
     libclang-dev \
     libdbus-1-dev \
     libdrm-dev \
@@ -28,7 +27,6 @@
     ninja-build \
     openssh-client \
     pkg-config \
-    protobuf-compiler \
     python3 \
     python3-pip \
     python3-setuptools \
@@ -56,7 +54,5 @@
 # The bindgen tool is required to build a crosvm dependency.
 cargo install bindgen
 
-# The mdbook and mdbook-mermaid tools are used to build the crosvm book.
-cargo install mdbook --no-default-features --version "^0.4.10"
-cargo install mdbook-mermaid --version "^0.8.3"
-cargo install mdbook-linkcheck --version "^0.7.6"
+# Install dependencies used to generate mdbook documentation.
+$(dirname "$0")/install-docs-deps
diff --git a/tools/install-docs-deps b/tools/install-docs-deps
new file mode 100755
index 0000000..1a8e593
--- /dev/null
+++ b/tools/install-docs-deps
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+# Copyright 2022 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Install dependencies to generate mdbook documentation.
+# Before running this script, `apt update` needs to be executed.
+
+set -ex
+
+# Install packages to run build.rs in some crate:
+# * libcap-dev: Used by minijail-sys/build.rs
+# * protobuf-compiler: Generates Rust files in protos
+sudo apt install --yes --no-install-recommends \
+     libcap-dev \
+     protobuf-compiler
+
+# The mdbook and mdbook-mermaid tools are used to build the crosvm book.
+cargo install mdbook --no-default-features --version "^0.4.10"
+cargo install mdbook-mermaid --version "^0.8.3"
+cargo install mdbook-linkcheck --version "^0.7.6"
diff --git a/tpm2-sys/build.rs b/tpm2-sys/build.rs
index a138fb1..d8c3fc7 100644
--- a/tpm2-sys/build.rs
+++ b/tpm2-sys/build.rs
@@ -57,6 +57,11 @@
 }
 
 fn main() -> Result<()> {
+    // Skip installing dependencies when generating documents.
+    if std::env::var("CARGO_DOC").is_ok() {
+        return Ok(());
+    }
+
     // Use tpm2 package from the standard system location if available.
     if pkg_config::Config::new()
         .statik(true)