1load( 2 "@fbsource//tools/build_defs:default_platform_defs.bzl", 3 "ANDROID", 4) 5load("@fbsource//xplat/executorch/build:runtime_wrapper.bzl", "runtime") 6load("@fbsource//xplat/executorch/backends/qualcomm/qnn_version.bzl", "get_qnn_library_verision") 7 8# Construct the input and output file names. All input and output files rely on scalar_type file. 9SCHEMA_NAME = "qc_compiler_spec" 10 11INPUT_SCHEMA = "serialization/" + SCHEMA_NAME + ".fbs" 12 13OUTPUT_SCHEMA_HEADER = SCHEMA_NAME + "_generated.h" 14 15SCHEMA_GEN_RULE_NAME = "qc_compiler_spec_generated" 16 17SCHEMA_LIRRARY_NAME = SCHEMA_NAME 18 19QC_BINARY_INFO_SCHEMA = "qc_binary_info" 20QC_BINARY_INFO_INPUT_SCHEMA = "serialization/" + QC_BINARY_INFO_SCHEMA + ".fbs" 21QC_BINARY_INFO_SCHEMA_GEN_RULE_NAME = QC_BINARY_INFO_SCHEMA + "_generated" 22QC_BINARY_INFO_OUTPUT_SCHEMA_HEADER = QC_BINARY_INFO_SCHEMA_GEN_RULE_NAME + ".h" 23QC_BINARY_INFO_SCHEMA_LIRRARY_NAME = QC_BINARY_INFO_SCHEMA 24 25def generate_schema_header(rule_name, srcs, headers, default_header): 26 """Generate header file given flatbuffer schema 27 """ 28 runtime.genrule( 29 name = rule_name, 30 srcs = srcs, 31 # We're only generating a single file, so it seems like we could use 32 # `out`, but `flatc` takes a directory as a parameter, not a single 33 # file. Use `outs` so that `${OUT}` is expanded as the containing 34 # directory instead of the file itself. 35 outs = {header: [header] for header in headers}, 36 default_outs = [default_header], 37 cmd = " ".join([ 38 "$(exe {})".format(runtime.external_dep_location("flatc")), 39 "--cpp", 40 "--cpp-std c++11", 41 "--gen-mutable", 42 "--scoped-enums", 43 "-o ${OUT}", 44 "${SRCS}", 45 # Let our infra know that the file was generated. 46 " ".join(["&& echo // @" + "generated >> ${OUT}/" + header for header in headers]), 47 ]), 48 visibility = [], # Private 49 ) 50 51def define_common_targets(): 52 """Defines targets that should be shared between fbcode and xplat. 53 54 The directory containing this targets.bzl file should also contain both 55 TARGETS and BUCK files that call this function. 56 """ 57 58 generate_schema_header( 59 SCHEMA_GEN_RULE_NAME, 60 [INPUT_SCHEMA], 61 [OUTPUT_SCHEMA_HEADER], 62 OUTPUT_SCHEMA_HEADER, 63 ) 64 65 # Header-only library target with the generate executorch program schema header. 66 runtime.cxx_library( 67 name = "schema", 68 srcs = [], 69 visibility = [ 70 # Lock this down as tightly as possible to ensure that flatbuffers 71 # are an implementation detail. Ideally this list would only include 72 # //executorch/runtime/executor/... 73 "//executorch/codegen/tools/...", 74 "//executorch/runtime/executor/...", 75 "//executorch/backends/qualcomm/...", 76 "//executorch/backends/qualcomm/runtime/...", 77 ], 78 exported_headers = { 79 OUTPUT_SCHEMA_HEADER: ":{}[{}]".format(SCHEMA_GEN_RULE_NAME, OUTPUT_SCHEMA_HEADER), 80 }, 81 exported_external_deps = ["flatbuffers-api"], 82 define_static_target = True, 83 platforms = [ANDROID], 84 ) 85 86 generate_schema_header( 87 QC_BINARY_INFO_SCHEMA_GEN_RULE_NAME, 88 [QC_BINARY_INFO_INPUT_SCHEMA], 89 [QC_BINARY_INFO_OUTPUT_SCHEMA_HEADER], 90 QC_BINARY_INFO_OUTPUT_SCHEMA_HEADER, 91 ) 92 93 runtime.cxx_library( 94 name = "qc_binary_info_schema", 95 srcs = [], 96 visibility = [ 97 # Lock this down as tightly as possible to ensure that flatbuffers 98 # are an implementation detail. Ideally this list would only include 99 # //executorch/runtime/executor/... 100 "//executorch/codegen/tools/...", 101 "//executorch/runtime/executor/...", 102 "//executorch/backends/qualcomm/...", 103 "//executorch/backends/qualcomm/runtime/...", 104 ], 105 exported_headers = { 106 QC_BINARY_INFO_OUTPUT_SCHEMA_HEADER: ":{}[{}]".format( QC_BINARY_INFO_SCHEMA_GEN_RULE_NAME, QC_BINARY_INFO_OUTPUT_SCHEMA_HEADER), 107 }, 108 exported_external_deps = ["flatbuffers-api"], 109 define_static_target = True, 110 platforms = [ANDROID], 111 ) 112 113 runtime.cxx_library( 114 name = "qnn_executorch_backend", 115 srcs = [], 116 headers = [], 117 define_static_target = True, 118 visibility = ["@EXECUTORCH_CLIENTS"], 119 deps = [ 120 "fbsource//third-party/qualcomm/qnn/qnn-{0}:api".format(get_qnn_library_verision()), 121 "//executorch/runtime/backend:interface", 122 "//executorch/runtime/core:core", 123 "//executorch/backends/qualcomm/runtime:runtime", 124 ], 125 exported_deps = [ 126 ":schema", 127 ], 128 ) 129