| # Copyright 2019 The IREE Authors | 
 | # | 
 | # Licensed under the Apache License v2.0 with LLVM Exceptions. | 
 | # See https://llvm.org/LICENSE.txt for license information. | 
 | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 |  | 
 | """Embeds data files into a C module.""" | 
 |  | 
 | def clean_dep(dep): | 
 |     """Returns an absolute Bazel path to 'dep'. | 
 |  | 
 |     This is necessary when calling these functions from another workspace. | 
 |     """ | 
 |     return str(Label(dep)) | 
 |  | 
 | def iree_c_embed_data( | 
 |         name, | 
 |         srcs, | 
 |         c_file_output, | 
 |         h_file_output, | 
 |         testonly = False, | 
 |         strip_prefix = None, | 
 |         flatten = False, | 
 |         identifier = None, | 
 |         generator = clean_dep("//build_tools/embed_data:iree-c-embed-data"), | 
 |         **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). | 
 |       generator: tool to use generate the embed data files. | 
 |       **kwargs: Args to pass to the cc_library. | 
 |     """ | 
 |     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 += " --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 | 
 |     ) |