62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
|
# Copyright (c) 2024 The Chromium Embedded Framework Authors. All rights
|
||
|
# reserved. Use of this source code is governed by a BSD-style license that
|
||
|
# can be found in the LICENSE file.
|
||
|
|
||
|
def _copy_filegroups_impl(ctx):
|
||
|
inputs = ctx.files.filegroups
|
||
|
remove_prefixes = ctx.attr.remove_prefixes
|
||
|
add_prefix = ctx.attr.add_prefix
|
||
|
|
||
|
outputs = []
|
||
|
for f in inputs:
|
||
|
relative_path = f.path
|
||
|
for prefix in remove_prefixes:
|
||
|
# Add trailing forward slash if necessary.
|
||
|
if prefix[-1] != "/":
|
||
|
prefix += "/"
|
||
|
if len(prefix) > 0 and f.path.startswith(prefix):
|
||
|
relative_path = f.path[len(prefix):]
|
||
|
break
|
||
|
|
||
|
if len(add_prefix) > 0:
|
||
|
# Add trailing forward slash if necessary.
|
||
|
if add_prefix[-1] != "/":
|
||
|
add_prefix += "/"
|
||
|
relative_path = add_prefix + relative_path
|
||
|
|
||
|
out = ctx.actions.declare_file(relative_path)
|
||
|
outputs.append(out)
|
||
|
|
||
|
if relative_path.find("/") > 0:
|
||
|
command="mkdir -p $(dirname {}) && cp {} {}".format(out.path, f.path, out.path)
|
||
|
else:
|
||
|
command="cp {} {}".format(f.path, out.path)
|
||
|
|
||
|
ctx.actions.run_shell(
|
||
|
outputs=[out],
|
||
|
inputs=depset([f]),
|
||
|
command=command
|
||
|
)
|
||
|
|
||
|
# Small sanity check
|
||
|
if len(inputs) != len(outputs):
|
||
|
fail("Output count should be 1-to-1 with input count.")
|
||
|
|
||
|
return DefaultInfo(
|
||
|
files=depset(outputs),
|
||
|
runfiles=ctx.runfiles(files=outputs)
|
||
|
)
|
||
|
|
||
|
# Allows the file contents of |filegroups| to be copied next to a cc_binary
|
||
|
# target via the |data| attribute.
|
||
|
# Implementation based on https://stackoverflow.com/a/57983629
|
||
|
copy_filegroups = rule(
|
||
|
implementation=_copy_filegroups_impl,
|
||
|
attrs={
|
||
|
"filegroups": attr.label_list(),
|
||
|
"remove_prefixes": attr.string_list(default = []),
|
||
|
"add_prefix": attr.string(default = ""),
|
||
|
},
|
||
|
)
|
||
|
|