|
|
|
# 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],
|
|
|
|
)
|