# Copyright 2014 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. import("//third_party/WebKit/Source/bindings/core/v8/generated.gni") import("//third_party/WebKit/Source/bindings/modules/idl.gni") import("//third_party/WebKit/Source/bindings/modules/modules.gni") bindings_scripts_dir = get_path_info(".", "abspath") bindings_scripts_output_dir = "$root_gen_dir/blink/bindings/scripts" # Replacing <(DEPTH) with "/" makes paths like "<(DEPTH)/foo" absolute. _gypi = exec_script( "//build/gypi_to_gn.py", [ rebase_path("scripts.gypi"), "--replace=<(DEPTH)=/" ], "scope", [ "scripts.gypi" ]) jinja_module_files = get_path_info(_gypi.jinja_module_files, "abspath") idl_lexer_parser_files = get_path_info(_gypi.idl_lexer_parser_files, "abspath") idl_compiler_files = get_path_info(_gypi.idl_compiler_files, "abspath") # Calls the compute_interfaces_info_individual script. # # Parameters: # sources_static = list of IDL files to pass as inputs # sources_generated = list of generated IDL files to pass as inputs # component_dir = name if subdirectory (one word, no slashes) of component. # output_file = pickle file to write # # FIXME: Note the static/generated split is for consistency with GYP. This # split is not necessary in the GN build and could be combined into a single # "sources". template("compute_interfaces_info_individual") { action(target_name) { script = "$bindings_scripts_dir/compute_interfaces_info_individual.py" if (defined(invoker.visibility)) { visibility = invoker.visibility } # Save static list to temp file to avoid blowing out command-line length # limit. file_list = "$target_gen_dir/${target_name}_file_list.txt" write_file(file_list, rebase_path(invoker.sources_static, root_build_dir)) inputs = [ "$bindings_scripts_dir/utilities.py", file_list, ] + invoker.sources_static + invoker.sources_generated outputs = [ invoker.output_file ] args = [ "--idl-files-list", rebase_path(file_list, root_build_dir), "--interfaces-info-file", rebase_path(invoker.output_file, root_build_dir), "--write-file-only-if-changed=1", "--", ] + rebase_path(invoker.sources_generated, root_build_dir) deps = [ # FIXME: should be {modules|core}_generated_idls # http://crbug.com/358074 "//third_party/WebKit/Source/bindings:generated_idls", ] } } # Calls generate_event_interfaces # # Parameters: # sources = A list of IDL files to process. # output_file = The .in file to write, relative to the blink_gen_dir. # suffix = (Optional) String to be passed to script via --suffix template("generate_event_interfaces") { action(target_name) { # Write the file list to a unique temp file to avoid blowing out the # command line length limit. idl_files_list = "$target_gen_dir/${target_name}_file_list.tmp" write_file(idl_files_list, rebase_path(invoker.sources, root_build_dir)) inputs = [ "//third_party/WebKit/Source/bindings/scripts/utilities.py", idl_files_list, ] + invoker.sources output_file = "$root_gen_dir/blink/" + invoker.output_file outputs = [ output_file ] script = "//third_party/WebKit/Source/bindings/scripts/generate_event_interfaces.py" args = [ "--event-idl-files-list", rebase_path(idl_files_list, root_build_dir), "--event-interfaces-file", rebase_path(output_file, root_build_dir), "--write-file-only-if-changed=1", # Always true for Ninja. ] if (defined(invoker.suffix)) { args += [ "--suffix", invoker.suffix ] } } } # Runs the idl_compiler script over a list of sources. # # Parameters: # sources = list of IDL files to compile # output_dir = string containing the directory to put the output files. template("idl_compiler") { output_dir = invoker.output_dir action_foreach(target_name) { # TODO(brettw) GYP adds a "-S before the script name to skip "import site" to # speed up startup. Figure out if we need this and do something similar (not # really expressible in GN now). script = "//third_party/WebKit/Source/bindings/scripts/idl_compiler.py" inputs = idl_lexer_parser_files + # to be explicit (covered by parsetab) idl_compiler_files inputs += [ "$bindings_scripts_output_dir/lextab.py", "$bindings_scripts_output_dir/parsetab.pickle", "$bindings_scripts_output_dir/cached_jinja_templates.stamp", "$bindings_dir/IDLExtendedAttributes.txt", # If the dependency structure or public interface info (e.g., # [ImplementedAs]) changes, we rebuild all files, since we're not # computing dependencies file-by-file in the build. # This data is generally stable. "$bindings_modules_output_dir/InterfacesInfoModules.pickle", ] # Further, if any dependency (partial interface or implemented # interface) changes, rebuild everything, since every IDL potentially # depends on them, because we're not computing dependencies # file-by-file. # FIXME: This is too conservative, and causes excess rebuilds: # compute this file-by-file. http://crbug.com/341748 # This should theoretically just be the IDL files passed in. inputs += all_dependency_idl_files sources = invoker.sources outputs = [ "$output_dir/V8{{source_name_part}}.cpp", "$output_dir/V8{{source_name_part}}.h", ] args = [ "--cache-dir", rebase_path(bindings_scripts_output_dir, root_build_dir), "--output-dir", rebase_path(output_dir, root_build_dir), "--interfaces-info", rebase_path("$bindings_modules_output_dir/InterfacesInfoModules.pickle", root_build_dir), "--write-file-only-if-changed=1", # Always true for Ninja. "{{source}}", ] deps = [ # FIXME: should be interfaces_info_core (w/o modules) # http://crbug.com/358074 "//third_party/WebKit/Source/bindings/modules:interfaces_info", "//third_party/WebKit/Source/bindings/scripts:cached_lex_yacc_tables", "//third_party/WebKit/Source/bindings/scripts:cached_jinja_templates", "//third_party/WebKit/Source/core:generated_testing_idls", ] } } # Runs the idl_compiler to generate IDL dictionary impl files. # # Parameters: # sources = a list of IDL files to process # outputs = a list of files to write to template("idl_dictionary") { output_dir = "$root_gen_dir/blink/" action(target_name) { script = "//third_party/WebKit/Source/bindings/scripts/idl_compiler.py" idl_files_list = "$target_gen_dir/${target_name}_file_list.tmp" write_file(idl_files_list, rebase_path(invoker.sources, root_build_dir)) inputs = [ idl_files_list ] + invoker.sources outputs = invoker.outputs args = [ "--cache-dir", rebase_path(bindings_scripts_output_dir, root_build_dir), "--output-dir", rebase_path(output_dir, root_build_dir), "--interfaces-info", rebase_path("$bindings_modules_output_dir/InterfacesInfoModules.pickle", root_build_dir), "--write-file-only-if-changed=1", "--generate-dictionary-impl", rebase_path(idl_files_list, root_build_dir), ] deps = [ # FIXME: should be interfaces_info_core (w/o modules) # http://crbug.com/358074 "//third_party/WebKit/Source/bindings/modules:interfaces_info", "//third_party/WebKit/Source/bindings/scripts:cached_lex_yacc_tables", "//third_party/WebKit/Source/bindings/scripts:cached_jinja_templates", ] } } # Calls the aggregate_generated_bindings script. # # Parameters: # sources = a list of source IDL files. # component_dir = Name of directory for these files (one word, no slashes). # outputs = a list of files to write to. template("aggregate_generated_bindings") { action(target_name) { script = "//third_party/WebKit/Source/bindings/scripts/aggregate_generated_bindings.py" # Write lists of main IDL files to a file, so that the command lines don't # exceed OS length limits. idl_files_list = "$target_gen_dir/${target_name}_file_list.tmp" write_file(idl_files_list, rebase_path(invoker.sources, root_build_dir)) inputs = [ idl_files_list ] + invoker.sources outputs = invoker.outputs args = [ invoker.component_dir, rebase_path(idl_files_list, root_build_dir), "--", ] args += rebase_path(invoker.outputs, root_build_dir) } }