# Copyright 2018 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# GN template to generate static library for the given mojom files.
# How to use:
# [platform2/pkg/BUILD.gn]
# generate_mojom_bindings("foo_mojo_bindings") {
#   mojo_root = "${platform2_root}"
#   sources = [
#     "mojo/foo.mojom",
#     "mojo/foo_sub.mojom",
#   ]
# }
#
# Then this generates static library for the mojom files and the header files
# under ${root_gen_dir}/include,. E.g.
# ${root_gen_dir}/include/pkg/mojo/foo.mojom.h etc., where "mojo" directory
# comes from "sources", and "pkg" comes from the target path relative to
# |mojo_root|.
#
# If you'd like to generate binding source code and headers, but not to
# create static library, you can use generate_mojom_bindings_gen template,
# instead.
#
# Parameters:
#   sources
#       The .mojom file paths.
#   mojo_parser_extra_args (optional)
#       Extra additional arguments passed to mojom_parser.py.
#   mojo_extra_args (optional)
#       Extra additional arguments passed to mojom_bindings_generator.py.
#   mojo_root (optional)
#       Root directory used when referring across .mojom or generated files.
#       "." by default.
#   standalone (optional)
#       If true, generates a library that can be referred from other packages.
#       Otherwise it generates a thin archive assuming it's used inside the same package only.
#       Deprecated: Use `install_package` instead.
#   use_pic (optional)
#       If true, generates a position independent code instead of position independent executable.
#   mojom_bindings_generator (optional)
#       Path to the mojom_bindings_generator.py script. This is useful if
#       the script is not yet installed to the system, but the repository
#       contains it.
#       If not given, /usr/src/libmojo/mojo/mojom_bindings_generator.py
#       is used.
#   install_package (optional)
#       The package name that this mojo binding is installed to. If this is
#       set, the generated mojo c++ headers will be installed into the relative
#       path (related to `mojo_root`) under /usr/include/${install_package}/,
#       and the static library will be installed to the default library path.
#       This can be used to export mojo bindings to other packages.
#   All flags which can be interpreted by static_library target:
#       The values are used as if static_library does. Note that some flags
#       may be modified in order to reflect the parameters described above
#       and build mojom generated files.

import("//common-mk/install_config.gni")
import("//common-mk/pkg_config.gni")

# This gn generates header files under ${root_gen_dir}/include.
_mojo_output_base = "${root_gen_dir}/include"

# Thin wrapper to launch mojom_bindings_generator.py.
_mojom_bindings_generator_wrapper =
    "${platform2_root}/common-mk/mojom_bindings_generator_wrapper.py"

# Should be kept in sync with the templates (module*.tmpl) listed here:
# src/platform/libchrome/mojo/public/tools/bindings/generators/cpp_templates/
_mojom_bindings_headers_suffixes = [
  "-forward.h",
  "-import-headers.h",
  "-params-data.h",
  "-shared-internal.h",
  "-shared-message-ids.h",
  "-shared.h",
  "-test-utils.h",
  ".h",
]
_mojom_bindings_suffixes = [
                             "-shared.cc",
                             ".cc",
                           ] + _mojom_bindings_headers_suffixes

# Generates C++ mojo bindings source code and headers.
template("generate_mojom_bindings_gen") {
  forward_variables_from(invoker,
                         [
                           "mojo_parser_extra_args",
                           "mojo_extra_args",
                           "mojo_root",
                           "mojom_bindings_generator",
                           "mojom_parser",
                           "enabled_features",
                         ])

  # Path to the directory which contains mojo template files.
  mojo_templates_dir = "${target_gen_dir}/${target_name}_templates"

  if (defined(mojom_bindings_generator)) {
    mojom_bindings_generator = rebase_path(mojom_bindings_generator)
  } else {
    mojom_bindings_generator =
        "${sysroot}/usr/src/libmojo/mojo/mojom_bindings_generator.py"
  }

  if (defined(mojom_parser)) {
    mojom_parser = rebase_path(mojom_parser)
  } else {
    mojom_parser = "${sysroot}/usr/src/libmojo/mojo/mojom_parser.py"
  }

  if (!defined(mojo_parser_extra_args)) {
    mojo_parser_extra_args = []
  }

  if (!defined(mojo_extra_args)) {
    mojo_extra_args = []
  }

  if (!defined(mojo_root)) {
    mojo_root = "."
  }
  mojo_root = rebase_path(mojo_root)

  if (!defined(enabled_features)) {
    enabled_features = []
  }

  mojo_templates_dir_action_name = "${target_name}_mojo_templates_dir"
  action(mojo_templates_dir_action_name) {
    inputs = []
    outputs = [ mojo_templates_dir ]
    script = "//common-mk/file_generator_wrapper.py"
    args = [
      "mkdir",
      "-p",
      mojo_templates_dir,
    ]
  }

  mojo_templates_action_name = "${target_name}_mojo_templates"
  action(mojo_templates_action_name) {
    inputs = [
      mojom_bindings_generator,
      mojo_templates_dir,
    ]
    outputs = [ "${mojo_templates_dir}/cpp_templates.zip" ]
    script = mojom_bindings_generator
    args = [
      "--use_bundled_pylibs",
      "-o",
      mojo_templates_dir,
      "precompile",
    ]
    deps = [ ":${mojo_templates_dir_action_name}" ]
  }

  mojo_parse_action_name = "${target_name}_parse"
  action(mojo_parse_action_name) {
    inputs = [ mojom_parser ]
    sources = invoker.sources
    outputs = []
    filelist = []
    foreach(source, invoker.sources) {
      filename = get_path_info("$source", "file")
      dirname = get_path_info("$source", "gen_dir")
      relative_dir = rebase_path(".", mojo_root) + "/" +
                     rebase_path(dirname, target_gen_dir)
      outputs += [ "${_mojo_output_base}/${relative_dir}/${filename}-module" ]
      filelist += [ rebase_path("$source") ]
    }

    response_file_contents = filelist

    script = mojom_parser
    args = [
             "--mojom-file-list={{response_file_name}}",
             "--output-root",
             _mojo_output_base,
             "--input-root",
             mojo_root,  # Mojo depth.
             "--input-root",
             ".",
           ] + mojo_parser_extra_args
    foreach(enabled_feature, enabled_features) {
      args += [
        "--enable-feature",
        enabled_feature,
      ]
    }

    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
  }

  install_config_targets = []
  if (defined(invoker.install_package)) {
    mojo_output_dir = _mojo_output_base + "/" + rebase_path(".", mojo_root)
    foreach(source, invoker.sources) {
      filename = get_path_info("$source", "file")
      dirname = get_path_info("$source", "gen_dir")
      relative_dir = rebase_path(dirname, target_gen_dir)
      install_config_name = "_${target_name}-" + filename + "-install_config"
      install_config(install_config_name) {
        sources = []
        foreach(suffix, _mojom_bindings_headers_suffixes) {
          sources +=
              [ "${mojo_output_dir}/${relative_dir}/${filename}${suffix}" ]
        }
        install_path = "/usr/include/" + invoker.install_package + "/" +
                       rebase_path(".", mojo_root) + "/" + relative_dir
      }
      install_config_targets += [ ":${install_config_name}" ]
    }
  }

  action(target_name) {
    forward_variables_from(invoker, [ "sources" ])
    inputs = [
               _mojom_bindings_generator_wrapper,
               mojom_bindings_generator,
             ] + get_target_outputs(":${mojo_templates_action_name}")

    outputs = []
    filelist = []
    mojo_output_dir = _mojo_output_base + "/" + rebase_path(".", mojo_root)
    foreach(source, invoker.sources) {
      filename = get_path_info("$source", "file")
      dirname = get_path_info("$source", "gen_dir")
      relative_dir = rebase_path(dirname, target_gen_dir)
      foreach(suffix, _mojom_bindings_suffixes) {
        outputs += [ "${mojo_output_dir}/${relative_dir}/${filename}${suffix}" ]
      }
      filelist += [ rebase_path("$source") ]
    }

    response_file_contents = filelist

    script = _mojom_bindings_generator_wrapper
    args = [
             "${libbase_ver}",
             mojom_bindings_generator,
             "--use_bundled_pylibs",
             "--output_dir",
             _mojo_output_base,
             "generate",
             "--filelist={{response_file_name}}",
             "--bytecode_path",
             mojo_templates_dir,
             "-I",
             mojo_root,  # Mojo include path.
             "-d",
             mojo_root,  # Mojo depth.
             "--generators",
             "c++",
           ] + mojo_extra_args
    if (defined(invoker.disallow_native_types) &&
        invoker.disallow_native_types) {
      args += [ "--disallow_native_types" ]
    }

    if (defined(invoker.disallow_interfaces) && invoker.disallow_interfaces) {
      args += [ "--disallow_interfaces" ]
    }
    deps = [
             ":${mojo_parse_action_name}",
             ":${mojo_templates_action_name}",
           ] + install_config_targets
    if (defined(invoker.typemaps)) {
      foreach(typemap, invoker.typemaps) {
        args += [
          "--typemap",
          typemap,
        ]
      }
    }
  }
}

# Generates a static library for the given mojom files.
template("generate_mojom_bindings") {
  target_gen_name = target_name + "_gen"
  generate_mojom_bindings_gen(target_gen_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "mojo_parser_extra_args",
                             "mojo_extra_args",
                             "mojo_root",
                             "mojom_bindings_generator",
                             "mojom_parser",
                             "sources",
                             "disallow_native_types",
                             "disallow_interfaces",
                             "enabled_features",
                             "install_package",
                           ])
  }

  target_pkg_deps_name = target_name + "_pkg_deps"
  pkg_config(target_pkg_deps_name) {
    pkg_deps = [
      "libchrome",
      "libmojo",
    ]
  }

  static_library(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             # Exclude mojo related inputs.
                             "mojo_parser_extra_args",
                             "mojo_extra_args",
                             "mojo_root",
                             "mojom_bindings_generator",
                             "sources",

                             # Exclude fields, which are manually handled.
                             "all_dependent_configs",
                             "configs",
                             "deps",
                             "include_dirs",

                             # Additional fields for this rule.
                             "standalone",
                             "use_pic",
                             "install_package",
                           ])
    all_dependent_configs = [ ":${target_pkg_deps_name}" ]
    if (defined(invoker.all_dependent_configs)) {
      all_dependent_configs += invoker.all_dependent_configs
    }

    include_dirs = [ _mojo_output_base ]
    if (defined(invoker.include_dirs)) {
      include_dirs += invoker.include_dirs
    }

    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    if (defined(invoker.use_pic) && invoker.use_pic) {
      configs -= [ "//common-mk:pie" ]
      configs += [ "//common-mk:pic" ]
    }
    if ((defined(invoker.standalone) && invoker.standalone) ||
        defined(invoker.install_package)) {
      configs -= [ "//common-mk:use_thin_archive" ]
      configs += [ "//common-mk:nouse_thin_archive" ]
    }
    if (defined(invoker.install_package)) {
      install_path = "lib"
    }
    deps = [ ":${target_gen_name}" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    sources = get_target_outputs(":${target_gen_name}")
  }
}
