# Copyright 2018 The Chromium OS Authors. All rights reserved.
# 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_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.
#   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.
#   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/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"

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

  # 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_extra_args)) {
    mojo_extra_args = []
  }

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

  mojo_templates_dir_action_name = "${target_name}_mojo_templates_dir"
  action(mojo_templates_dir_action_name) {
    inputs = []
    outputs = [ mojo_templates_dir ]
    print("Creating mojo C++ 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" ]
    print("Generating mojo C++ templates")
    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",
      ".",
    ]
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
  }

  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)
      outputs += [
        "${mojo_output_dir}/${relative_dir}/${filename}-internal.h",
        "${mojo_output_dir}/${relative_dir}/${filename}-shared.cc",
        "${mojo_output_dir}/${relative_dir}/${filename}-shared.h",
        "${mojo_output_dir}/${relative_dir}/${filename}.cc",
        "${mojo_output_dir}/${relative_dir}/${filename}.h",
        "${mojo_output_dir}/${relative_dir}/${filename}-shared-message-ids.h",
      ]
      filelist += [ rebase_path("$source") ]
    }

    response_file_contents = filelist

    print("Generating mojo C++ bindings")
    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}",
    ]
    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_extra_args",
                             "mojo_root",
                             "mojom_bindings_generator",
                             "mojom_parser",
                             "sources",
                             "disallow_native_types",
                             "disallow_interfaces",
                           ])
  }

  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_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",
                           ])
    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) {
      configs -= [ "//common-mk:use_thin_archive" ]
      configs += [ "//common-mk:nouse_thin_archive" ]
    }
    deps = [ ":${target_gen_name}" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

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