# Copyright 2019 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.

import("//build/config/ios/bundle_identifier_prefix.gni")
import("//build/config/ios/templates/ios_binary_bundle.gni")

# Template to generate a framework bundle.
#
# All the other parameters are forwarded to a shared_library target that will
# generate the bundle binary. In general, you want to pass at least "sources"
# or "deps" to have some binary objects included in your shared library.
#
# Arguments
#
#   - info_plist (optional)
#
#       path to additional Info.plist to merge into the final bundle Info.plist
#
#   - bundle_identifier_prefix (optional)
#
#       prefix for the bundle identifier (the full identifier will be defined
#       to $bundle_identifier_prefix.$output_name); if unset will defaults to
#       default_bundle_identifier_prefix
#
#   - output_name (optional)
#
#       name of the bundle without the extension; defaults to $target_name
#
#   - public_headers (optional)
#
#       list of public headers files to copy into the framework bundle; this
#       does not generate an umbrella header; an umbrella header named after
#       the framework bundle will be created
#
template("ios_framework_bundle") {
  _output_name = target_name
  if (defined(invoker.output_name)) {
    _output_name = invoker.output_name
  }

  _dylib_target = target_name + "_dylib"
  _dylib_bundle = target_name + "_dylib_bundle"

  _bundle_identifier_prefix = default_bundle_identifier_prefix
  if (defined(invoker.bundle_identifier_prefix)) {
    _bundle_identifier_prefix = invoker.bundle_identifier_prefix
  }

  _product_type = "com.apple.product-type.framework"
  _bundle_identifier = "$_bundle_identifier_prefix.$_output_name"

  shared_library(_dylib_target) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "bundle_extension",
                             "bundle_identifier_prefix",
                             "bundle_type",
                             "display_name",
                             "info_plist",
                             "output_name",
                             "public_headers",
                           ])

    output_extension = ""
    output_name = _output_name
    output_prefix_override = true
    output_dir = "$target_out_dir/$_dylib_target"

    if (!defined(ldflags)) {
      ldflags = []
    }
    ldflags += [
      "-Xlinker",
      "-install_name",
      "-Xlinker",
      "@rpath/$_output_name.framework/$_output_name",
    ]
  }

  bundle_data(_dylib_bundle) {
    product_type = _product_type
    public_deps = [ ":$_dylib_target" ]
    sources = [ "$target_out_dir/$_dylib_target/$_output_name" ]
    outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ]
  }

  if (defined(invoker.public_headers)) {
    _umbrella_target = target_name + "_umbrella"
    _umbrella_output = "$target_out_dir/$_umbrella_target/$_output_name.h"

    action(_umbrella_target) {
      script = "//build/config/ios/scripts/generate_umbrella_header.py"
      sources = []
      outputs = [ _umbrella_output ]
      args = [ "-o=" + rebase_path(_umbrella_output, root_build_dir) ] +
             rebase_path(invoker.public_headers, root_build_dir)
    }

    _headers_bundle = target_name + "_headers_bundle"

    bundle_data(_headers_bundle) {
      product_type = _product_type
      sources = invoker.public_headers + [ _umbrella_output ]
      outputs = [ "{{bundle_resources_dir}}/Headers/{{source_file_part}}" ]
      public_deps = [ ":$_umbrella_target" ]
    }
  }

  _config_name = target_name + "_config"

  config(_config_name) {
    framework_dirs = [ root_out_dir ]
    frameworks = [ "$_output_name.framework" ]
  }

  ios_binary_bundle(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "bundle_extension",
                             "bundle_type",
                             "configs",
                             "deps",
                             "output_name",
                             "public_configs",
                             "public_deps",
                             "public_headers",
                           ])

    output_name = _output_name
    product_type = _product_type
    transparent = true

    bundle_identifier = _bundle_identifier
    bundle_extension = "framework"
    bundle_type = "FMWK"

    public_deps = [ ":$_dylib_bundle" ]

    if (defined(invoker.public_headers)) {
      public_deps += [ ":$_headers_bundle" ]
    }

    public_configs = [ ":$_config_name" ]
  }

  _target_name = target_name

  bundle_data("$target_name+bundle") {
    public_deps = [ ":$_target_name" ]
    sources = [ "$root_out_dir/$_output_name.framework" ]
    outputs = [ "{{bundle_contents_dir}}/Frameworks/{{source_file_part}}" ]
  }
}
