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