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