# Copyright 2015 The Chromium Authors
# 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).
#
# compile_generated_code (optional, deafults = true)
#   If unset or true, the generated code will be compiled and linked into
#   targets that depend on it. If set to false, the .h and .rc files will only
#   be generated.
#
# deps, public_deps, visibility
#   Normal meaning.
template("message_compiler") {
  if (defined(invoker.compile_generated_code) &&
      !invoker.compile_generated_code) {
    compile_generated_code = false
    action_name = target_name
  } else {
    compile_generated_code = true
    action_name = "${target_name}_mc"
    source_set_name = target_name
  }

  action_foreach(action_name) {
    if (compile_generated_code) {
      visibility = [ ":$source_set_name" ]
    } else {
      forward_variables_from(invoker, [ "visibility" ])
    }

    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",
                           ])
  }

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