# Copyright 2014 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) import("//build/config/win/visual_studio_version.gni") # This template defines a rule to invoke the MS IDL compiler. The generated # source code will be compiled and linked into targets that depend on this. # # Parameters # # sources # List of .idl file to process. # # header_file (optional) # File name of generated header file. Defaults to the basename of the # source idl file with a .h extension. # # out_dir (optional) # Directory to write the generated files to. Defaults to target_gen_dir. # # generated_dir (optional) # Directory where generated files were previously persisted. # Defaults to third_party\win_build_output\midl\|out_dir|. # # dynamic_guids (optional) # If the GUIDs are not constant across builds, the current GUID # substitutions. # |dynamic_guids| is of the form: # "PLACEHOLDER-GUID-158428a4-6014-4978-83ba-9fad0dabe791=" # "3d852661-c795-4d20-9b95-5561e9a1d2d9," # "PLACEHOLDER-GUID-63B8FFB1-5314-48C9-9C57-93EC8BC6184B=" # "D0E1CACC-C63C-4192-94AB-BF8EAD0E3B83". # See midl.py for more details. # # writes_tlb (optional) # Whether a .tlb file should be added to outputs. Defaults to false. # # writes_proxy(optional) # Whether a _p.c file should be added to outputs. Defaults to true. # # writes_dlldata(optional) # Whether a .dlldata.c file should be added to outputs. Defaults to true. # # deps (optional) # # defines (optional) # Build time defines to be passed to midl.exe as /D parameter. # # visibility (optional) template("midl") { action_name = "${target_name}_idl_action" source_set_name = target_name assert(defined(invoker.sources), "Source must be defined for $target_name") if (defined(invoker.out_dir)) { out_dir = invoker.out_dir } else { out_dir = target_gen_dir } if (defined(invoker.generated_dir)) { generated_dir = rebase_path(invoker.generated_dir, root_build_dir) } else { # midl.py expects 'gen' to be replaced with 'midl'. generated_dir = rebase_path("//third_party/win_build_output", root_build_dir) + "/midl/" + rebase_path(out_dir, root_gen_dir) } if (defined(invoker.dynamic_guids)) { dynamic_guids = invoker.dynamic_guids } else { dynamic_guids = "none" } if (defined(invoker.header_file)) { header_file = invoker.header_file } else { header_file = "{{source_name_part}}.h" } if (defined(invoker.writes_tlb)) { writes_tlb = invoker.writes_tlb } else { writes_tlb = false } if (defined(invoker.writes_proxy)) { writes_proxy = invoker.writes_proxy } else { writes_proxy = true } if (defined(invoker.writes_dlldata)) { writes_dlldata = invoker.writes_dlldata } else { writes_dlldata = true } if (writes_tlb) { type_library_file = "{{source_name_part}}.tlb" } else { type_library_file = "none" } if (writes_dlldata) { dlldata_file = "{{source_name_part}}.dlldata.c" } else { dlldata_file = "none" } if (writes_proxy) { proxy_file = "{{source_name_part}}_p.c" } else { proxy_file = "none" } interface_identifier_file = "{{source_name_part}}_i.c" action_foreach(action_name) { visibility = [ ":$source_set_name" ] script = "//build/toolchain/win/midl.py" sources = invoker.sources outputs = [ "$out_dir/$header_file", "$out_dir/$interface_identifier_file", ] # These files are only added to outputs if the invoker so desires, as it # they are not always generated depending on the content of the input idl # file. if (writes_tlb) { outputs += [ "$out_dir/$type_library_file" ] } if (writes_dlldata) { outputs += [ "$out_dir/$dlldata_file" ] } if (writes_proxy) { outputs += [ "$out_dir/$proxy_file" ] } if (current_cpu == "x86") { win_tool_arch = "environment.x86" idl_target_platform = "win32" } else if (current_cpu == "x64") { win_tool_arch = "environment.x64" idl_target_platform = "x64" } else if (current_cpu == "arm64") { win_tool_arch = "environment.arm64" idl_target_platform = "arm64" } else { assert(false, "Need environment for this arch") } args = [ win_tool_arch, generated_dir, rebase_path(out_dir, root_build_dir), dynamic_guids, type_library_file, header_file, dlldata_file, interface_identifier_file, proxy_file, rebase_path("//third_party/llvm-build/Release+Asserts/bin/clang-cl.exe", root_build_dir), "{{source}}", "/char", "signed", "/env", idl_target_platform, "/Oicf", ] if (defined(invoker.defines)) { foreach(define, invoker.defines) { args += [ "/D" + define ] } } forward_variables_from(invoker, [ "deps" ]) } source_set(target_name) { forward_variables_from(invoker, [ "visibility" ]) # We only compile the IID files from the IDL tool rather than all outputs. sources = process_file_template(invoker.sources, [ "$out_dir/$interface_identifier_file" ]) public_deps = [ ":$action_name" ] } }