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

assert(is_win, "This only runs on Windows.")

# Runs mc.exe over a list of sources. The outputs (a header and rc file) are
# placed in the target gen dir, and compiled.
#
# sources
#   List of message files to process.
#
# user_mode_logging (optional bool)
#   Generates user-mode logging code. Defaults to false (no logging code).
#
# deps, public_deps, visibility
#   Normal meaning.
template("message_compiler") {
  action_name = "${target_name}_mc"
  source_set_name = target_name

  action_foreach(action_name) {
    visibility = [ ":$source_set_name" ]

    script = "//build/win/message_compiler.py"

    outputs = [
      "$target_gen_dir/{{source_name_part}}.h",
      "$target_gen_dir/{{source_name_part}}.rc",
    ]

    args = [
      # The first argument is the environment file saved to the build
      # directory. This is required because the Windows toolchain setup saves
      # the VC paths and such so that running "mc.exe" will work with the
      # configured toolchain. This file is in the root build dir.
      "environment.$current_cpu",

      # Where to put the header.
      "-h",
      rebase_path(target_gen_dir, root_build_dir),

      # Where to put the .rc file.
      "-r",
      rebase_path(target_gen_dir, root_build_dir),

      # Input is Unicode.
      "-u",
    ]
    if (defined(invoker.user_mode_logging) && invoker.user_mode_logging) {
      args += [ "-um" ]
    }
    args += [ "{{source}}" ]

    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "sources",
                           ])
  }

  # Compile the generated rc file.
  source_set(source_set_name) {
    forward_variables_from(invoker, [ "visibility" ])
    sources = get_target_outputs(":$action_name")
    deps = [
      ":$action_name",
    ]
  }
}
