# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/android/rules.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",

    # https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#weak-symbols-for-api-definitions
    "__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__",

    # 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 (android_64bit_current_cpu) {
    _max_page_size = 16384
  } else {
    _max_page_size = 4096
  }

  ldflags = [
    # 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",

    # Reduce the page size from 65536 in order to reduce binary size slightly
    # by shrinking the alignment gap between segments. This also causes all
    # segments to be mapped adjacently, which breakpad relies on.
    "-Wl,-z,max-page-size=$_max_page_size",
  ]

  if (current_cpu == "arm64") {
    if (arm_control_flow_integrity == "standard") {
      cflags += [ "-mbranch-protection=standard" ]
      rustflags = [ "-Zbranch-protection=pac-ret,bti" ]
    } else if (arm_control_flow_integrity == "pac") {
      cflags += [ "-mbranch-protection=pac-ret" ]
      rustflags = [ "-Zbranch-protection=pac-ret" ]
    }
  }

  # Disable TLSDESC for riscv64 until the Android NDK supports it. While
  # Chromium's clang turns it on by default for Android RISC-V devices, NDK r27
  # currently has it disabled. This can likely be removed in NDK r28.
  if (current_cpu == "riscv64") {
    cflags += [ "-mtls-dialect=trad" ]
  }

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

config("hide_all_but_jni_onload") {
  _version_script = "//build/android/android_only_explicit_jni_exports.lst"
  inputs = [ _version_script ]
  ldflags =
      [ "-Wl,--version-script=" + rebase_path(_version_script, root_build_dir) ]
}

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

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

config("lld_relr_relocations") {
  # RELR supported API 30+, but supported 28+ with --use-android-relr-tags.
  # https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#relative-relocations-relr
  ldflags = [ "-Wl,--pack-dyn-relocs=relr,--use-android-relr-tags" ]
}

config("lld_branch_target_hardening") {
  # Config opts a shared library into BTI linker hardening. This
  # is an opt-in config (rather than default-enabled) to avoid
  # interfering with the V8 CFI bots (crbug.com/1334614).
  if (current_cpu == "arm64") {
    if (arm_control_flow_integrity == "standard") {
      # Linking objects without GNU_PROPERTY_AARCH64_FEATURE_1_BTI
      # in their .gnu.note section implicitly results in the final
      # binary losing Branch Target Identification (BTI) support.
      # Issue a warning if this happens.
      ldflags = [ "-Wl,-z,force-bti" ]
    }
  }
}

# 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) {
  # nocompile tests share output directory to avoid them all needing to rebuild
  # things. But this also means they can't run in parallel.
  pool("nocompile_pool") {
    depth = 1
  }

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