xref: /aosp_15_r20/external/angle/build/win/message_compiler.gni (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1# Copyright 2015 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5assert(is_win, "This only runs on Windows.")
6
7# Runs mc.exe over a list of sources. The outputs (a header and rc file) are
8# placed in the target gen dir, and compiled. Sources without a BOM will be
9# processed as if they are UTF-16LE. Generated text files will be written in the
10# ANSI codepage.
11#
12# sources
13#   List of message files to process.
14#
15# user_mode_logging (optional bool)
16#   Generates user-mode logging code. Defaults to false (no logging code).
17#
18# compile_generated_code (optional, deafults = true)
19#   If unset or true, the generated code will be compiled and linked into
20#   targets that depend on it. If set to false, the .h and .rc files will only
21#   be generated.
22#
23# deps, public_deps, visibility
24#   Normal meaning.
25template("message_compiler") {
26  if (defined(invoker.compile_generated_code) &&
27      !invoker.compile_generated_code) {
28    compile_generated_code = false
29    action_name = target_name
30  } else {
31    compile_generated_code = true
32    action_name = "${target_name}_mc"
33    source_set_name = target_name
34  }
35
36  action_foreach(action_name) {
37    if (compile_generated_code) {
38      visibility = [ ":$source_set_name" ]
39    } else {
40      forward_variables_from(invoker, [ "visibility" ])
41    }
42
43    script = "//build/win/message_compiler.py"
44
45    outputs = [
46      "$target_gen_dir/{{source_name_part}}.h",
47      "$target_gen_dir/{{source_name_part}}.rc",
48    ]
49
50    args = [
51      # The first argument is the environment file saved to the build
52      # directory. This is required because the Windows toolchain setup saves
53      # the VC paths and such so that running "mc.exe" will work with the
54      # configured toolchain. This file is in the root build dir.
55      "environment.$current_cpu",
56
57      # Where to put the header.
58      "-h",
59      rebase_path(target_gen_dir, root_build_dir),
60
61      # Where to put the .rc file.
62      "-r",
63      rebase_path(target_gen_dir, root_build_dir),
64
65      # Sources without a BOM are UTF-16LE.
66      "-u",
67    ]
68    if (defined(invoker.user_mode_logging) && invoker.user_mode_logging) {
69      args += [ "-um" ]
70    }
71    args += [ "{{source}}" ]
72
73    forward_variables_from(invoker,
74                           [
75                             "deps",
76                             "public_deps",
77                             "sources",
78                           ])
79  }
80
81  if (compile_generated_code) {
82    # Compile the generated rc file.
83    source_set(source_set_name) {
84      forward_variables_from(invoker, [ "visibility" ])
85      sources = get_target_outputs(":$action_name")
86      deps = [ ":$action_name" ]
87    }
88  }
89}
90