1*da0073e9SAndroid Build Coastguard Worker# This Bazel rules file is derived from https://github.com/tensorflow/tensorflow/blob/master/third_party/common.bzl 2*da0073e9SAndroid Build Coastguard Worker 3*da0073e9SAndroid Build Coastguard Worker# Rule for simple expansion of template files. This performs a simple 4*da0073e9SAndroid Build Coastguard Worker# search over the template file for the keys in substitutions, 5*da0073e9SAndroid Build Coastguard Worker# and replaces them with the corresponding values. 6*da0073e9SAndroid Build Coastguard Worker# 7*da0073e9SAndroid Build Coastguard Worker# Typical usage: 8*da0073e9SAndroid Build Coastguard Worker# load("/tools/build_rules/template_rule", "template_rule") 9*da0073e9SAndroid Build Coastguard Worker# template_rule( 10*da0073e9SAndroid Build Coastguard Worker# name = "ExpandMyTemplate", 11*da0073e9SAndroid Build Coastguard Worker# src = "my.template", 12*da0073e9SAndroid Build Coastguard Worker# out = "my.txt", 13*da0073e9SAndroid Build Coastguard Worker# substitutions = { 14*da0073e9SAndroid Build Coastguard Worker# "$VAR1": "foo", 15*da0073e9SAndroid Build Coastguard Worker# "$VAR2": "bar", 16*da0073e9SAndroid Build Coastguard Worker# } 17*da0073e9SAndroid Build Coastguard Worker# ) 18*da0073e9SAndroid Build Coastguard Worker# 19*da0073e9SAndroid Build Coastguard Worker# Args: 20*da0073e9SAndroid Build Coastguard Worker# name: The name of the rule. 21*da0073e9SAndroid Build Coastguard Worker# template: The template file to expand 22*da0073e9SAndroid Build Coastguard Worker# out: The destination of the expanded file 23*da0073e9SAndroid Build Coastguard Worker# substitutions: A dictionary mapping strings to their substitutions 24*da0073e9SAndroid Build Coastguard Worker 25*da0073e9SAndroid Build Coastguard Workerdef template_rule_impl(ctx): 26*da0073e9SAndroid Build Coastguard Worker ctx.actions.expand_template( 27*da0073e9SAndroid Build Coastguard Worker template = ctx.file.src, 28*da0073e9SAndroid Build Coastguard Worker output = ctx.outputs.out, 29*da0073e9SAndroid Build Coastguard Worker substitutions = ctx.attr.substitutions, 30*da0073e9SAndroid Build Coastguard Worker ) 31*da0073e9SAndroid Build Coastguard Worker 32*da0073e9SAndroid Build Coastguard Workertemplate_rule = rule( 33*da0073e9SAndroid Build Coastguard Worker attrs = { 34*da0073e9SAndroid Build Coastguard Worker "out": attr.output(mandatory = True), 35*da0073e9SAndroid Build Coastguard Worker "src": attr.label( 36*da0073e9SAndroid Build Coastguard Worker mandatory = True, 37*da0073e9SAndroid Build Coastguard Worker allow_single_file = True, 38*da0073e9SAndroid Build Coastguard Worker ), 39*da0073e9SAndroid Build Coastguard Worker "substitutions": attr.string_dict(mandatory = True), 40*da0073e9SAndroid Build Coastguard Worker }, 41*da0073e9SAndroid Build Coastguard Worker # output_to_genfiles is required for header files. 42*da0073e9SAndroid Build Coastguard Worker output_to_genfiles = True, 43*da0073e9SAndroid Build Coastguard Worker implementation = template_rule_impl, 44*da0073e9SAndroid Build Coastguard Worker) 45*da0073e9SAndroid Build Coastguard Worker 46*da0073e9SAndroid Build Coastguard Worker# Header template rule is an extension of template substitution rule 47*da0073e9SAndroid Build Coastguard Worker# That also makes this header a valid dependency for cc_library 48*da0073e9SAndroid Build Coastguard Worker# From https://stackoverflow.com/a/55407399 49*da0073e9SAndroid Build Coastguard Workerdef header_template_rule_impl(ctx): 50*da0073e9SAndroid Build Coastguard Worker ctx.actions.expand_template( 51*da0073e9SAndroid Build Coastguard Worker template = ctx.file.src, 52*da0073e9SAndroid Build Coastguard Worker output = ctx.outputs.out, 53*da0073e9SAndroid Build Coastguard Worker substitutions = ctx.attr.substitutions, 54*da0073e9SAndroid Build Coastguard Worker ) 55*da0073e9SAndroid Build Coastguard Worker return [ 56*da0073e9SAndroid Build Coastguard Worker # create a provider which says that this 57*da0073e9SAndroid Build Coastguard Worker # out file should be made available as a header 58*da0073e9SAndroid Build Coastguard Worker CcInfo(compilation_context = cc_common.create_compilation_context( 59*da0073e9SAndroid Build Coastguard Worker 60*da0073e9SAndroid Build Coastguard Worker # pass out the include path for finding this header 61*da0073e9SAndroid Build Coastguard Worker system_includes = depset([ctx.attr.include, ctx.outputs.out.dirname, ctx.bin_dir.path]), 62*da0073e9SAndroid Build Coastguard Worker 63*da0073e9SAndroid Build Coastguard Worker # and the actual header here. 64*da0073e9SAndroid Build Coastguard Worker headers = depset([ctx.outputs.out]), 65*da0073e9SAndroid Build Coastguard Worker )), 66*da0073e9SAndroid Build Coastguard Worker ] 67*da0073e9SAndroid Build Coastguard Worker 68*da0073e9SAndroid Build Coastguard Workerheader_template_rule = rule( 69*da0073e9SAndroid Build Coastguard Worker attrs = { 70*da0073e9SAndroid Build Coastguard Worker "include": attr.string(), 71*da0073e9SAndroid Build Coastguard Worker "out": attr.output(mandatory = True), 72*da0073e9SAndroid Build Coastguard Worker "src": attr.label( 73*da0073e9SAndroid Build Coastguard Worker mandatory = True, 74*da0073e9SAndroid Build Coastguard Worker allow_single_file = True, 75*da0073e9SAndroid Build Coastguard Worker ), 76*da0073e9SAndroid Build Coastguard Worker "substitutions": attr.string_dict(mandatory = True), 77*da0073e9SAndroid Build Coastguard Worker }, 78*da0073e9SAndroid Build Coastguard Worker # output_to_genfiles is required for header files. 79*da0073e9SAndroid Build Coastguard Worker output_to_genfiles = True, 80*da0073e9SAndroid Build Coastguard Worker implementation = header_template_rule_impl, 81*da0073e9SAndroid Build Coastguard Worker) 82