# 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) {
    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" ]
  }
}
