# 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 openssl.
config("openssl_config") {
  include_dirs = []
  if (cpu_arch == "x64") {
    # Ensure the 64-bit opensslconf.h header is used in preference to the one
    # in openssl/include.
    include_dirs += [ "config/x64" ]
  }

  include_dirs += [ "openssl/include" ]
}

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

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

component("openssl") {
  sources = gypi_values.openssl_common_sources

  defines = gypi_values.openssl_common_defines
  defines += [
    "PURIFY",
    "MONOLITH",
  ]

  direct_dependent_configs = [ ":openssl_config" ]

  cflags = []

  # Also gets the include dirs from :openssl_config
  include_dirs = [
    ".",
    "openssl",
    "openssl/crypto",
    "openssl/crypto/asn1",
    "openssl/crypto/evp",
    "openssl/crypto/modes",
  ]

  if (is_posix && !is_android) {
    defines += [
      # ENGINESDIR must be defined if OPENSSLDIR is.
      "ENGINESDIR=\"/dev/null\"",
      # Set to ubuntu default path for convenience. If necessary, override
      # this at runtime with the SSL_CERT_DIR environment variable.
      "OPENSSLDIR=\"/etc/ssl\"",
    ]
  }

  if (cpu_arch == "x64") {
    sources += gypi_values.openssl_x86_64_sources
    sources -= gypi_values.openssl_x86_64_source_excludes
    defines += gypi_values.openssl_x86_64_defines
  } else if (cpu_arch == "x86") {
    sources += gypi_values.openssl_x86_sources
    sources -= gypi_values.openssl_x86_source_excludes
    defines += gypi_values.openssl_x86_defines
  } else if (cpu_arch == "arm") {
    # The ARM sources do not compile with full warnings enabled.
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]

    sources += gypi_values.openssl_arm_sources
    sources -= gypi_values.openssl_arm_source_excludes
    defines += gypi_values.openssl_arm_defines
  } else if (cpu_arch == "mips") {
    sources += gypi_values.openssl_mips_sources
    sources -= gypi_values.openssl_mips_source_excludes
    defines += gypi_values.openssl_mips_defines
  }

  if (is_clang) {
    cflags += [
      # OpenSSL has a few |if ((foo == NULL))| checks.
      "-Wno-parentheses-equality",
      # OpenSSL uses several function-style macros and then ignores the
      # returned value.
      "-Wno-unused-value",
    ]
  } else {
    cflags += [
      "-Wno-unused-variable",
    ]
  }
}
