1*61c4878aSAndroid Build Coastguard Worker# Copyright 2022 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker# 3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker# the License at 6*61c4878aSAndroid Build Coastguard Worker# 7*61c4878aSAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker# 9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker# the License. 14*61c4878aSAndroid Build Coastguard Worker"""A rule for translating pw_sensor YAML definitions into C++. 15*61c4878aSAndroid Build Coastguard Worker""" 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard Workerdef _pw_sensor_library_impl(ctx): 18*61c4878aSAndroid Build Coastguard Worker out_header = ctx.actions.declare_file(ctx.attr.out_header) 19*61c4878aSAndroid Build Coastguard Worker sources = ctx.files.srcs 20*61c4878aSAndroid Build Coastguard Worker inputs = ctx.files.inputs 21*61c4878aSAndroid Build Coastguard Worker 22*61c4878aSAndroid Build Coastguard Worker sensor_desc_target = ctx.attr._sensor_desc[DefaultInfo] 23*61c4878aSAndroid Build Coastguard Worker generator_target = ctx.attr.generator[DefaultInfo] 24*61c4878aSAndroid Build Coastguard Worker 25*61c4878aSAndroid Build Coastguard Worker args = [] 26*61c4878aSAndroid Build Coastguard Worker 27*61c4878aSAndroid Build Coastguard Worker # Add include paths for the generator 28*61c4878aSAndroid Build Coastguard Worker for generator_include in ctx.attr.generator_includes: 29*61c4878aSAndroid Build Coastguard Worker args.extend(["-I", generator_include]) 30*61c4878aSAndroid Build Coastguard Worker 31*61c4878aSAndroid Build Coastguard Worker # Add the generator and args 32*61c4878aSAndroid Build Coastguard Worker args.extend([ 33*61c4878aSAndroid Build Coastguard Worker "-g", 34*61c4878aSAndroid Build Coastguard Worker ( 35*61c4878aSAndroid Build Coastguard Worker "python3 " + generator_target.files_to_run.executable.path + " " + 36*61c4878aSAndroid Build Coastguard Worker " ".join(ctx.attr.generator_args) 37*61c4878aSAndroid Build Coastguard Worker ), 38*61c4878aSAndroid Build Coastguard Worker ]) 39*61c4878aSAndroid Build Coastguard Worker 40*61c4878aSAndroid Build Coastguard Worker # Add the output file 41*61c4878aSAndroid Build Coastguard Worker args.extend(["-o", out_header.path]) 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard Worker for source in sources: 44*61c4878aSAndroid Build Coastguard Worker args.append(source.path) 45*61c4878aSAndroid Build Coastguard Worker 46*61c4878aSAndroid Build Coastguard Worker # Run the generator 47*61c4878aSAndroid Build Coastguard Worker ctx.actions.run( 48*61c4878aSAndroid Build Coastguard Worker inputs = ( 49*61c4878aSAndroid Build Coastguard Worker sources + inputs + generator_target.files.to_list() + 50*61c4878aSAndroid Build Coastguard Worker sensor_desc_target.files.to_list() 51*61c4878aSAndroid Build Coastguard Worker ), 52*61c4878aSAndroid Build Coastguard Worker outputs = [out_header], 53*61c4878aSAndroid Build Coastguard Worker executable = sensor_desc_target.files_to_run.executable, 54*61c4878aSAndroid Build Coastguard Worker arguments = args, 55*61c4878aSAndroid Build Coastguard Worker mnemonic = "SensorCodeGen", 56*61c4878aSAndroid Build Coastguard Worker progress_message = "Generating " + out_header.path, 57*61c4878aSAndroid Build Coastguard Worker ) 58*61c4878aSAndroid Build Coastguard Worker 59*61c4878aSAndroid Build Coastguard Worker # Get compilation contexts from dependencies 60*61c4878aSAndroid Build Coastguard Worker dep_compilation_contexts = [ 61*61c4878aSAndroid Build Coastguard Worker dep[CcInfo].compilation_context 62*61c4878aSAndroid Build Coastguard Worker for dep in ctx.attr.deps 63*61c4878aSAndroid Build Coastguard Worker ] 64*61c4878aSAndroid Build Coastguard Worker compilation_context = cc_common.create_compilation_context( 65*61c4878aSAndroid Build Coastguard Worker includes = depset([ctx.bin_dir.path]), 66*61c4878aSAndroid Build Coastguard Worker headers = depset([out_header]), 67*61c4878aSAndroid Build Coastguard Worker ) 68*61c4878aSAndroid Build Coastguard Worker 69*61c4878aSAndroid Build Coastguard Worker # Return a library made up of the generated header 70*61c4878aSAndroid Build Coastguard Worker return [ 71*61c4878aSAndroid Build Coastguard Worker DefaultInfo(files = depset([out_header])), 72*61c4878aSAndroid Build Coastguard Worker CcInfo( 73*61c4878aSAndroid Build Coastguard Worker compilation_context = cc_common.merge_compilation_contexts( 74*61c4878aSAndroid Build Coastguard Worker compilation_contexts = dep_compilation_contexts + [compilation_context], 75*61c4878aSAndroid Build Coastguard Worker ), 76*61c4878aSAndroid Build Coastguard Worker ), 77*61c4878aSAndroid Build Coastguard Worker ] 78*61c4878aSAndroid Build Coastguard Worker 79*61c4878aSAndroid Build Coastguard Workerpw_sensor_library = rule( 80*61c4878aSAndroid Build Coastguard Worker implementation = _pw_sensor_library_impl, 81*61c4878aSAndroid Build Coastguard Worker attrs = { 82*61c4878aSAndroid Build Coastguard Worker "deps": attr.label_list(), 83*61c4878aSAndroid Build Coastguard Worker "generator": attr.label( 84*61c4878aSAndroid Build Coastguard Worker default = str(Label("//pw_sensor/py:constants_generator")), 85*61c4878aSAndroid Build Coastguard Worker executable = True, 86*61c4878aSAndroid Build Coastguard Worker cfg = "exec", 87*61c4878aSAndroid Build Coastguard Worker ), 88*61c4878aSAndroid Build Coastguard Worker "generator_args": attr.string_list( 89*61c4878aSAndroid Build Coastguard Worker default = ["--package", "pw.sensor"], 90*61c4878aSAndroid Build Coastguard Worker ), 91*61c4878aSAndroid Build Coastguard Worker "generator_includes": attr.string_list(), 92*61c4878aSAndroid Build Coastguard Worker "inputs": attr.label_list(allow_files = True), 93*61c4878aSAndroid Build Coastguard Worker "out_header": attr.string(), 94*61c4878aSAndroid Build Coastguard Worker "srcs": attr.label_list(allow_files = True), 95*61c4878aSAndroid Build Coastguard Worker "_sensor_desc": attr.label( 96*61c4878aSAndroid Build Coastguard Worker default = str(Label("//pw_sensor/py:sensor_desc")), 97*61c4878aSAndroid Build Coastguard Worker executable = True, 98*61c4878aSAndroid Build Coastguard Worker cfg = "exec", 99*61c4878aSAndroid Build Coastguard Worker ), 100*61c4878aSAndroid Build Coastguard Worker }, 101*61c4878aSAndroid Build Coastguard Worker provides = [CcInfo], 102*61c4878aSAndroid Build Coastguard Worker toolchains = ["@rules_python//python:exec_tools_toolchain_type"], 103*61c4878aSAndroid Build Coastguard Worker) 104