# 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/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")

if (current_toolchain == default_toolchain) {
  import("//build/toolchain/concurrent_links.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 = [
    # Don't allow visible symbols from libgcc or libc++ to be
    # re-exported.
    "-Wl,--exclude-libs=libgcc.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",
  ]

  # TODO(crbug.com/1184398): Move to compiler-rt when we are ready.
  ldflags += [ "--rtlib=libgcc" ]
  if (current_cpu == "arm64") {
    # For outline atomics on AArch64 (can't pass this unconditionally
    # due to unused flag warning on other targets).
    cflags += [ "--rtlib=libgcc" ]
  }

  # $compile_api_level corresponds to the API level used for the sysroot path
  # calculation in //build/config/android/config.gni
  if (android_64bit_target_cpu) {
    compile_api_level = android64_ndk_api_level
  } else {
    compile_api_level = android32_ndk_api_level
  }

  cflags += [ "--target=$android_abi_target$compile_api_level" ]
  ldflags += [ "--target=$android_abi_target$compile_api_level" ]

  # 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") {
  # Let the linker find libgcc.a.
  ldflags = [ "--gcc-toolchain=" +
              rebase_path(android_toolchain_root, root_build_dir) ]

  libs = []

  # On 64-bit platforms, the only symbols provided by libandroid_support.a are
  # strto{d,f,l,ul}_l. These symbols are not used by our libc++, and newer NDKs
  # don't provide a libandroid_support.a on 64-bit platforms, so we only depend
  # on this library on 32-bit platforms.
  if (current_cpu == "arm" || current_cpu == "x86") {
    libs += [ "android_support" ]
  }

  # arm builds of libc++ starting in NDK r12 depend on unwind.
  if (current_cpu == "arm") {
    libs += [ "unwind" ]
  }

  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("hide_all_but_jni_onload") {
  ldflags = [ "-Wl,--version-script=" + rebase_path(
                  "//build/android/android_only_explicit_jni_exports.lst",
                  root_build_dir) ]
}

config("hide_all_but_jni") {
  ldflags = [ "-Wl,--version-script=" +
              rebase_path("//build/android/android_only_jni_exports.lst",
                          root_build_dir) ]
}

config("lld_pack_relocations") {
  ldflags = [ "-Wl,--pack-dyn-relocs=android" ]
}

# Used for instrumented build to generate the orderfile.
config("default_orderfile_instrumentation") {
  if (use_order_profiling) {
    cflags = [ "-finstrument-function-entry-bare" ]
    if (use_thin_lto) {
      # TODO(pcc): This should not be necessary. Remove once
      # https://reviews.llvm.org/D50016 lands and gets rolled in.
      ldflags = [ "-Wl,-u,__cyg_profile_func_enter_bare" ]
    }
  }
}

if (current_toolchain == default_toolchain) {
  pool("goma_javac_pool") {
    # Override action_pool when goma is enabled for javac.
    depth = 10000
  }

  # When defined, this pool should be used instead of link_pool for command
  # that need 1-2GB of RAM. https://crbug.com/1078460
  if (defined(java_cmd_pool_size)) {
    pool("java_cmd_pool") {
      depth = java_cmd_pool_size
    }
  }
}
