|  | # Copyright 2020 The Pigweed Authors | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); you may not | 
|  | # use this file except in compliance with the License. You may obtain a copy of | 
|  | # the License at | 
|  | # | 
|  | #     https://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | # License for the specific language governing permissions and limitations under | 
|  | # the License. | 
|  |  | 
|  | import("//build_overrides/pigweed.gni") | 
|  |  | 
|  | import("$dir_pw_build/python_action.gni") | 
|  |  | 
|  | # Takes a set of input sources and zips them up to a .zip output. | 
|  | # | 
|  | # Users can either pass in specific input files or entire directories. | 
|  | # This target type also supports renaming files as well as specifing | 
|  | # desired zip destination directories for each input source. | 
|  | # | 
|  | # Args: | 
|  | #   deps: Dependencies for this target. | 
|  | # | 
|  | #   inputs: List of input files following the custom input formatting | 
|  | #      convention. See below for syntax. | 
|  | # | 
|  | #   dirs: List of directories to be completely zipped up following the same | 
|  | #     input formatting convention. See below for syntax. | 
|  | # | 
|  | #   output: Filename of artifact .zip file produced by script's execution. | 
|  | # | 
|  | # Each input follows the following convention: | 
|  | #   /source_path > /zip_destination/ | 
|  | # | 
|  | # All directories are expected to be end with a '/'. Inputs must always specify | 
|  | # both a source and a destination. Destinations are expected to have a leading | 
|  | # '/' which stands for the root of the archive. | 
|  | # | 
|  | # Example: | 
|  | #   Let's say we have the following structure for a //source/ directory: | 
|  | # | 
|  | #     source/ | 
|  | #     ├── file1.txt | 
|  | #     ├── file2.txt | 
|  | #     ├── file3.txt | 
|  | #     └── some_dir/ | 
|  | #         ├── file4.txt | 
|  | #         └── some_other_dir/ | 
|  | #             └── file5.txt | 
|  | # | 
|  | #   And we create the following build target: | 
|  | # | 
|  | #     import("$dir_pw_build/zip.gni") | 
|  | # | 
|  | #     pw_zip("target_name") { | 
|  | #       inputs = [ | 
|  | #         "//source/file1.txt > /",             # Copied to the zip root dir. | 
|  | #         "//source/file2.txt > /renamed.txt",  # File renamed. | 
|  | #         "//source/file3.txt > /bar/",         # File moved to the /bar/ dir. | 
|  | #       ] | 
|  | # | 
|  | #       dirs = [ | 
|  | #         "//source/some_dir/ > /bar/some_dir/",  # Whole /some_dir/ contents | 
|  | #                                                 # copied as /bar/some_dir/. | 
|  | #       ] | 
|  | # | 
|  | #       # Note on output: if the specific output directory isn't defined | 
|  | #       # (such as output = "zoo.zip") then the .zip will output to the | 
|  | #       # same directory as the BUILD.gn file that called the target. | 
|  | #       output = "//$target_out_dir/foo.zip",  # Where the foo.zip will end up | 
|  | #     } | 
|  | # | 
|  | #   This will result in a .zip file called foo.zip stored in //$target_out_dir | 
|  | #   with the following structure: | 
|  | # | 
|  | #     foo.zip | 
|  | #     ├── bar/ | 
|  | #     │   ├── file3.txt | 
|  | #     │   └── some_dir/ | 
|  | #     │       ├── file4.txt | 
|  | #     │       └── some_other_dir/ | 
|  | #     │           └── file5.txt | 
|  | #     ├── file1.txt | 
|  | #     └── renamed.txt | 
|  | # | 
|  | template("pw_zip") { | 
|  | _delimiter = ">" | 
|  | pw_python_action(target_name) { | 
|  | forward_variables_from(invoker, [ "deps" ]) | 
|  | script = "$dir_pw_build/py/pw_build/zip.py" | 
|  |  | 
|  | args = [ "--out_filename" ] | 
|  | args += [ rebase_path(invoker.output) ] | 
|  |  | 
|  | inputs = [] | 
|  | args += [ "--input_list" ] | 
|  | if (defined(invoker.inputs)) { | 
|  | foreach(input, invoker.inputs) { | 
|  | # Adding spaces around our delimiter is great for readability, | 
|  | # but not great for the string split: remove the spacing. | 
|  | input = string_replace(input, " $_delimiter", _delimiter) | 
|  | input = string_replace(input, "$_delimiter ", _delimiter) | 
|  |  | 
|  | input_list = [] | 
|  | input_list = string_split(input, _delimiter) | 
|  | input_list[0] = rebase_path(input_list[0]) | 
|  | inputs += [ input_list[0] ] | 
|  |  | 
|  | # Pass rebased and delimited path to script. | 
|  | args += [ string_join(_delimiter, input_list) ] | 
|  | } | 
|  | } | 
|  |  | 
|  | if (defined(invoker.dirs)) { | 
|  | foreach(dir, invoker.dirs) { | 
|  | # Adding spaces around our delimiter is great for readability, | 
|  | # but not great for the string split: remove the spacing. | 
|  | dir = string_replace(dir, " $_delimiter", _delimiter) | 
|  | dir = string_replace(dir, "$_delimiter ", _delimiter) | 
|  |  | 
|  | args += [ rebase_path(dir) ] | 
|  | } | 
|  | } | 
|  |  | 
|  | outputs = [ invoker.output ] | 
|  | } | 
|  | } |