mirror of https://github.com/grpc/grpc.git
parent
14d6850f5a
commit
79f54e9d57
2 changed files with 100 additions and 1 deletions
@ -0,0 +1,91 @@ |
||||
# 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], |
||||
) |
Loading…
Reference in new issue