| # Copyright 2020 The gRPC 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 |
| # |
| # http://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. |
| |
| def _generate_copied_files_impl(ctx): |
| srcs = ctx.attr.srcs[0] |
| strip_prefix = ctx.attr.strip_prefix |
| dest = ctx.attr.dest |
| |
| outs = [] |
| for f in srcs.files.to_list(): |
| destination_path = f.path |
| if f.path.startswith("external"): |
| external_separator = f.path.find("/") |
| repository_separator = f.path.find("/", external_separator + 1) |
| destination_path = f.path[repository_separator + 1:] |
| if not destination_path.startswith(strip_prefix): |
| fail("File '{}' did not start with '{}'.".format( |
| destination_path, |
| strip_prefix, |
| )) |
| destination_path = dest + destination_path[len(strip_prefix):] |
| destination_dir = destination_path.rfind("/") |
| out_file = ctx.actions.declare_file(destination_path) |
| outs.append(out_file) |
| ctx.actions.run_shell( |
| inputs = [f], |
| outputs = [out_file], |
| command = "mkdir -p {0} && cp {1} {2}".format( |
| out_file.dirname, |
| f.path, |
| out_file.path, |
| ), |
| ) |
| |
| return [DefaultInfo(files = depset(direct = outs))] |
| |
| _generate_copied_files = rule( |
| attrs = { |
| "srcs": attr.label_list( |
| mandatory = True, |
| allow_empty = False, |
| ), |
| "strip_prefix": attr.string( |
| default = "", |
| ), |
| "dest": attr.string( |
| mandatory = True, |
| ), |
| }, |
| implementation = _generate_copied_files_impl, |
| ) |
| |
| def internal_copied_filegroup(name, srcs, strip_prefix, dest): |
| """Copies a file group to the current package. |
| |
| Useful for using an existing filegroup as a data dependency. |
| |
| Args: |
| name: The name of the rule. |
| srcs: A single filegroup. |
| strip_prefix: An optional string to strip from the beginning |
| of the path of each file in the filegroup. Must end in a slash. |
| dest: The directory in which to put the files, relative to the |
| current package. Must end in a slash. |
| """ |
| if len(srcs) != 1: |
| fail("srcs must be a single filegroup.") |
| |
| if not dest.endswith("/"): |
| fail("dest must end with a '/' character.") |
| |
| _symlink_target = name + "_symlink" |
| _generate_copied_files( |
| name = _symlink_target, |
| srcs = srcs, |
| strip_prefix = strip_prefix, |
| dest = dest, |
| ) |
| |
| native.filegroup( |
| name = name, |
| srcs = [":" + _symlink_target], |
| ) |