xref: /aosp_15_r20/external/pigweed/pw_sensor/sensor.bzl (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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