Install this version:
emerge -a =dev-util/depot-tools-9999
If this version is masked, you can unmask it using the autounmask tool or standard emerge options:
autounmask =dev-util/depot-tools-9999
Or alternatively:
emerge --autounmask-write -a =dev-util/depot-tools-9999
| Version | EAPI | Keywords | Slot |
|---|---|---|---|
| 9999 | 8 | 0 |
# Copyright 2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit git-r3 shell-completion
DESCRIPTION="Collection of scripts and tools for building Chromium"
HOMEPAGE="
https://chromium.googlesource.com/chromium/tools/depot_tools/
https://www.chromium.org/developers/how-tos/install-depot-tools/
"
LICENSE="BSD"
SLOT="0"
IUSE="bash-completion zsh-completion"
# There are no release tarballs and the googlesource +archive endpoint
# is not byte-stable, so only a live ebuild is provided.
EGIT_REPO_URI="https://chromium.googlesource.com/chromium/tools/depot_tools"
EGIT_BRANCH="main"
BDEPEND="
app-arch/unzip
"
PATCHES=(
"${FILESDIR}/cipd-cache-root.patch"
"${FILESDIR}/fetch-no-distutils.patch"
"${FILESDIR}/find-in-path.patch"
)
src_unpack() {
git-r3_src_unpack
# gsutil.py normally downloads gsutil into external_bin/ at
# runtime, which fails on an installed (unwritable) package dir.
# Fetch and stage it at build time instead, so that it is
# installed as part of the package.
local gsutil_ver
gsutil_ver=$(sed -n 's/^VERSION = "\(.*\)"$/\1/p' "${S}/gsutil.py") || die
[[ ${gsutil_ver} ]] || die "cannot determine gsutil version from ${S}/gsutil.py"
wget -q -O "${WORKDIR}/gsutil_${gsutil_ver}.zip" \
"https://storage.googleapis.com/pub/gsutil_${gsutil_ver}.zip" || die
mkdir -p "${S}/external_bin/gsutil/gsutil_${gsutil_ver}" || die
unzip -q "${WORKDIR}/gsutil_${gsutil_ver}.zip" \
-d "${S}/external_bin/gsutil/gsutil_${gsutil_ver}" || die
}
src_prepare() {
default
# The git-* shims source python_runner.sh via a PATH lookup
# (type -P). Point them at the copy installed next to themselves
# instead, so python_runner.sh needs no /usr/bin entry of its own.
while IFS= read -r -d '' f; do
sed -i -e 's|^\. "\$(type -P python_runner\.sh)"$|. "$(dirname "$0")/python_runner.sh"|' "${f}" || die
done < <(grep --recursive --files-with-matches --null --exclude-dir=.git 'type -P python_runner.sh' "${S}")
}
src_install() {
libdir="/usr/$(get_libdir)/${PN}"
# Install man pages and docs into their standard locations, then
# drop them (and VCS metadata, tests and Windows bits) from the
# tree, which is installed whole (dotfiles and symlinks included)
# so the tools can find each other by relative path. doins
# installs every file with mode 0644, so restore the exec bits
# afterwards.
doman "${S}"/man/man1/*.1 "${S}"/man/man7/*.7
dodoc -r "${S}"/man/html
dodoc "${S}"/LICENSE "${S}"/README*.md "${S}"/metrics.README.md
use zsh-completion && dozshcomp "${S}"/zsh-goodies/_gclient
rm -rf "${S}/.git" "${S}/tests" "${S}/man" "${S}/zsh-goodies" || die
rm -f "${S}"/*.bat "${S}"/*.exe "${S}"/README*.md \
"${S}"/metrics.README.md "${S}"/LICENSE || die
shopt -s dotglob nullglob
files=( "${S}"/* )
shopt -u dotglob nullglob
insinto "${libdir}"
doins -r "${files[@]}"
# Restore the exec bits doins stripped.
while IFS= read -r -d '' f; do
chmod 0755 "${ED}${libdir}/${f#"${S}"/}" || die
done < <(find "${S}" -type f -perm -u+x -print0)
# Upstream's own switch to disable the self-update machinery
# (cf. update_depot_tools_toggle.py). DEPOT_TOOLS_UPDATE=0 keeps
# working as well.
touch "${ED}${libdir}/.disable_auto_update" || die
# Flag file that makes gsutil.py consider gsutil installed,
# preventing a re-download at runtime.
local gsutil_ver
gsutil_ver=$(sed -n 's/^VERSION = "\(.*\)"$/\1/p' "${S}/gsutil.py") || die
[[ ${gsutil_ver} ]] || die "cannot determine gsutil version from ${S}/gsutil.py"
echo "This flag file is dropped by gsutil.py" > \
"${ED}${libdir}/external_bin/gsutil/gsutil_${gsutil_ver}/gsutil/install.flag" || die
# Install the bash completions. The git fragments define _git_*
# functions which the standard git completion picks up on its own;
# they require the git completion from app-shells/bash-completion.
if use bash-completion; then
dobashcomp "${S}/git_completion.sh" "${S}/git_cl_completion.sh"
newbashcomp "${S}/gclient_completion.sh" "gclient"
fi
# The tools derive their location from $0, so /usr/bin entries
# cannot point at them directly (that would make $0 resolve to
# /usr/bin); they are symlinks to a single dispatcher that
# re-execs the tool by its real path, keeping $0 correct.
exeinto "${libdir}"
doexe "${FILESDIR}/dispatcher"
# The symlinks are relative so they resolve inside the package,
# not against an existing install on the target system.
dispatcher_link="../$(get_libdir)/${PN}/dispatcher"
exeinto /usr/bin
while IFS= read -r name; do
case "${name}" in
python_runner.sh)
# Sourced (not executed) by the git-* shims, which
# src_prepare patched to find it next to themselves.
;;
*_completion.sh)
# Installed as bash completions, not a tool.
;;
WATCHLISTS)
# Data file with a stray executable bit, not a tool.
;;
black|isort|yapf|gn|gn.py|ninja|clang-format|repo)
# Already provided by dev-python/black, dev-python/isort,
# dev-python/yapf, dev-build/gn, app-alternatives/ninja,
# dev-clang/clang and dev-vcs/repo; skip to avoid file
# collisions. gn.py does not collide, but as the wrapper
# twin of gn it stays out of PATH for consistency.
;;
autoninja.py|build_telemetry.py|download_from_google_storage.py|fetch.py|gclient.py|git_cache.py|git_cl.py|git_find_releases.py|git_footers.py|git_freezer.py|git_hyper_blame.py|git_map.py|git_map_branches.py|git_mark_merge_base.py|git_nav_downstream.py|git_new_branch.py|git_number.py|git_rebase_update.py|git_rename_branch.py|git_reparent_branch.py|git_retry.py|git_squash_branch.py|git_squash_branch_tree.py|git_upstream_diff.py|google_java_format.py|metrics_xml_format.py|roll_dep.py|run_in_virtual_path.py|upload_to_google_storage.py)
# Implementation twins of the extensionless commands,
# which are the entry points.
;;
vpython3)
# Not exposed on the PATH itself: the dispatcher
# appends the package dir to PATH for every tool, so
# shebangs ('env vpython3') and subprocess lookups
# resolve the in-tree copy, which bootstraps the
# CIPD-managed Python the toolchain runs on.
;;
*)
dosym "${dispatcher_link}" "/usr/bin/${name}"
;;
esac
done < <(find "${S}" -maxdepth 1 -type f -perm -u+x ! -name '*.bat' -printf '%f\n')
}
pkg_postinst() {
ewarn "The depot_tools self-updater is disabled."
ewarn
ewarn "On first use, CIPD downloads the infrastructure tools (bb, luci,"
ewarn "luci-auth, rdb, ...) and the Python interpreter the vpython3"
ewarn "scripts run on into \${XDG_CACHE_HOME:-~/.cache}/depot_tools."
}
Manage flags for this package:
euse -i <flag> -p dev-util/depot-tools |
euse -E <flag> -p dev-util/depot-tools |
euse -D <flag> -p dev-util/depot-tools