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

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

inherit cros-workon

IUSE="cros_i686"

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

	__AU_OLD_ARCH=${ARCH}
	__AU_OLD_ABI=${ABI}
	__AU_OLD_LIBDIR_x86=${LIBDIR_x86}
	__AU_OLD_CC=${CC}
	__AU_OLD_CXX=${CXX}
	export ARCH=x86 ABI=x86 LIBDIR_x86="lib"
	__AU_OLD_CHOST=${CHOST}
	export CHOST=i686-pc-linux-gnu
	if [[ ${CC} == *"clang"* ]]; then
		export CC=${CHOST}-clang
		export CXX=${CHOST}-clang++
		append-flags "-Xclang-only=-stdlib=libstdc++"
		append-ldflags "-Xclang-only=-stdlib=libstdc++"
		# TODO(crbug.com/991024): Work around for lld not linking with 32bit
		# glibc.
		append-ldflags "-Xclang-only=-Wl,--allow-multiple-definition"
	fi
	__AU_OLD_SYSROOT=${SYSROOT}
	export SYSROOT=/usr/${CHOST}
	append-ldflags -L"${__AU_OLD_SYSROOT}"/usr/lib
	append-cppflags -isystem "${__AU_OLD_SYSROOT}"/usr/include
	# Link to libc and libstdc++ statically, because the i686 shared
	# libraries are not available on x86_64. In addition, disable sanitizers
	# for 32-bit builds.
	append-flags -static -fno-sanitize=all
	append-ldflags -static -fno-sanitize=all
}

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

	filter-ldflags -L"${__AU_OLD_SYSROOT}"/usr/lib
	filter-flags -isystem "${__AU_OLD_SYSROOT}"/usr/include
	filter-flags -static -fno-sanitize=all
	export SYSROOT=${__AU_OLD_SYSROOT}
	export CHOST=${__AU_OLD_CHOST}
	export LIBDIR_x86=${__AU_OLD_LIBDIR_x86}
	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++"
		# TODO(crbug.com/991024): Work around for lld not linking with 32bit
		# glibc.
		filter-flags "-Xclang-only=-Wl,--allow-multiple-definition"
	fi
}

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

push_i686_env() {
	board_setup_32bit_au_env
}

pop_i686_env() {
	export CXX=${__AU_OLD_CXX}
	export CC=${__AU_OLD_CC}
	board_teardown_32bit_au_env
}

_get_i686_cache() {
	echo "$(cros-workon_get_build_dir)/i686"
}

platform_src_configure_i686() {
	local cache=$(_get_i686_cache)
	push_i686_env
	cros-debug-add-NDEBUG
	append-lfs-flags
	platform_configure "--cache_dir=${cache}" "$@"
	pop_i686_env
}

platform_src_compile_i686() {
	local cache=$(_get_i686_cache)
	push_i686_env
	platform "compile" "--cache_dir=${cache}" "$@"
	pop_i686_env
}

platform_out_i686() {
	echo "$(_get_i686_cache)/out/Default"
}
