You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.4 KiB
132 lines
4.4 KiB
# 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 ]
|
|
}
|
|
}
|