# 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 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:generate_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 )