# 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/fuzzing/fuzzer.gni")
import("//build/package.gni")
import("//build/test/test_package.gni")
import("BUILD.generated.gni")
import("BUILD.generated_tests.gni")

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

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

if (current_cpu == "arm64" && (is_fuchsia || is_linux)) {
  crypto_sources += crypto_sources_linux_aarch64
} else if (current_cpu == "x64" && (is_fuchsia || is_linux)) {
  crypto_sources += crypto_sources_linux_x86_64
} else if (current_cpu == "x64" && is_mac) {
  crypto_sources += crypto_sources_mac_x86_64
} else {
  assert(false, "unsupported OS or CPU: {{current_os}}/{{current_cpu}}")
}

################
# libcrypto.so #
################
target(default_library_type, "crypto") {
  sources = crypto_sources
  public = crypto_headers
  public_configs = [ ":boringssl_config" ]
  is_fuzzer = false
  foreach(config, configs) {
    if (config == "//build/config/sanitizers:fuzzer") {
      is_fuzzer = true
    }
  }
  if (is_fuzzer) {
    configs += [ ":fuzz_config" ]
  }
  configs += [ ":internal_config" ]
  if (is_fuchsia) {
    configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
  } else {
    configs += [ ":host_config" ]
  }
}

target(default_library_type, "ssl") {
  sources = ssl_sources
  public = ssl_headers
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]
  deps = [
    ":crypto",
  ]
  if (is_fuchsia) {
    configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
  }
}

##########################
# bssl command line tool #
##########################
if (is_fuchsia) {
  package("boringssl_tool") {
    deps = [
      ":bssl",
    ]
    binaries = [
      {
        name = "bssl"
        shell = true
      },
    ]
  }
} 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) {
  unittest_package("boringssl_tests") {
    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",
  ]
}

################################################################################
# Fuzzers

# Explicitly remove the arm_cpuinfo fuzzer, which tests Linux-specific routines
if (is_fuchsia) {
  fuzzers -= [ "arm_cpuinfo" ]
}

foreach(fuzzer, fuzzers) {
  fuzz_target("${fuzzer}_fuzzer") {
    visibility = [ ":*" ]
    sources = [
      "src/fuzz/${fuzzer}.cc",
    ]
    configs += [ ":fuzz_config" ]
    deps = [
      ":crypto",
      ":ssl",
    ]
  }
}

fuzz_package("boringssl_fuzzers") {
  targets = []
  foreach(fuzzer, fuzzers) {
    targets += [ ":${fuzzer}_fuzzer" ]
  }
  sanitizers = [
    "asan",
    "ubsan",
  ]
}

################################################################################
# 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("host_config") {
  visibility = [ ":*" ]

  # pthread_rwlock_t on host requires a feature flag.
  defines = [ "_XOPEN_SOURCE=700" ]
}

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

  # TODO(INTK-682): Newer googletest's are spamming about an API rename, but
  # BoringSSL hasn't updated yet.
  cflags = [ "-Wno-deprecated-declarations" ]
}

config("fuzz_config") {
  visibility = [ ":*" ]

  # BoringSSL explicitly decided against using the common LLVM fuzzing macro:
  # https://boringssl-review.googlesource.com/c/boringssl/+/31244
  defines = [ "BORINGSSL_UNSAFE_DETERMINISTIC_MODE" ]
  configs = [ ":internal_config" ]
}
