# Copyright 2013 The Flutter 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("core_wrapper_files.gni")

# Publishes client wrapper files to the output directory for distribution.
# This can be used multiple times to combine various portions of a wrapper
# library into one cohesive library for clients to consume.
#
# Files that should be built by clients go into 'sources', while headers meant
# to be included by the consuming code go into 'public'.
#
# All public code is assumed to be in the 'flutter' namespace.
template("publish_client_wrapper") {
  forward_variables_from(invoker, [ "directory_suffix" ])
  if (defined(directory_suffix)) {
    publish_dir_root = "$root_out_dir/cpp_client_wrapper_$directory_suffix"
  } else {
    publish_dir_root = "$root_out_dir/cpp_client_wrapper"
  }
  template_target_name = target_name
  namespace = "flutter"

  group(template_target_name) {
    forward_variables_from(invoker,
                           [
                             "public_deps",
                             "visibility",
                           ])
    deps = [
      ":${template_target_name}_publish_includes",
      ":${template_target_name}_publish_sources",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }

  copy("${template_target_name}_publish_includes") {
    visibility = [
      ":$template_target_name",
      ":${template_target_name}_publish_sources",
    ]

    sources = invoker.public
    outputs = [
      "$publish_dir_root/include/$namespace/{{source_file_part}}",
    ]
  }

  copy("${template_target_name}_publish_sources") {
    visibility = [ ":$template_target_name" ]

    sources = invoker.sources
    outputs = [
      "$publish_dir_root/{{source_file_part}}",
    ]

    # GN on Windows appears to do #include checks even for copy
    # targets, so add the dependency to the headers to satisfy
    # the check.
    deps = [
      ":${template_target_name}_publish_includes",
    ]
  }
}

_wrapper_readme = get_path_info("README", "abspath")

# Copies the client wrapper code to the output directory.
template("publish_client_wrapper_core") {
  publish_client_wrapper(target_name) {
    forward_variables_from(invoker,
                           [
                             "directory_suffix",
                             "visibility",
                           ])
    public = core_cpp_client_wrapper_includes
    sources = core_cpp_client_wrapper_sources + [ _wrapper_readme ]
  }
}

# A wrapper for publish_client_wrapper that will also
# publish_client_wrapper_core into the same directory.
#
# This is a convenience utility for the common case of wanting to publish
# the core wrapper and a single set of extra wrapper files corresponding to
# the platform.
template("publish_client_wrapper_extension") {
  extension_target_name = target_name
  core_target_name = "${target_name}_core"

  publish_client_wrapper_core(core_target_name) {
    visibility = [ ":$extension_target_name" ]
    forward_variables_from(invoker, [ "directory_suffix" ])
  }

  publish_client_wrapper(extension_target_name) {
    forward_variables_from(invoker,
                           [
                             "public",
                             "sources",
                             "directory_suffix",
                           ])
    public_deps = [
      ":$core_target_name",
    ]
  }
}
