# 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 (cpu_arch == "x64") {
      sources = gypi_values.boringssl_win_x86_64_sources
    } else if (cpu_arch == "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" ]

  # 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 (is_win) {
    # TODO(davidben): Fix size_t truncations in BoringSSL.
    # https://crbug.com/429039
    cflags += [ "/wd4267" ]
  }

  if (cpu_arch == "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 (cpu_arch == "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 (cpu_arch == "arm") {
    sources += gypi_values.boringssl_linux_arm_sources
  } else {
    defines += [ "OPENSSL_NO_ASM" ]
  }
}
