| # Copyright 2019 Google LLC |
| # |
| # 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 |
| # |
| # https://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. |
| |
| """Embeds binary data in cc_*() rules.""" |
| |
| _FILEWRAPPER = "//sandboxed_api/tools/filewrapper" |
| |
| # TODO(cblichmann): Convert this to use a "_cc_toolchain" once Bazel #4370 is |
| # fixed. |
| def _sapi_cc_embed_data_impl(ctx): |
| cc_file_artifact = None |
| h_file_artifact = None |
| for output in ctx.outputs.outs: |
| if output.path.endswith(".h"): |
| h_file_artifact = output |
| elif output.path.endswith(".cc") or output.path.endswith(".cpp"): |
| cc_file_artifact = output |
| |
| args = ctx.actions.args() |
| args.add(ctx.label.package) |
| args.add(ctx.attr.ident) |
| args.add(ctx.attr.namespace if ctx.attr.namespace else "") |
| args.add(h_file_artifact) |
| args.add(cc_file_artifact) |
| args.add_all(ctx.files.srcs) |
| |
| ctx.actions.run( |
| executable = ctx.executable._filewrapper, |
| inputs = ctx.files.srcs, |
| outputs = [h_file_artifact, cc_file_artifact], |
| arguments = [args], |
| mnemonic = "CcEmbedData", |
| progress_message = ( |
| "Creating sapi_cc_embed_data file for {}".format(ctx.label) |
| ), |
| ) |
| |
| _sapi_cc_embed_data = rule( |
| implementation = _sapi_cc_embed_data_impl, |
| output_to_genfiles = True, |
| attrs = { |
| "srcs": attr.label_list( |
| allow_files = True, |
| ), |
| "namespace": attr.string(), |
| "ident": attr.string(), |
| "_filewrapper": attr.label( |
| executable = True, |
| cfg = "exec", |
| allow_files = True, |
| default = Label(_FILEWRAPPER), |
| ), |
| "outs": attr.output_list(), |
| }, |
| ) |
| |
| def sapi_cc_embed_data(name, srcs = [], namespace = "", **kwargs): |
| """Embeds arbitrary binary data in cc_*() rules. |
| |
| Args: |
| name: Name for this rule. |
| srcs: A list of files to be embedded. |
| namespace: C++ namespace to wrap the generated types in. |
| **kwargs: extra arguments like testonly, visibility, etc. |
| """ |
| embed_rule = "_%s_sapi" % name |
| _sapi_cc_embed_data( |
| name = embed_rule, |
| srcs = srcs, |
| namespace = namespace, |
| ident = name, |
| outs = [ |
| "%s.h" % name, |
| "%s.cc" % name, |
| ], |
| ) |
| native.cc_library( |
| name = name, |
| hdrs = [":%s.h" % name], |
| srcs = [":%s.cc" % name], |
| deps = [ |
| "@com_google_absl//absl/base:core_headers", |
| "@com_google_absl//absl/strings", |
| ], |
| **kwargs |
| ) |