# 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
}
