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