# Copyright 2016 The Fuchsia Authors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#    * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#    * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# GENERATE comment - This file is a template used by 'fuchsia/generate.py'.

  # TODO(aarongreen): Switch on asm and threads.
config("boringssl_config") {
  include_dirs = [ "include" ]
  if (defined(is_fuchsia) && is_fuchsia) {
    libs = [ "magenta" ]
  }
  defines = [
    "OPENSSL_NO_THREADS",
  ]
}

config("internal_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  defines = [
    "BORINGSSL_IMPLEMENTATION",
    "BORINGSSL_SHARED_LIBRARY",
    "BORINGSSL_NO_STATIC_INITIALIZER",
    "OPENSSL_SMALL",
    "OPENSSL_NO_ASM",
    "_XOPEN_SOURCE=700" ,
  ]
  cflags_c = [ "-std=c11" ]
}

shared_library("crypto") {
  sources = [
    # GENERATE crypto_sources
  ]
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]
}

shared_library("ssl") {
  sources = [
    # GENERATE ssl_sources
  ]
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]
}

group("boringssl") {
  deps = [
    ":crypto",
    ":ssl",
  ]
  public_configs = [ ":boringssl_config" ]
}

executable("bssl") {
  sources = [
    # GENERATE bssl_sources
  ]
  configs += [ ":internal_config" ]
  deps = [ ":boringssl" ]
}

source_set("test_support") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  testonly = true
  sources = [
    # GENERATE test_support_sources
  ]
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]
  deps = [ ":boringssl" ]
}

template("unit_test") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  testonly = true
  assert(defined(invoker.sources))
  executable(target_name) {
    sources = invoker.sources
    configs += [ ":internal_config" ]
    deps = [
      ":test_support"
    ]
  }
}

# GENERATE unit_tests
