| # 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 data files into a C or C++ module.""" |
| |
| def cc_embed_data( |
| name, |
| srcs, |
| cc_file_output, |
| h_file_output, |
| testonly = False, |
| cpp_namespace = None, |
| strip_prefix = None, |
| flatten = False, |
| identifier = None, |
| **kwargs): |
| """Embeds 'srcs' into a C++ module. |
| |
| Generates a header like: |
| namespace iree { |
| struct iree_file_toc_t { |
| const char* name; // the file's original name |
| const char* data; // beginning of the file |
| size_t size; // length of the file |
| }; |
| } |
| namespace foo { |
| extern const struct ::iree::iree_file_toc_t* this_rule_name_create(); |
| } |
| |
| The 'this_rule_name()' function will return an array of iree_file_toc_t |
| structs terminated by one that has nullptr 'name' and 'data' fields. |
| The 'data' field always has an extra null terminator at the end (which |
| is not included in the size). |
| |
| Args: |
| name: The rule name, which will also be the identifier of the generated |
| code symbol. |
| srcs: List of files to embed. |
| cc_file_output: The CC implementation file to output. |
| h_file_output: The H header file to output. |
| testonly: If True, only testonly targets can depend on this target. |
| cpp_namespace: Wraps everything in a C++ namespace. |
| strip_prefix: Strips this verbatim prefix from filenames (in the TOC). |
| flatten: Removes all directory components from filenames (in the TOC). |
| identifier: The identifier to use in generated names (defaults to name). |
| **kwargs: Args to pass to the cc_library. |
| """ |
| generator = "//build_tools/embed_data:generate_embed_data" |
| generator_location = "$(location %s)" % generator |
| if identifier == None: |
| identifier = name |
| flags = "--output_header='$(location %s)' --output_impl='$(location %s)'" % ( |
| h_file_output, |
| cc_file_output, |
| ) |
| flags += " --identifier='%s'" % (identifier,) |
| flags += " --c_output=false" |
| if cpp_namespace != None: |
| flags += " --cpp_namespace='%s'" % (cpp_namespace,) |
| if strip_prefix != None: |
| flags += " --strip_prefix='%s'" % (strip_prefix,) |
| if flatten: |
| flags += " --flatten" |
| |
| native.genrule( |
| name = name + "__generator", |
| srcs = srcs, |
| outs = [ |
| cc_file_output, |
| h_file_output, |
| ], |
| tools = [generator], |
| cmd = "%s $(SRCS) %s" % (generator_location, flags), |
| testonly = testonly, |
| ) |
| native.cc_library( |
| name = name, |
| hdrs = [h_file_output], |
| srcs = [cc_file_output], |
| testonly = testonly, |
| **kwargs |
| ) |
| |
| def c_embed_data( |
| name, |
| srcs, |
| c_file_output, |
| h_file_output, |
| testonly = False, |
| strip_prefix = None, |
| flatten = False, |
| identifier = None, |
| **kwargs): |
| """Embeds 'srcs' into a C module. |
| |
| Generates a header like: |
| #if __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| struct iree_file_toc_t { |
| const char* name; // the file's original name |
| const char* data; // beginning of the file |
| size_t size; // length of the file |
| }; |
| #if __cplusplus |
| } |
| #endif // __cplusplus |
| |
| #if __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| const struct iree_file_toc_t* this_rule_name__create(); |
| #if __cplusplus |
| } |
| #endif // __cplusplus |
| |
| The 'this_rule_name()' function will return an array of iree_file_toc_t |
| structs terminated by one that has NULL 'name' and 'data' fields. |
| The 'data' field always has an extra null terminator at the end (which |
| is not included in the size). |
| |
| Args: |
| name: The rule name, which will also be the identifier of the generated |
| code symbol. |
| srcs: List of files to embed. |
| c_file_output: The C implementation file to output. |
| h_file_output: The H header file to output. |
| testonly: If True, only testonly targets can depend on this target. |
| strip_prefix: Strips this verbatim prefix from filenames (in the TOC). |
| flatten: Removes all directory components from filenames (in the TOC). |
| identifier: The identifier to use in generated names (defaults to name). |
| **kwargs: Args to pass to the cc_library. |
| """ |
| generator = "//build_tools/embed_data:generate_embed_data" |
| generator_location = "$(location %s)" % generator |
| if identifier == None: |
| identifier = name |
| flags = "--output_header='$(location %s)' --output_impl='$(location %s)'" % ( |
| h_file_output, |
| c_file_output, |
| ) |
| flags += " --c_output=true" |
| flags += " --identifier='%s'" % (identifier,) |
| if strip_prefix != None: |
| flags += " --strip_prefix='%s'" % (strip_prefix,) |
| if flatten: |
| flags += " --flatten" |
| |
| native.genrule( |
| name = name + "__generator", |
| srcs = srcs, |
| outs = [ |
| c_file_output, |
| h_file_output, |
| ], |
| tools = [generator], |
| cmd = "%s $(SRCS) %s" % (generator_location, flags), |
| testonly = testonly, |
| ) |
| native.cc_library( |
| name = name, |
| hdrs = [h_file_output], |
| srcs = [c_file_output], |
| testonly = testonly, |
| **kwargs |
| ) |