|  | # 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("//sky/engine/bindings/core/v8/generated.gni") | 
|  | import("//sky/engine/bindings/core/core.gni") | 
|  | import("//sky/engine/bindings/core/idl.gni") | 
|  |  | 
|  | bindings_scripts_dir = get_path_info(".", "abspath") | 
|  | bindings_scripts_output_dir = "$root_gen_dir/sky/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" ] + invoker.sources_static + | 
|  | invoker.sources_generated | 
|  |  | 
|  | outputs = [ | 
|  | file_list, | 
|  | invoker.output_file, | 
|  | ] | 
|  |  | 
|  | args = [ | 
|  | "--component-dir", | 
|  | invoker.component_dir, | 
|  | "--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 | 
|  | "//sky/engine/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 sky_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 = [ | 
|  | "//sky/engine/bindings/scripts/utilities.py", | 
|  | idl_files_list, | 
|  | ] + invoker.sources | 
|  |  | 
|  | output_file = "$root_gen_dir/sky/" + invoker.output_file | 
|  | outputs = [ | 
|  | output_file, | 
|  | ] | 
|  |  | 
|  | script = "//sky/engine/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 = "//sky/engine/bindings/scripts/idl_compiler.py" | 
|  |  | 
|  | inputs = idl_lexer_parser_files + idl_compiler_files  # to be explicit (covered by parsetab) | 
|  | 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_core_output_dir/InterfacesInfoAll.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 += core_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_core_output_dir/InterfacesInfoAll.pickle", | 
|  | root_build_dir), | 
|  | "--write-file-only-if-changed=1",  # Always true for Ninja. | 
|  | "{{source}}", | 
|  | ] | 
|  |  | 
|  | deps = [ | 
|  | "//sky/engine/bindings/core/v8:interfaces_info", | 
|  | "//sky/engine/bindings/scripts:cached_lex_yacc_tables", | 
|  | "//sky/engine/bindings/scripts:cached_jinja_templates", | 
|  | "//sky/engine/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/sky/" | 
|  |  | 
|  | action(target_name) { | 
|  | script = "//sky/engine/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_core_output_dir/InterfacesInfoAll.pickle", | 
|  | root_build_dir), | 
|  | "--write-file-only-if-changed=1", | 
|  | "--generate-dictionary-impl", | 
|  | rebase_path(idl_files_list, root_build_dir), | 
|  | ] | 
|  |  | 
|  | deps = [ | 
|  | "//sky/engine/bindings/core/v8:interfaces_info", | 
|  | "//sky/engine/bindings/scripts:cached_lex_yacc_tables", | 
|  | "//sky/engine/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 = "//sky/engine/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) | 
|  | } | 
|  | } |