blob: 90bbad8c6434821626f0efdd182b1b902d9ce825 [file] [log] [blame]
# 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 LIBCHROME_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
unset LIBCHROME_SYSROOT
}
# 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"
}