# Copyright 2017 The Fuchsia 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/cpp/prebuilt_shared_library.gni")
import("//build/package.gni")
import("BUILD.generated.gni")
import("BUILD.generated_tests.gni")

################################################################################
# Public targets

group("boringssl") {
  public_deps = [
    ":crypto",
    ":ssl",
  ]
}

if (is_fuchsia) {
  library_type = "prebuilt_shared_library"
} else {
  library_type = default_library_type
}

################
# libcrypto.so #
################
target(library_type, "crypto") {
  if (is_fuchsia) {
    category = "partner"
  }
  sources = crypto_sources
  public = crypto_headers
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]
  if (current_cpu == "arm64") {
    if (is_mac) {
      sources += crypto_sources_ios_aarch64
      configs += [ ":pthread_config" ]
    } else if (is_fuchsia) {
      # TODO(aarongreen): Switch once aarch64 once crypto/cpu-aarch64-fuchsia.c
      # is upstreamed.
      # sources += crypto_sources_linux_aarch64
      configs += [ ":no_asm_config" ]
    } else if (is_linux) {
      sources += crypto_sources_linux_aarch64
      configs += [ ":pthread_config" ]
    } else {
      assert(false, "unsupported OS: {{current_os}}")
    }
  } else if (current_cpu == "x64") {
    if (is_mac) {
      sources += crypto_sources_mac_x86_64
      configs += [ ":pthread_config" ]
    } else if (is_fuchsia) {
      # Fuchsia assembly is the same as Linux on x86-64, for now; i.e. ELF.
      sources += crypto_sources_linux_x86_64
    } else if (is_linux) {
      sources += crypto_sources_linux_x86_64
      configs += [ ":pthread_config" ]
    } else {
      assert(false, "unsupported OS: {{current_os}}")
    }
  } else {
    assert(false, "unsupported CPU: {{current_cpu}}")
  }
  if (is_fuchsia) {
    include_base = "//third_party/boringssl/src/include"
    deps = [ "//zircon/public/lib/zxcpp" ]
  }
}

target(library_type, "ssl") {
  if (is_fuchsia) {
    category = "partner"
  }
  sources = ssl_sources
  public = ssl_headers
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]
  deps = [
    ":crypto",
  ]
  if (is_fuchsia) {
    runtime_deps = [ ":crypto_sdk" ]
    include_base = "//third_party/boringssl/src/include"
    deps += [ "//zircon/public/lib/zxcpp" ]
  }
}

##########################
# bssl command line tool #
##########################
if (is_fuchsia) {
  package("boringssl_tool") {
    deprecated_system_image = true
    deps = [
      ":bssl",
    ]
    binaries = [
      {
        name = "bssl"
      },
    ]
  }
} else {
  group("boringssl_tool") {
    deps = [
      ":bssl_tool",
    ]
  }
}

# See //third_party/boringssl/tool/CMakeLists.txt
executable("bssl") {
  visibility = [ ":*" ]
  sources = [
    "src/tool/args.cc",
    "src/tool/ciphers.cc",
    "src/tool/client.cc",
    "src/tool/const.cc",
    "src/tool/digest.cc",
    "src/tool/file.cc",
    "src/tool/generate_ed25519.cc",
    "src/tool/genrsa.cc",
    "src/tool/pkcs12.cc",
    "src/tool/rand.cc",
    "src/tool/server.cc",
    "src/tool/sign.cc",
    "src/tool/speed.cc",
    "src/tool/tool.cc",
    "src/tool/transport_common.cc",
  ]
  configs += [ "//third_party/boringssl:internal_config" ]
  deps = [
    ":crypto",
    ":ssl",
  ]
}

##############
# Unit tests #
##############
if (is_fuchsia) {
  package("boringssl_tests") {
    testonly = true
    deps = [
      ":crypto_test",
      ":ssl_test",
    ]
    tests = [
      {
        name = "crypto_test"

        # This test takes a long time to run, and it is included in every subset
        # of the Fuchsia build.
        # TODO(bgoldman): Find a way to skip this test when runtests is set to
        # skip "large" tests.
        disabled = true
      },
      {
        name = "ssl_test"
      },
    ]
  }
} else {
  group("tests") {
    testonly = true
    deps = [
      ":crypto_test",
      ":ssl_test",
    ]
  }
}

executable("crypto_test") {
  testonly = true
  visibility = [ ":*" ]
  sources = crypto_test_sources + test_support_sources
  configs += [ ":test_config" ]
  deps = [
    ":crypto",
    "//third_party/googletest:gtest",
  ]
}

executable("ssl_test") {
  testonly = true
  visibility = [ ":*" ]
  sources = ssl_test_sources + test_support_sources
  configs += [ ":test_config" ]
  deps = [
    ":crypto",
    ":ssl",
    "//third_party/googletest:gtest",
  ]
}

################################################################################
# Configs
config("boringssl_config") {
  include_dirs = [ "src/include" ]
  if (is_fuchsia) {
    # rand_fuchsia uses a system call
    libs = [ "zircon" ]
  }
}

config("internal_config") {
  visibility = [ ":*" ]
  defines = [
    "BORINGSSL_ALLOW_CXX_RUNTIME",
    "BORINGSSL_IMPLEMENTATION",
    "BORINGSSL_NO_STATIC_INITIALIZER",
    "BORINGSSL_SHARED_LIBRARY",
    "OPENSSL_SMALL",
  ]
  cflags = [ "-Wno-unused-function" ]
  configs = [
    ":boringssl_config",
    "//build/config:shared_library_config",
  ]
}

config("pthread_config") {
  # pthread_rwlock_t on host requires a feature flag.
  defines = [ "_XOPEN_SOURCE=700" ]
}

config("no_asm_config") {
  defines = [ "OPENSSL_NO_ASM" ]
}

config("test_config") {
  visibility = [ ":*" ]
  include_dirs = [
    "src/crypto/test",
    "src/ssl/test",
  ]
  configs = [ ":internal_config" ]
}
