# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2

# @ECLASS: cros-arm64.eclass
# @BLURB: eclass for building arm64 binaries on arm
# @DESCRIPTION:
# Multilib builds are not supported in Chrome OS. A simple workaround for arm64
# builds on arm is to use the host toolchain. This eclass provides helper
# functions for arm64 environment setup, as well as integration with platform2
# packages. The "cros_arm64" USE flag determines whether a package should also
# build arm64 binaries on arm.

inherit cros-workon

IUSE="cros_arm64"

# Setup the build env to create 64bit objects.
# Force use of stdlibc++ in 64 mode (crbug.com/747696).
board_setup_64bit_au_env()
{
	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"

	__AU_OLD_ARCH=${ARCH}
	__AU_OLD_ABI=${ABI}
	__AU_OLD_LIBDIR_arm64=${LIBDIR_arm64}
	__AU_OLD_CC=${CC}
	__AU_OLD_CXX=${CXX}
	export ARCH=arm64 ABI=arm64 LIBDIR_arm64="lib64"
	if [[ ${CC} == *"clang"* ]]; then
		export CC=aarch64-cros-linux-gnu-clang
		export CXX=aarch64-cros-linux-gnu-clang++
		append-flags "-Xclang-only=-stdlib=libstdc++"
		append-ldflags "-Xclang-only=-stdlib=libstdc++"
	fi
	__AU_OLD_SYSROOT=${SYSROOT}
	export LIBCHROME_SYSROOT=${SYSROOT}
	export SYSROOT=/usr/aarch64-cros-linux-gnu
	append-ldflags -L"${__AU_OLD_SYSROOT}"/usr/lib64 -L"${SYSROOT}"/usr/lib64
	append-cppflags -isystem "${SYSROOT}"/usr/include
	# Link to libc and libstdc++ statically, because the arm64 shared
	# libraries are not available on arm. In addition, disable sanitizers
	# for 64-bit builds.
	append-flags -static -fno-sanitize=all
	append-ldflags -static -fno-sanitize=all
}

# undo what we did in the above function
board_teardown_64bit_au_env()
{
	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"
	[ -z "${__AU_OLD_SYSROOT}" ] && \
		die "board_setup_64bit_au_env must be called first"

	filter-ldflags -L"${__AU_OLD_SYSROOT}"/usr/lib64 -L"${SYSROOT}"/usr/lib64
	filter-flags -isystem "${SYSROOT}"/usr/include
	filter-flags -static -fno-sanitize=all
	export SYSROOT=${__AU_OLD_SYSROOT}
	export LIBDIR_arm64=${__AU_OLD_LIBDIR_arm64}
	export ABI=${__AU_OLD_ABI}
	export ARCH=${__AU_OLD_ARCH}
	if [[ ${CC} == *"clang"* ]]; then
		export CC=${__AU_OLD_CC}
		export CXX=${__AU_OLD_CXX}
		filter-flags "-Xclang-only=-stdlib=libstdc++"
	fi
	unset LIBCHROME_SYSROOT
}

# An ebuild inheriting from "cros-arm64" should also build arm64 binaries if this
# returns 0. The "arm" check allows the "cros_arm64" USE flag to be enabled for
# an overlay inherited by non-arm boards.
use_arm64() { use cros_arm64 && use arm; }

push_arm64_env() {
	board_setup_64bit_au_env
}

pop_arm64_env() {
	export CXX=${__AU_OLD_CXX}
	export CC=${__AU_OLD_CC}
	board_teardown_64bit_au_env
}

_get_arm64_cache() {
	echo "$(cros-workon_get_build_dir)/arm64"
}

platform_src_configure_arm64() {
	local cache=$(_get_arm64_cache)
	push_arm64_env
	cros-debug-add-NDEBUG
	append-lfs-flags
	platform_configure "--cache_dir=${cache}" "$@"
	pop_arm64_env
}

platform_src_compile_arm64() {
	local cache=$(_get_arm64_cache)
	push_arm64_env
	platform "compile" "--cache_dir=${cache}" "$@"
	pop_arm64_env
}

platform_out_arm64() {
	echo "$(_get_arm64_cache)/out/Default"
}
