| # Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file | 
 | # for details. All rights reserved. Use of this source code is governed by a | 
 | # BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | _dart_root = rebase_path("../..") | 
 |  | 
 | # copy_tree() copies a directory tree rooted at `source` to `dest`, which should | 
 | # be somewhere under $root_out_dir. | 
 | # | 
 | # Optional parameters: | 
 | # exclude - A comma separated list that is passed to shutil.ignore_patterns() | 
 | #           in tools/copy_tree.py. | 
 | template("_copy_tree") { | 
 |   assert(defined(invoker.source), "copy_tree must define 'source'") | 
 |   assert(defined(invoker.dest), "copy_tree must define 'dest'") | 
 |   assert(defined(invoker.inputs), "copy_tree must define 'inputs'") | 
 |   source = invoker.source | 
 |   dest = invoker.dest | 
 |   inputs = invoker.inputs | 
 |   action(target_name) { | 
 |     if (defined(invoker.visibility)) { | 
 |       visibility = invoker.visibility | 
 |     } | 
 |  | 
 |     deps = [] | 
 |     if (defined(invoker.deps)) { | 
 |       deps += invoker.deps | 
 |     } | 
 |  | 
 |     common_args = [ | 
 |       "--from", | 
 |       rebase_path(source), | 
 |       "--to", | 
 |       rebase_path(dest), | 
 |     ] | 
 |     if (defined(invoker.exclude)) { | 
 |       common_args += [ | 
 |         "--exclude", | 
 |         invoker.exclude, | 
 |       ] | 
 |     } | 
 |  | 
 |     relative_files = rebase_path(inputs, rebase_path(source)) | 
 |  | 
 |     output_files = [] | 
 |     foreach(input, relative_files) { | 
 |       output_files += [ "$dest/$input" ] | 
 |     } | 
 |  | 
 |     outputs = output_files | 
 |     script = "$_dart_root/tools/copy_tree.py" | 
 |     args = common_args | 
 |   } | 
 | } | 
 |  | 
 | # copy_trees() arranges to invoke copy_tree.py only once to gather the list of | 
 | # input source files for every _copy_tree() target. It takes a list of scopes as | 
 | # a parameter. The scopes should contain the following mappings. | 
 | # | 
 | # target: The target name for the _copy_tree() target. | 
 | # visibility: The visibility for the _copy_tree() target. | 
 | # source: The source directory relative to this directory. | 
 | # dest: The destination directory for the _copy_tree() target. | 
 | # deps: Any deps needed for the _copy_tree() target. | 
 | # ignore_patterns: Patterns to ignore when walking the directory tree. | 
 | #                  This should be '{}' if nothing should be ignored. | 
 | # | 
 | # copy_trees() will then make sure each invocation of _copy_tree() has the | 
 | # correct 'inputs' parameter | 
 | template("copy_trees") { | 
 |   assert(defined(invoker.sources), "$target_name must define 'source'") | 
 |   sources = invoker.sources | 
 |   copy_tree_source_paths = [] | 
 |   foreach(copy_tree_spec, sources) { | 
 |     copy_tree_source_paths += [ | 
 |       rebase_path(copy_tree_spec.source), | 
 |       copy_tree_spec.ignore_patterns, | 
 |     ] | 
 |   } | 
 |  | 
 |   # Evaluate script output as GN, producing a scope containing a single value | 
 |   # "sources" | 
 |   copy_tree_inputs_scope = exec_script("$_dart_root/tools/copy_tree.py", | 
 |                                        [ "--gn" ] + copy_tree_source_paths, | 
 |                                        "scope") | 
 |  | 
 |   # A list of lists of input source files for copy_tree. | 
 |   copy_tree_inputs = copy_tree_inputs_scope.sources | 
 |   copy_tree_inputs_index = 0 | 
 |   foreach(copy_tree_spec, sources) { | 
 |     _copy_tree(copy_tree_spec.target) { | 
 |       visibility = copy_tree_spec.visibility | 
 |       source = copy_tree_spec.source | 
 |       dest = copy_tree_spec.dest | 
 |       inputs = copy_tree_inputs[copy_tree_inputs_index] | 
 |       if (defined(copy_tree_spec.deps)) { | 
 |         deps = copy_tree_spec.deps | 
 |       } | 
 |       if (copy_tree_spec.ignore_patterns != "{}") { | 
 |         exclude = copy_tree_spec.ignore_patterns | 
 |       } | 
 |     } | 
 |     copy_tree_inputs_index = copy_tree_inputs_index + 1 | 
 |   } | 
 | } |