# Copyright 2018 The Fuchsia 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/compiled_action.gni")
import("//build/json/validate_json.gni")

# Given a .cmx file, validates the module facet of it
#
# Parameters
#   cmx (required)
#     This is the .cmx file that wants to be validated.
#
#   deps (optional)
template("cmx_module_validate") {
  module_facet_validation = target_name + "_module_facet"

  # Validate the |fuchsia.module| facet schema.
  validate_json(module_facet_validation) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    data = invoker.cmx
    schema = "//build/cmx/facets/module_facet_schema.json"
  }
}

# Validates a cmx file
#
# The cmx_validate template will ensure that a given cmx file is conformant to
# the cmx schema, as defined by //build/tools/cmx/schema.json. A stamp file is
# generated to mark that a given cmx file has passed.
#
# Parameters
#
#   data (required)
#     [file] The path to the cmx file that is to be validated
#
#   deps (optional)
#   public_deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
#
# Example of usage:
#
#   cmx_validate(format) {
#     data = meta.path
#   }
template("cmx_validate") {
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "sources",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    tool = "//build/tools/cmx"
    tool_output_name = "cmx"

    stamp_file = "$target_gen_dir/$target_name.verified"

    inputs = [
      invoker.data,
    ]

    outputs = [
      stamp_file,
    ]

    args = [
      "--stamp",
      rebase_path(stamp_file),
      "validate",
      rebase_path(invoker.data),
    ]
  }
  cmx_module_validate("module_" + target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])
    cmx = invoker.data
  }
}

# Merges together cmx files
#
# The cmx_merge template will combine the given cmx files into a single cmx
# file.
#
# Parameters
#
#   sources (required)
#     [list of files] A list of cmx files that are to be merged.
#
#   deps (optional)
#   public_deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
#
# Example of usage:
#
#   cmx_merge(format) {
#     sources = [
#       rebase_path(meta.path),
#       rebase_path(
#           "//topaz/runtime/dart_runner/meta/aot${product_suffix}_runtime"),
#     ]
#   }
template("cmx_merge") {
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "sources",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    tool = "//build/tools/cmx"
    tool_output_name = "cmx"

    merged_output = "$target_out_dir/$target_name"
    outputs = [
      merged_output,
    ]

    args = [
      "merge",
      "--output",
      rebase_path(merged_output),
    ]

    foreach(source, sources) {
      args += [
        rebase_path(source, root_build_dir),
      ]
    }
  }
}

# Formats a cmx file
#
# The cmx_format template will minify the given cmx file if is_debug is set to
# false, and will pretty-print the given cmx file if is_debug is set to true.
#
# Parameters
#
#   data (required)
#     [file] The path to the cmx file that is to be formatted
#
#   deps (optional)
#   public_deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
#
# Example of usage:
#
#   cmx_format(format) {
#     data = rebase_path(meta.path)
#   }
template("cmx_format") {
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    tool = "//build/tools/cmx"
    tool_output_name = "cmx"

    formatted_output = "$target_out_dir/$target_name"
    outputs = [
      formatted_output,
    ]

    args = [
      "format",
      "--output",
      rebase_path(formatted_output),
      invoker.data
    ]

    if (is_debug) {
        args += [ "--pretty" ]
    }
  }
}
