blob: cfbde79dbc54b597ff43b28b277994a17b4afa67 [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/config/android/config.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/sysroot.gni")
assert(is_android)
# This is included by reference in the //build/config/compiler config that
# is applied to all targets. It is here to separate out the logic that is
# Android-only.
config("compiler") {
cflags = [
"-ffunction-sections",
"-funwind-tables",
"-fno-short-enums",
]
defines = [
"ANDROID",
# The NDK has these things, but doesn't define the constants to say that it
# does. Define them here instead.
"HAVE_SYS_UIO_H",
]
ldflags = []
if (!is_clang) {
# Clang doesn't support these flags.
cflags += [ "-finline-limit=64" ]
}
if (is_clang) {
rebased_android_toolchain_root =
rebase_path(android_toolchain_root, root_build_dir)
if (current_cpu == "mipsel") {
cflags += [
# TODO(gordanac) Enable integrated-as.
"-no-integrated-as",
"-B${rebased_android_toolchain_root}/bin", # Else /usr/bin/as gets picked up.
]
}
}
# Use gold for Android for most CPU architectures.
if (current_cpu == "x86" || current_cpu == "x64" || current_cpu == "arm") {
ldflags += [ "-fuse-ld=gold" ]
if (is_clang) {
# Let clang find the ld.gold in the NDK.
ldflags += [ "--gcc-toolchain=$rebased_android_toolchain_root" ]
}
# Use -mstackrealign due to a bug on ia32 Jelly Bean.
# See crbug.com/521527
if (current_cpu == "x86") {
cflags += [ "-mstackrealign" ]
}
}
if (current_cpu == "mipsel" && is_clang) {
# Let clang find the ld.bfd in the NDK.
ldflags += [ "--gcc-toolchain=$rebased_android_toolchain_root" ]
}
ldflags += [
"-Wl,--no-undefined",
# Don't allow visible symbols from libgcc or libc++ to be
# re-exported.
"-Wl,--exclude-libs=libgcc.a",
"-Wl,--exclude-libs=libc++_static.a",
# Don't allow visible symbols from libraries that contain
# assembly code with symbols that aren't hidden properly.
# http://crbug.com/448386
"-Wl,--exclude-libs=libvpx_assembly_arm.a",
]
if (current_cpu == "arm") {
ldflags += [
# Enable identical code folding to reduce size.
"-Wl,--icf=safe",
]
}
if (is_clang) {
if (current_cpu == "arm") {
abi_target = "arm-linux-androideabi"
} else if (current_cpu == "x86") {
abi_target = "i686-linux-androideabi"
} else if (current_cpu == "arm64") {
# Place holder for arm64 support, not tested.
# TODO: Enable clang support for Android Arm64. http://crbug.com/539781
abi_target = "aarch64-linux-androideabi"
} else if (current_cpu == "x64") {
# Place holder for x64 support, not tested.
# TODO: Enable clang support for Android x64. http://crbug.com/539781
abi_target = "x86_64-linux-androideabi"
} else if (current_cpu == "mipsel") {
abi_target = "mipsel-linux-android"
} else if (current_cpu == "mips64el") {
# Place holder for mips64 support, not tested.
abi_target = "mips64el-linux-androideabi"
} else {
assert(false, "Architecture not supported")
}
cflags += [
"-target",
abi_target,
]
ldflags += [
"-target",
abi_target,
]
}
# Assign any flags set for the C compiler to asmflags so that they are sent
# to the assembler.
asmflags = cflags
}
# This is included by reference in the //build/config/compiler:runtime_library
# config that is applied to all targets. It is here to separate out the logic
# that is Android-only. Please see that target for advice on what should go in
# :runtime_library vs. :compiler.
config("runtime_library") {
# NOTE: The libc++ header include paths below are specified in cflags
# rather than include_dirs because they need to come after include_dirs.
# Think of them like system headers, but don't use '-isystem' because the
# arm-linux-androideabi-4.4.3 toolchain (circa Gingerbread) will exhibit
# strange errors. The include ordering here is important; change with
# caution.
cflags = [
"-isystem" +
rebase_path("$android_libcpp_root/libcxx/include", root_build_dir),
"-isystem" + rebase_path(
"$android_ndk_root/sources/cxx-stl/llvm-libc++abi/libcxxabi/include",
root_build_dir),
"-isystem" +
rebase_path("$android_ndk_root/sources/android/support/include",
root_build_dir),
]
defines = [ "__GNU_SOURCE=1" ] # Necessary for clone().
ldflags = [ "-nostdlib" ]
lib_dirs = [ "$android_libcpp_root/libs/$android_app_abi" ]
# The libc++ runtime library (must come first).
if (is_component_build) {
libs = [ "c++_shared" ]
} else {
libs = [ "c++_static" ]
}
# libgcc must come before libdl for ld.bfd (MIPS)
if (current_cpu == "mipsel") {
libs += [
# ld linker is used for mips Android, and ld does not accept library
# absolute path prefixed by "-l"; Since libgcc does not exist in mips
# sysroot the proper library will be linked.
# TODO(gordanac): Remove once gold linker is used for mips Android.
"gcc",
]
} else {
libs += [
# Manually link the libgcc.a that the cross compiler uses. This is
# absolute because the linker will look inside the sysroot if it's not.
rebase_path(android_libgcc_file),
]
}
libs += [
"c",
"dl",
"m",
]
if (is_clang) {
# Work around incompatibilities between bionic and clang headers.
defines += [
"__compiler_offsetof=__builtin_offsetof",
"nan=__builtin_nan",
]
}
# TODO(jdduke) Re-enable on mips after resolving linking
# issues with libc++ (crbug.com/456380).
if (current_cpu != "mipsel" && current_cpu != "mips64el") {
ldflags += [ "-Wl,--warn-shared-textrel" ]
}
# Clang with libc++ does not require an explicit atomic library reference.
if (!is_clang) {
libs += [ "atomic" ]
}
}
config("executable_config") {
cflags = [ "-fPIE" ]
asmflags = [ "-fPIE" ]
ldflags = [ "-pie" ]
}
config("hide_native_jni_exports") {
ldflags = [ "-Wl,--version-script=" +
rebase_path("//build/android/android_no_jni_exports.lst") ]
}
# Instrumentation -------------------------------------------------------------
#
# The BUILDCONFIG file sets the "default_cygprofile_instrumentation" config on
# targets by default. You can override whether the cygprofile instrumentation is
# used on a per-target basis:
#
# configs -= [ "//build/config/android:default_cygprofile_instrumentation" ]
# configs += [ "//build/config/android:no_cygprofile_instrumentation" ]
config("default_cygprofile_instrumentation") {
if (use_order_profiling) {
configs = [ ":cygprofile_instrumentation" ]
} else {
configs = [ ":no_cygprofile_instrumentation" ]
}
}
config("cygprofile_instrumentation") {
cflags = [
"-finstrument-functions",
# Allow mmx intrinsics to inline, so that the compiler can expand the intrinsics.
"-finstrument-functions-exclude-file-list=mmintrin.h",
# Avoid errors with current NDK:
# "third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/include/arm_neon.h:3426:3: error: argument must be a constant"
"-finstrument-functions-exclude-file-list=arm_neon.h,SaturatedArithmeticARM.h",
]
defines = [ "CYGPROFILE_INSTRUMENTATION=1" ]
}
config("no_cygprofile_instrumentation") {
}