# Copyright 2020 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.

# This ebuild is based on "chromeos-chrome.ebuild" to compile the chrome/icu
# package into shared libraries and install them. The essential difference is to
# do "chrome_make icu" rather than "chrome_make chrome". Besides, some other
# non-trivial modifications are:
#   - "chromium-source.eclass" is used to download chrome source code. Because
#     "chromeos-chrome.ebuild" and "chromium-source.eclass" download the chrome
#     source into the same location, the variables of "chromeos-chrome.ebuild"
#     are kept.
#   - "Control-flow integrity" (|is_cfi=false| and |use_cfi_cast=false|) is
#     turned off otherwise the generated .so will crash (Illegal instruction).
#   - Unrelated resource downloads (like for telemetry) are removed.
#   - Unrelated configuration (like ozone platforms) are removed.
#   - Unrelated features (like nacl) are disabled.
#   - Header folders and libraries are postfixed with "${CHROME_ICU_POSTFIX}".
#
# Significant changes from "chromeos-chrome.ebuild" are highlighted by "[Mod]".
#
# The GN output folder is named as "out_icu_${BOARD}".

EAPI=5

# TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
PYTHON_COMPAT=( python2_7 )
inherit binutils-funcs chromium-source cros-constants cros-sanitizers flag-o-matic multilib toolchain-funcs python-any-r1

DESCRIPTION="The ICU library copied from chrome/third_party"
HOMEPAGE="https://cs.chromium.org/chromium/src/third_party/icu/"

LICENSE="BSD"

SLOT="0/${PVR}"
KEYWORDS="~*"

# [Mod] Most of non-related IUSE flags are removed.
IUSE="
	asan
	chrome_internal
	component_build
	cups
	+libcxx
	msan
	neon
	+runhooks
	+thinlto
	ubsan
	verbose
	"

# [Mod] clear REQUIRED_USE.
REQUIRED_USE=""

# [Mod] Ozone platform variables are removed.

# The gclient hooks that run in src_prepare hit the network.
# https://crbug.com/731905
RESTRICT="network-sandbox mirror"

# Portage version without optional portage suffix.
CHROME_VERSION="${PV/_*/}"

# chrome destination directory
CHROME_DIR=/opt/google/chrome

# For compilation
DEPOT_TOOLS=/mnt/host/depot_tools
BUILDTYPE="${BUILDTYPE:-Release}"
BOARD="${BOARD:-${SYSROOT##/build/}}"
# [Mod] GN output dir is named as "out_icu_${BOARD}".
BUILD_OUT="${BUILD_OUT:-out_icu_${BOARD}}"

# [Mod] Change from "c" to avoid potential conflict with chromeos-chrome.ebuild.
BUILD_OUT_SYM="c_icu"

# [Mod] To differentiate with the standard ICU, we postfix the include headers
# folder and library names by "chrome". (see crbug.com/1059133 and b/151439301)
CHROME_ICU_POSTFIX="-chrome"

# [Mod] Order file and AFDO file variables/functions declared here are removed.

# [Mod] chrome/icu depends on nothing. Blocking the canonical icu package can
# let us notice the potential repetitions.
# [Mod] Old Chrome ebuilds installed icudtl.dat.
RDEPEND="
	!dev-libs/icu
	!<chromeos-base/chromeos-chrome-83.0.4098.4
"
DEPEND="
	net-print/cups
"

# [Mod] NaCl utilities are removed.

usetf()  { usex $1 true false ; }

set_build_args() {
	# [Mod] 1. Add a new arg "icu_disable_thin_archive=true".
	#       2. Set the values according to IUSE default value but disable
	#          unnecessary feature
	#       3. Set "is_cfi=false".
	BUILD_ARGS=(
		"icu_disable_thin_archive=true"

		# is_official_build sometimes implies extra optimizations (e.g. it will allow
		# ThinLTO to optimize more aggressively, if ThinLTO is enabled). Please note
		# that, despite the name, it should be usable by external users.
		#
		# Sanitizers don't like official builds.
		"is_official_build=$(use_sanitizers false true)"

		"is_debug=false"
		"${EXTRA_GN_ARGS}"
		"use_ozone=true"
		"use_evdev_gestures=false"
		# Use the Chrome OS toolchain and not the one bundled with Chromium.
		"linux_use_bundled_binutils=false"
		"use_debug_fission=false"
		"enable_remoting=false"
		"enable_nacl=false"
		"enable_nacl=false"
		"icu_use_data_file=true"
		# use_system_minigbm is set below.
		# HarfBuzz and FreeType need to be built together in a specific way
		# to get FreeType autohinting to work properly. Chromium bundles
		# FreeType and HarfBuzz to meet that need.
		# See crbug.com/694137 .
		"use_system_harfbuzz=false"
		"use_system_freetype=false"
		"use_system_libsync=false"
		"use_cups=$(usetf cups)"
		"use_bundled_fontconfig=false"

		# Clang features.
		"is_asan=$(usetf asan)"
		"is_msan=$(usetf msan)"
		"is_ubsan=$(usetf ubsan)"
		"is_clang=true"
		"cros_host_is_clang=true"
		"clang_use_chrome_plugins=false"
		"use_thin_lto=$(usetf thinlto)"
		"clang_use_chrome_plugins=false"
		"is_cfi=false"
		"use_cfi_cast=false"

		# Disable some unnecessary dependencies to avoid some trybot failure.
		"use_xkbcommon=false"
	)

	# BUILD_STRING_ARGS needs appropriate quoting. So, we keep them separate and
	# add them to BUILD_ARGS at the end.
	BUILD_STRING_ARGS=(
		"target_sysroot=${SYSROOT}"
		"system_libdir=$(get_libdir)"
		"pkg_config=$(tc-getPKG_CONFIG)"
		"target_os=chromeos"
		"host_pkg_config=$(tc-getBUILD_PKG_CONFIG)"
	)

	# Disable tcmalloc on ARMv6 since it fails to build (crbug.com/181385)
	if [[ ${CHOST} == armv6* ]]; then
		BUILD_ARGS+=( "arm_version=6" )
		BUILD_STRING_ARGS+=( "use_allocator=none" )
	fi

	if [[ ${CHOST} == armv6* ]]; then
		BUILD_ARGS+=( "arm_version=6" )
		BUILD_STRING_ARGS+=( "use_allocator=none" )
	fi

	# [Mod] Ozone platform configrations are removed.

	# Set proper build args for the arch
	case "${ARCH}" in
	x86)
		BUILD_STRING_ARGS+=( "target_cpu=x86" )
		;;
	arm)
		BUILD_ARGS+=(
			"arm_use_neon=$(usetf neon)"
			# To workaround the 4GB debug limit. crbug.com/792999.
			"blink_symbol_level=1"
		)
		BUILD_STRING_ARGS+=(
			"target_cpu=arm"
			"arm_float_abi=hard"
		)
		local arm_arch=$(get-flag march)
		if [[ -n "${arm_arch}" ]]; then
			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
		fi
		;;
	arm64)
		BUILD_STRING_ARGS+=(
			"target_cpu=arm64"
		)
		local arm_arch=$(get-flag march)
		if [[ -n "${arm_arch}" ]]; then
			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
		fi
		;;
	amd64)
		BUILD_STRING_ARGS+=( "target_cpu=x64" )
		;;
	mips)
		local mips_arch target_arch

		mips_arch="$($(tc-getCPP) ${CFLAGS} ${CPPFLAGS} -E -P - <<<_MIPS_ARCH)"
		# Strip away any enclosing quotes.
		mips_arch="${mips_arch//\"}"
		# TODO(benchan): Use tc-endian from toolchain-func to determine endianess
		# when Chrome later cares about big-endian.
		case "${mips_arch}" in
		mips64*)
			target_arch=mips64el
			;;
		*)
			target_arch=mipsel
			;;
		esac

		BUILD_STRING_ARGS+=(
			"target_cpu=${target_arch}"
			"mips_arch_variant=${mips_arch}"
		)
		;;
	*)
		die "Unsupported architecture: ${ARCH}"
		;;
	esac

	# [Mod] chrome_media configurations are removed.
	if use chrome_internal; then
		# Adding chrome branding specific variables.
		BUILD_ARGS+=( "is_chrome_branded=true" )
		# This test can only be build from internal sources.
		BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
		export CHROMIUM_BUILD='_google_Chrome'
		export OFFICIAL_BUILD='1'
		export CHROME_BUILD_TYPE='_official'
	fi

	BUILD_ARGS+=(
		"treat_warnings_as_errors=false"
	)

	if use component_build; then
		BUILD_ARGS+=( "is_component_build=true" )
	fi

	# [Mod] goma is disabled.
	BUILD_ARGS+=( "use_goma=false" )

	# [Mod] chrome_debug and debug_fission configurations are removed.

	# With ThinLTO, the linking landscape is very different than regular
	# linking. Some links (e.g., Chrome) can be very heavy and require
	# 40GB+ of RAM. Since we don't use ThinLTO's cache (crbug.com/964328),
	# heavy links are always going to be heavy, so it's faster to give them
	# ${ncpu} each and only have 1 happening at once.
	if use thinlto; then
		local thinlto_link_job_count

		if thinlto_link_job_count="$(grep -c ^processor /proc/cpuinfo)"; then
			BUILD_ARGS+=(
				"max_jobs_per_link=${thinlto_link_job_count}"
				"concurrent_links=1"
			)
		fi

	fi
}

# [Mod] Main content of unpack_chrome() is replaced by the unpack function in
# chromium-source.eclass.
unpack_chrome() {
	# Add depot_tools to PATH, local chroot builds fail otherwise.
	export PATH=${PATH}:${DEPOT_TOOLS}

	chromium-source_src_unpack
}

decide_chrome_origin() {
	# [Mod] change "chromeos-chrome-9999" to "chrome-icu-9999".
	local chrome_workon="=chromeos-base/chrome-icu-9999"
	local cros_workon_file="${SYSROOT}/etc/portage/package.keywords/cros-workon"
	if [[ -e "${cros_workon_file}" ]] && grep -q "${chrome_workon}" "${cros_workon_file}"; then
		# LOCAL_SOURCE is the default for cros_workon
		# Warn the user if CHROME_ORIGIN is already set
		if [[ -n "${CHROME_ORIGIN}" && "${CHROME_ORIGIN}" != LOCAL_SOURCE ]]; then
			ewarn "CHROME_ORIGIN is already set to ${CHROME_ORIGIN}."
			ewarn "This will prevent you from building from your local checkout."
			ewarn "Please run 'unset CHROME_ORIGIN' to reset Chrome"
			ewarn "to the default source location."
		fi
		: "${CHROME_ORIGIN:=LOCAL_SOURCE}"
	else
		# By default, pull from server
		: "${CHROME_ORIGIN:=SERVER_SOURCE}"
	fi
}

sandboxless_ensure_directory() {
	local dir
	for dir in "$@"; do
		if [[ ! -d "${dir}" ]] ; then
			# We need root access to create these directories, so we need to
			# use sudo. This implicitly disables the sandbox.
			sudo mkdir -p "${dir}" || die
			sudo chown "${PORTAGE_USERNAME}:portage" "${dir}" || die
			sudo chmod 0755 "${dir}" || die
		fi
	done
}

src_unpack() {
	tc-export CC CXX
	local WHOAMI=$(whoami)
	export EGCLIENT="${EGCLIENT:-${DEPOT_TOOLS}/gclient}"
	export ENINJA="${ENINJA:-${DEPOT_TOOLS}/ninja}"

	# Prevents gclient from updating self.
	export DEPOT_TOOLS_UPDATE=0

	# Prevent gclient metrics collection.
	export DEPOT_TOOLS_METRICS=0

	CHROME_SRC="chrome-src"
	if use chrome_internal; then
		CHROME_SRC+="-internal"
	fi

	# CHROME_CACHE_DIR is used for storing output artifacts, and is always a
	# regular directory inside the chroot (i.e. it's never mounted in, so it's
	# always safe to use cp -al for these artifacts).
	: "${CHROME_CACHE_DIR:="/var/cache/chromeos-chrome/${CHROME_SRC}"}"
	addwrite "${CHROME_CACHE_DIR}"

	# CHROME_DISTDIR is used for storing the source code, if any source code
	# needs to be unpacked at build time (e.g. in the SERVER_SOURCE scenario.)
	# It will be mounted into the chroot, so it is never safe to use cp -al
	# for these files.
	: "${CHROME_DISTDIR:="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/${CHROME_SRC}"}"
	addwrite "${CHROME_DISTDIR}"

	# Create storage directories.
	sandboxless_ensure_directory "${CHROME_DISTDIR}" "${CHROME_CACHE_DIR}"

	# [Mod] Calls of cros-credentials_setup is removed.

	decide_chrome_origin

	# [Mod] LOCAL_BINARY is not supported because chromium-source.eclass does not
	# support it.
	case "${CHROME_ORIGIN}" in
	LOCAL_SOURCE|SERVER_SOURCE)
		elog "CHROME_ORIGIN VALUE is ${CHROME_ORIGIN}"
		;;
	*)
		die "CHROME_ORIGIN not one of LOCAL_SOURCE, SERVER_SOURCE"
		;;
	esac

	# Prepare and set CHROME_ROOT based on CHROME_ORIGIN.
	# CHROME_ROOT is the location where the source code is used for compilation.
	# If we're in SERVER_SOURCE mode, CHROME_ROOT is CHROME_DISTDIR. In LOCAL_SOURCE
	# mode, this directory may be set manually to any directory. It may be mounted
	# into the chroot, so it is not safe to use cp -al for these files.
	# These are set here because $(whoami) returns the proper user here,
	# but 'root' at the root level of the file
	case "${CHROME_ORIGIN}" in
	(SERVER_SOURCE)
		elog "Using CHROME_VERSION = ${CHROME_VERSION}"
		if [[ ${WHOAMI} == "chrome-bot" ]]; then
			# TODO: Should add a sanity check that the version checked out is
			# what we actually want.  Not sure how to do that though.
			elog "Skipping syncing as cbuildbot ran SyncChrome for us."
		else
			unpack_chrome
		fi

		elog "set the chrome source root to ${CHROME_DISTDIR}"
		elog "From this point onwards there is no difference between \
			SERVER_SOURCE and LOCAL_SOURCE, since the fetch is done"
		CHROME_ROOT=${CHROME_DISTDIR}
		;;
	(LOCAL_SOURCE)
		: "${CHROME_ROOT:=/home/${WHOAMI}/chrome_root}"
		if [[ ! -d "${CHROME_ROOT}/src" ]]; then
			die "${CHROME_ROOT} does not contain a valid chromium checkout!"
		fi
		addwrite "${CHROME_ROOT}"
		;;
	esac

	# [Mod] Always call this because the case CHROME_ORIGIN=LOCAL_BINARY is
	# excluded.
	set_build_args

	ln -sf "${CHROME_ROOT}" "${WORKDIR}/${P}"

	export EGN="${EGN:-${CHROME_ROOT}/src/buildtools/linux64/gn}"
	einfo "Using GN from ${EGN}"

	# [Mod] License file is required for installation.
	cp "${CHROME_ROOT}/src/third_party/icu/LICENSE" "${WORKDIR}"

	# [Mod] Use flags internal_gles_conform, afdo_use, afdo_verify,
	# orderfile_verify and orderfile_use are all disabled.
	BUILD_STRING_ARGS+=( "chrome_orderfile_path=" )
}

# [Mod] add_api_keys() is removed because we do not need to access Google
# services.

# [Mod] src_prepare() is simplied because 1) we do not need to access Google
# services; 2) we exclude the case CHROME_ORIGIN=LOCAL_BINARY and 3) we do
# not need patches.
src_prepare() {
	cd "${CHROME_ROOT}/src" || die "Cannot chdir to ${CHROME_ROOT}"
	mkdir -p "${CHROME_CACHE_DIR}/src/${BUILD_OUT}"
	if [[ -n "${BUILD_OUT_SYM}" ]]; then
		rm -rf "${BUILD_OUT_SYM}" || die "Could not remove symlink"
		ln -sfT "${CHROME_CACHE_DIR}/src/${BUILD_OUT}" "${BUILD_OUT_SYM}" ||
			die "Could not create symlink for output directory"
	fi
}

# [Mod] setup_test_lists() is removed.

# Handle all CFLAGS/CXXFLAGS/etc... munging here.
setup_compile_flags() {
	# Chrome controls its own optimization settings, so this would be a nop
	# if we were to run it. Leave it here anyway as a grep-friendly marker.
	# cros_optimize_package_for_speed

	# The chrome makefiles specify -O and -g flags already, so remove the
	# portage flags.
	filter-flags -g -O*

	# Remove unsupported arm64 linker flag on arm32 builds.
	# https://crbug.com/889079
	use arm && filter-flags "-Wl,--fix-cortex-a53-843419"

	# There are some flags we want to only use in the ebuild.
	# The rest will be exported to the simple chrome workflow.
	EBUILD_CFLAGS=()
	EBUILD_CXXFLAGS=()
	EBUILD_LDFLAGS=()

	# LLVM needs this when parsing profiles.
	# See README on https://github.com/google/autofdo
	# For ARM, we do not need this flag because we don't get profiles
	# from ARM machines. And it triggers an llvm assertion when thinlto
	# and debug fission is used together.
	# See https://bugs.llvm.org/show_bug.cgi?id=37255
	use arm || append-flags -fdebug-info-for-profiling

	if use thinlto; then
		# We need to change the default value of import-instr-limit in
		# LLVM to limit the text size increase. The default value is
		# 100, and we change it to 30 to reduce the text size increase
		# from 25% to 10%. The performance number of page_cycler is the
		# same on two of the thinLTO configurations, we got 1% slowdown
		# on speedometer when changing import-instr-limit from 100 to 30.
		# We need to further reduce it to 20 for arm to limit the size
		# increase to 10%.
		local thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=30"
		if use arm; then
			thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=20"
			EBUILD_LDFLAGS+=( -gsplit-dwarf )
		fi
		EBUILD_LDFLAGS+=( "${thinlto_ldflag}" )
		# if using thinlto, we need to pass the equivalent of
		# -fdebug-types-section to the backend, to prevent out-of-range
		# relocations (see
		# https://bugs.chromium.org/p/chromium/issues/detail?id=1032159).
		append-ldflags -Wl,-mllvm
		append-ldflags -Wl,-generate-type-units
	fi

	# [Mod] Configurations related to orderfile_generate USE flag are removed.

	# Turn off call graph profile sort (C3), when new pass manager is enabled.
	# Only allow it when we want to generate orderfile.
	# This is a temporary option and will need to be removed once orderfile is on.
	EBUILD_LDFLAGS+=( "-Wl,--no-call-graph-profile-sort" )

	# Enable std::vector []-operator bounds checking.
	append-cxxflags -D__google_stl_debug_vector=1

	# Chrome and Chrome OS versions of the compiler may not be in
	# sync. So, don't complain if Chrome uses a diagnostic
	# option that is not yet implemented in the compiler version used
	# by Chrome OS.
	# Turns out this is only really supported by Clang. See crosbug.com/615466
	# Add "-faddrsig" flag required to efficiently support "--icf=all".
	append-flags -faddrsig
	append-flags -Wno-unknown-warning-option
	export CXXFLAGS_host+=" -Wno-unknown-warning-option"
	export CFLAGS_host+=" -Wno-unknown-warning-option"
	if use libcxx; then
		append-cxxflags "-stdlib=libc++"
		append-ldflags "-stdlib=libc++"
	fi

	# Workaround: Disable fatal linker warnings on arm64/lld.
	# https://crbug.com/913071
	# [mod] vtable_verify is disabled.
	use arm64 && append-ldflags "-Wl,--no-fatal-warnings"

	local flags
	einfo "Building with the compiler settings:"
	for flags in {C,CXX,CPP,LD}FLAGS; do
		einfo "  ${flags} = ${!flags}"
	done
}

src_configure() {
	tc-export CXX CC AR AS NM RANLIB STRIP
	export CC_host=$(tc-getBUILD_CC)
	export CXX_host=$(tc-getBUILD_CXX)
	export NM_host=$(tc-getBUILD_NM)
	export READELF="${CHOST}-readelf"
	export READELF_host="${CBUILD}-readelf"
	# Temporarily use llvm-objcopy to generate split-debug file with non-debug
	# sections preserved, b/127337806. This workaround only works because
	# llvm-objcopy currently does not support "--only-keep-debug" flag.
	export OBJCOPY=llvm-objcopy

	# Use C++ compiler as the linker driver.
	export LD="${CXX}"
	export LD_host=${CXX_host}

	# We need below change when USE="thinlto" is set. We set this globally
	# so that users can turn on the "use_thin_lto" in the simplechrome
	# flow more easily.
	# use nm from llvm, https://crbug.com/917193
	export NM="llvm-nm"
	export NM_host="llvm-nm"
	export AR="llvm-ar"
	# USE=thinlto affects host build, we need to set host AR to
	# llvm-ar to make sure host package builds with thinlto.
	# crbug.com/731335
	export AR_host="llvm-ar"
	export RANLIB="llvm-ranlib"

	# Set binutils path for goma.
	CC_host+=" -B$(get_binutils_path "${LD_host}")"
	CXX_host+=" -B$(get_binutils_path "${LD_host}")"

	setup_compile_flags

	# We might set BOTO_CONFIG in the builder environment in case the
	# existing file needs modifications (e.g. for working with older
	# branches). So don't overwrite it if it's already set.
	# See https://crbug.com/847676 for details.
	export BOTO_CONFIG="${BOTO_CONFIG:-/home/$(whoami)/.boto}"
	export PATH=${PATH}:${DEPOT_TOOLS}

	export DEPOT_TOOLS_GSUTIL_BIN_DIR="${CHROME_CACHE_DIR}/gsutil_bin"
	# The venv logic seems to misbehave when cross-compiling.  Since our SDK
	# should include all the necessary modules, just disable it (for now).
	# https://crbug.com/808434
	export VPYTHON_BYPASS="manually managed python not supported by chrome operations"

	# TODO(rcui): crosbug.com/20435. Investigate removal of runhooks
	# useflag when chrome build switches to Ninja inside the chroot.
	if use runhooks; then
		[[ -f "${EGCLIENT}" ]] || die "EGCLIENT at '${EGCLIENT}' does not exist"
		local cmd=( "${EGCLIENT}" runhooks --force )
		echo "${cmd[@]}"
		CFLAGS="${CFLAGS} ${EBUILD_CFLAGS[*]}" \
		CXXFLAGS="${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}" \
		LDFLAGS="${LDFLAGS} ${EBUILD_LDFLAGS[*]}" \
		"${cmd[@]}" || die
	fi

	# [Mod] Unrelated V8 configurations are removed.
	BUILD_STRING_ARGS+=(
		"cros_target_ar=${AR}"
		"cros_target_cc=${CC}"
		"cros_target_cxx=${CXX}"
		"host_toolchain=//build/toolchain/cros:host"
		"custom_toolchain=//build/toolchain/cros:target"
		"cros_target_ld=${LD}"
		"cros_target_nm=${NM}"
		"cros_target_readelf=${READELF}"
		"cros_target_extra_cflags=${CFLAGS} ${EBUILD_CFLAGS[*]}"
		"cros_target_extra_cppflags=${CPPFLAGS}"
		"cros_target_extra_cxxflags=${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}"
		"cros_target_extra_ldflags=${LDFLAGS} ${EBUILD_LDFLAGS[*]}"
		"cros_host_cc=${CC_host}"
		"cros_host_cxx=${CXX_host}"
		"cros_host_ar=${AR_host}"
		"cros_host_ld=${LD_host}"
		"cros_host_nm=${NM_host}"
		"cros_host_readelf=${READELF_host}"
		"cros_host_extra_cflags=${CFLAGS_host}"
		"cros_host_extra_cxxflags=${CXXFLAGS_host}"
		"cros_host_extra_cppflags=${CPPFLAGS_host}"
		"cros_host_extra_ldflags=${LDFLAGS_host}"
	)

	local arg
	for arg in "${BUILD_STRING_ARGS[@]}"; do
		BUILD_ARGS+=("${arg%%=*}=\"${arg#*=}\"")
	done
	export GN_ARGS="${BUILD_ARGS[*]}"
	einfo "GN_ARGS = ${GN_ARGS}"

	${EGN} gen "${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}" \
		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src" || die

	# [Mod] setup_test_lists and clang_tidy are removed.
}

chrome_make() {
	local build_dir="${BUILD_OUT_SYM}/${BUILDTYPE}"

	# If ThinLTO is enabled, we may have a cache from a previous link. Due
	# to fears about lack of reproducibility, we don't allow cache reuse
	# across rebuilds. The cache is still useful for artifacts shared
	# between multiple links done by this build (e.g. tests).
	use thinlto && rm -rf "${build_dir}/thinlto-cache"

	local command=(
		"${ENINJA}"
		"${MAKEOPTS}"
		-C "${build_dir}"
		$(usex verbose -v "")
		"$@"
	)

	PATH=${PATH}:${DEPOT_TOOLS} "${command[@]}"
	local ret=$?
	[[ "${ret}" -eq 0 ]] || die
}

# [Mod] src_compile() is simplied because 1) the case CHROME_LOCAL=LOCAL_BINARY
# is excluded. 2) we do not need nacl or tests.
src_compile() {
	cd "${CHROME_ROOT}"/src || die "Cannot chdir to ${CHROME_ROOT}/src"

	chrome_make "icu"
}

# [Mod] src_install() is greatly simplied and totally new.
src_install() {
	local build_dir="src/${BUILD_OUT_SYM}/${BUILDTYPE}"
	local icu_lib_dir="${build_dir}/obj/third_party/icu/"
	mv "${icu_lib_dir}/libicui18n.a" "${icu_lib_dir}/libicui18n${CHROME_ICU_POSTFIX}.a"
	mv "${icu_lib_dir}/libicuuc.a" "${icu_lib_dir}/libicuuc${CHROME_ICU_POSTFIX}.a"
	dolib.a "${icu_lib_dir}/libicui18n${CHROME_ICU_POSTFIX}.a"
	dolib.a "${icu_lib_dir}/libicuuc${CHROME_ICU_POSTFIX}.a"
	# Install to chrome folder to make chrome work.
	insinto "${CHROME_DIR}"
	doins "${build_dir}/icudtl.dat"

	# Install icu header to /usr/include/icu/.
	local icu_headers=(
		"common/unicode/brkiter.h"
		"common/unicode/bytestream.h"
		"common/unicode/char16ptr.h"
		"common/unicode/chariter.h"
		"common/unicode/errorcode.h"
		"common/unicode/localpointer.h"
		"common/unicode/locid.h"
		"common/unicode/parseerr.h"
		"common/unicode/platform.h"
		"common/unicode/ptypes.h"
		"common/unicode/putil.h"
		"common/unicode/putil.h"
		"common/unicode/rep.h"
		"common/unicode/std_string.h"
		"common/unicode/strenum.h"
		"common/unicode/stringoptions.h"
		"common/unicode/stringpiece.h"
		"common/unicode/ubrk.h"
		"common/unicode/uchar.h"
		"common/unicode/uchar.h"
		"common/unicode/uconfig.h"
		"common/unicode/ucpmap.h"
		"common/unicode/ucurr.h"
		"common/unicode/udata.h"
		"common/unicode/udisplaycontext.h"
		"common/unicode/uenum.h"
		"common/unicode/uloc.h"
		"common/unicode/umachine.h"
		"common/unicode/umisc.h"
		"common/unicode/unistr.h"
		"common/unicode/uobject.h"
		"common/unicode/urename.h"
		"common/unicode/ures.h"
		"common/unicode/utext.h"
		"common/unicode/utf.h"
		"common/unicode/utf.h"
		"common/unicode/utf16.h"
		"common/unicode/utf16.h"
		"common/unicode/utf8.h"
		"common/unicode/utf8.h"
		"common/unicode/utf_old.h"
		"common/unicode/utf_old.h"
		"common/unicode/utypes.h"
		"common/unicode/uvernum.h"
		"common/unicode/uversion.h"
		"i18n/unicode/calendar.h"
		"i18n/unicode/gregocal.h"
		"i18n/unicode/regex.h"
		"i18n/unicode/timezone.h"
		"i18n/unicode/ucal.h"
		"i18n/unicode/ufieldpositer.h"
		"i18n/unicode/uformattable.h"
		"i18n/unicode/unum.h"
		"i18n/unicode/uregex.h"
	)
	local f
	for f in "${icu_headers[@]}"; do
		insinto "/usr/include/icu${CHROME_ICU_POSTFIX}/${f%/*}"
		doins "${CHROME_ROOT}/src/third_party/icu/source/${f}"
	done
}
