# 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.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) {
  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",
  ]
}

################################################################################
# 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",
    ]
    corpora = [ get_path_info("src/fuzz/${fuzzer}_corpus", "abspath") ]
  }
}

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" ]
}
