blob: 9012203a689f6feda92f5f54e359b175db24fd17 [file] [log] [blame]
# Copyright 2014 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.
# @ECLASS: gn-chromium.eclass
# @MAINTAINER:
# The Chromium OS Authors. <chromium-os-dev@chromium.org>
# @BLURB: Support generating ninja build files with GN
# @DESCRIPTION:
# Supports using GN (https://code.google.com/p/chromium/wiki/gn), a meta-build
# system that generates Ninja files, in CrOS. Handles injecting toolchain
# and build args expressed in the standard CrOS ways into the Chromium GN build.
inherit cros-debug toolchain-funcs
IUSE="asan clang neon hardfp"
REQUIRED_USE="asan? ( clang )"
# @FUNCTION: _usetf
# @INTERNAL
# @USAGE: <use flag to test>
_usetf() { usex $1 true false ; }
# @FUNCTION: _gn-chromium_friendly_arch
# @INTERNAL
# @USAGE: <arch>
# @DESCRIPTION: TODO(cmasone) handle mips. Look at chromeos-chrome
_gn-chromium_friendly_arch() {
local arch=${1:-${ARCH}}
if [[ "${arch}" == "amd64" ]] ; then
echo "x64"
fi
}
# @FUNCTION: gn-chromium_get_build_dir
# @USAGE:
# @DESCRIPTION:
# Returns absolute path to the GN build output directory.
gn-chromium_get_build_dir() {
# For now, just use WORKDIR. In the future, we can add
# incremental builds like in cros-workon.eclass.
echo "${WORKDIR}"
}
# @FUNCTION: _gn-chromium_ensure_build_dir
# @INTERNAL
# @USAGE:
# @DESCRIPTION:
# Ensures existence of the directory returned by $(gn-chromium_get_build_dir)
_gn-chromium_ensure_build_dir() {
mkdir -p "$(gn-chromium_get_build_dir)"
}
# @FUNCTION: gn-chromium_pkg_setup
# @USAGE:
# @DESCRIPTION:
# Checks that the environment is as expected.
gn-chromium_pkg_setup() {
# Verify that GN is available in the SDK
gn --version > /dev/null || die "GN not available in SDK!"
}
# @FUNCTION: _gn-chromium_get_args_file
# @INTERNAL
# @USAGE:
# @DESCRIPTION:
# Returns the absolute path of the file used to store arguments for a GN build.
_gn-chromium_get_args_file() {
echo "$(gn-chromium_get_build_dir)/args.gn"
}
# @FUNCTION: _gn-chromium_print_arm_args
# @INTERNAL
# @USAGE:
# @DESCRIPTION:
# Prints arm-appropriate build configuration arguments, including
# - arm version (6 or 7),
# - whether to use neon,
# - what floating point ABI to use (hard or softfp), and
# - the appropriate mtune setting.
_gn-chromium_print_arm_args() {
use arm || die "_gn-chromium_print_arm_args only makes sense on ARM."
cat <<EOF
arm_version=$([[ ${CHOST} == armv7* ]] && echo "7" || echo "6")
arm_use_neon=$(_usetf neon)
arm_float_abi="$(usex hardfp hard softfp)"
arm_tune="$(get-flag mtune)"
EOF
}
# @FUNCTION: _gn-chromium_print_standard_args
# @INTERNAL
# @USAGE:
# @DESCRIPTION:
# Prints all arguments required to properly run a GN build of Chromium code.
_gn-chromium_print_standard_args() {
tc-export CC CXX AR PKG_CONFIG
cat <<EOF
os="chromeos"
pkg_config="${PKG_CONFIG}"
cros_use_custom_toolchain=true
cros_target_cc="${CC}"
cros_target_cxx="${CXX}"
cros_target_ar="${AR}"
cpu_arch="$(_gn-chromium_friendly_arch ${ARCH})"
is_clang=$(_usetf clang)
is_asan=$(_usetf asan)
EOF
use arm && _gn-chromium_print_arm_args
}
# @FUNCTION: gn-chromium_set_args
# @USAGE: [<arg1=value1> ...]
# @DESCRIPTION:
# Clobbers any existing GN args file with the standard args for this architecture
# plus those passed in, if any.
gn-chromium_set_args() {
_gn-chromium_ensure_build_dir
local args_file=$(_gn-chromium_get_args_file)
echo "$(_gn-chromium_print_standard_args)" > "${args_file}"
printf '%s\n' "$@" >> "${args_file}"
}
# @FUNCTION: gn-chromium_src_configure
# @USAGE:
# @DESCRIPTION:
# Pulls build configuration (toolchain, compiler/linker flags) into GN
# environment and generates ninja build files into directory returned by
# $(gn-chromium_get_build_dir)
gn-chromium_src_configure() {
clang-setup-env
cros-debug-add-NDEBUG
_gn-chromium_ensure_build_dir
[[ -e "$(_gn-chromium_get_args_file)" ]] || gn-chromium_set_args
gn gen "$(gn-chromium_get_build_dir)" --root="${S}"
}
EXPORT_FUNCTIONS pkg_setup src_configure