blob: bf74673ba5b286180b92e968eb9016beb3f58d1b [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/c++/c++.gni")
import("//build/config/sanitizers/sanitizers.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",
"-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",
# Forces full rebuilds on NDK rolls. To rebuild everything when NDK version
# stays the same, increment the suffix number.
"ANDROID_NDK_VERSION_ROLL=${android_ndk_version}_1",
]
if (current_cpu == "mips64el") {
cflags += [
# Have to force IAS for mips64.
"-fintegrated-as",
]
}
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",
]
# $compile_api_level corresponds to the API level used for the sysroot path
# calculation in //build/config/android/config.gni
if (current_cpu == "arm") {
abi_target = "arm-linux-androideabi"
compile_api_level = android32_ndk_api_level
} else if (current_cpu == "x86") {
abi_target = "i686-linux-android"
compile_api_level = android32_ndk_api_level
} else if (current_cpu == "arm64") {
abi_target = "aarch64-linux-android"
compile_api_level = android64_ndk_api_level
} 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-android"
compile_api_level = android64_ndk_api_level
} else if (current_cpu == "mipsel") {
abi_target = "mipsel-linux-android"
compile_api_level = android32_ndk_api_level
} else if (current_cpu == "mips64el") {
# Place holder for mips64 support, not tested.
abi_target = "mips64el-linux-android"
compile_api_level = android64_ndk_api_level
} else {
assert(false, "Architecture not supported")
}
cflags += [
"--target=$abi_target",
"-isystem" +
rebase_path("$android_ndk_root/sysroot/usr/include/$abi_target",
root_build_dir),
"-D__ANDROID_API__=$compile_api_level",
# Temporary workaround for third party dependencies requiring this to be
# defined.
# TODO(crbug.com/771171): Remove this once the third party deps have been
# fixed to be compatible with newer NDK versions
"-D__NDK_FPABI__=",
]
ldflags += [ "--target=$abi_target" ]
# TODO(crbug.com/771171): Remove this define once code that uses it has been
# updated to no longer need it. This is leftover from older Android NDK
# versions.
if (compile_api_level < 20) {
cflags += [ "-DHAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC=1" ]
}
# 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_cc
# 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_cc = []
if (!use_custom_libcxx) {
cflags_cc = []
if (android_ndk_major_version >= 13) {
libcxx_include_path =
rebase_path("$android_libcpp_root/include", root_build_dir)
libcxxabi_include_path = rebase_path(
"$android_ndk_root/sources/cxx-stl/llvm-libc++abi/include",
root_build_dir)
} else {
libcxx_include_path =
rebase_path("$android_libcpp_root/libcxx/include", root_build_dir)
libcxxabi_include_path = rebase_path(
"$android_ndk_root/sources/cxx-stl/llvm-libc++abi/libcxxabi/include",
root_build_dir)
}
cflags_cc += [
"-isystem" + libcxx_include_path,
"-isystem" + libcxxabi_include_path,
]
}
cflags_cc += [ "-isystem" + rebase_path(
"$android_ndk_root/sources/android/support/include",
root_build_dir) ]
defines = [
"__GNU_SOURCE=1", # Necessary for clone().
"CHROMIUM_CXX_TWEAK_INLINES", # Saves binary size.
]
ldflags = [ "-nostdlib" ]
lib_dirs = [ android_libcpp_lib_dir ]
libs = []
if (!use_custom_libcxx) {
# The libc++ runtime library (must come first).
# ASan needs to dynamically link to libc++ even in static builds so
# that it can interpose operator new.
if (is_component_build || is_asan) {
libs += [ "c++_shared" ]
} else {
libs += [ "c++_static" ]
}
libs += [ "c++abi" ]
}
libs += [ "android_support" ]
# arm builds of libc++ starting in NDK r12 depend on unwind.
if (current_cpu == "arm") {
libs += [ "unwind" ]
}
# 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.
libs += [
rebase_path(android_libgcc_file),
"c",
]
if (current_cpu == "arm" && arm_version == 6) {
libs += [ "atomic" ]
}
if (current_cpu == "mipsel") {
libs += [ "atomic" ]
}
# 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" ]
}
}
config("executable_config") {
cflags = [ "-fPIE" ]
asmflags = [ "-fPIE" ]
ldflags = [ "-pie" ]
}
config("hide_all_but_jni_onload") {
ldflags = [ "-Wl,--version-script=" + rebase_path(
"//build/android/android_only_explicit_jni_exports.lst") ]
}
config("hide_all_but_jni") {
ldflags = [ "-Wl,--version-script=" +
rebase_path("//build/android/android_only_jni_exports.lst") ]
}
config("lld_pack_relocations") {
ldflags = [ "-Wl,--pack-dyn-relocs=android" ]
}
# Used for instrumented build to generate the orderfile.
config("default_cygprofile_instrumentation") {
if (use_order_profiling) {
defines = [ "CYGPROFILE_INSTRUMENTATION=1" ]
cflags = [ "-finstrument-function-entry-bare" ]
}
}