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

# Runs the resources map generation script other the given header files to
# produce an output file and a source_set to build it.
#
# Parameters:
#   inputs:
#     List of file name to read. Each file should be a .xml file with
#     histogram descriptions.
#
#   namespace (optional):
#     Namespace in which the generated code should be scoped. If left empty,
#     the code will be in the global namespace.
#
#   header_filename:
#     Name of the generated header file.
#
#   major_branch_date_filepath:
#     A path to the file with the base date.
#
#   milestone_filepath:
#     A path to the file with the milestone information.
#
template("generate_expired_histograms_array") {
  action(target_name) {
    header_filename = "$target_gen_dir/" + invoker.header_filename

    script = "//tools/metrics/histograms/generate_expired_histograms_array.py"
    outputs = [
      header_filename,
    ]

    inputs = invoker.inputs
    major_branch_date_filepath = invoker.major_branch_date_filepath
    milestone_filepath = invoker.milestone_filepath

    args = []

    if (defined(invoker.namespace) && invoker.namespace != "") {
      args += [ "-n" + invoker.namespace ]
    }

    args += [
              "-o" + rebase_path(root_gen_dir, root_build_dir),
              "-H" + rebase_path(header_filename, root_gen_dir),
              "-d" + rebase_path(major_branch_date_filepath, root_build_dir),
              "-m" + rebase_path(milestone_filepath, root_build_dir),
            ] + rebase_path(inputs, root_build_dir)
  }
}
