|  | # 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 | 
|  | } | 
|  | } |