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

# Config for us and everybody else depending on BoringSSL.
config("openssl_config") {
  include_dirs = []
  include_dirs += [ "src/include" ]
  if (is_component_build) {
    defines = [ "BORINGSSL_SHARED_LIBRARY" ]
  }
}

# Config internal to this build file.
config("openssl_internal_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
}

# The list of BoringSSL files is kept in boringssl.gypi.
gypi_values =
    exec_script("//build/gypi_to_gn.py",
                [ rebase_path("//third_party/boringssl/boringssl.gypi") ],
                "scope",
                [ "//third_party/boringssl/boringssl.gypi" ])

# Windows' assembly is built with Yasm. The other platforms use the platform
# assembler.
if (is_win) {
  import("//third_party/yasm/yasm_assemble.gni")
  yasm_assemble("boringssl_asm") {
    if (current_cpu == "x64") {
      sources = gypi_values.boringssl_win_x86_64_sources
    } else if (current_cpu == "x86") {
      sources = gypi_values.boringssl_win_x86_sources
    }
  }
}

component("boringssl") {
  sources = gypi_values.boringssl_lib_sources

  public_configs = [ ":openssl_config" ]

  cflags = []
  defines = [
    "BORINGSSL_IMPLEMENTATION",
    "BORINGSSL_NO_STATIC_INITIALIZER",
  ]
  deps = []
  if (is_component_build) {
    defines += [ "BORINGSSL_SHARED_LIBRARY" ]
  }

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",

    # TODO(davidben): Fix size_t truncations in BoringSSL.
    # https://crbug.com/429039
    "//build/config/compiler:no_size_t_to_int_warning",
  ]

  # Also gets the include dirs from :openssl_config
  include_dirs = [
    "src/include",

    # This is for arm_arch.h, which is needed by some asm files. Since the
    # asm files are generated and kept in a different directory, they
    # cannot use relative paths to find this file.
    "src/crypto",
  ]

  if (current_cpu == "x64") {
    if (is_mac) {
      sources += gypi_values.boringssl_mac_x86_64_sources
    } else if (is_linux || is_android) {
      sources += gypi_values.boringssl_linux_x86_64_sources
    } else if (is_win) {
      deps += [ ":boringssl_asm" ]
    } else {
      defines += [ "OPENSSL_NO_ASM" ]
    }
  } else if (current_cpu == "x86") {
    if (is_mac) {
      sources += gypi_values.boringssl_mac_x86_sources
    } else if (is_linux || is_android) {
      sources += gypi_values.boringssl_linux_x86_sources
    } else if (is_win) {
      deps += [ ":boringssl_asm" ]
    } else {
      defines += [ "OPENSSL_NO_ASM" ]
    }
  } else if (current_cpu == "arm") {
    sources += gypi_values.boringssl_linux_arm_sources
  } else if (current_cpu == "arm64") {
    sources += gypi_values.boringssl_linux_aarch64_sources
  } else {
    defines += [ "OPENSSL_NO_ASM" ]
  }
}
