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

    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),
            ] + rebase_path(inputs, root_build_dir)
  }
}
