1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- # 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.
- """
- Houses utility rules for grpcio-tools.
- """
- 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],
- )
|