xref: /aosp_15_r20/bootable/libbootloader/gbl/readme.bzl (revision 5225e6b173e52d2efc6bcf950c27374fd72adabc)
1*5225e6b1SAndroid Build Coastguard Worker# Copyright (C) 2024 The Android Open Source Project
2*5225e6b1SAndroid Build Coastguard Worker#
3*5225e6b1SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*5225e6b1SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*5225e6b1SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*5225e6b1SAndroid Build Coastguard Worker#
7*5225e6b1SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*5225e6b1SAndroid Build Coastguard Worker#
9*5225e6b1SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*5225e6b1SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*5225e6b1SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*5225e6b1SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*5225e6b1SAndroid Build Coastguard Worker# limitations under the License.
14*5225e6b1SAndroid Build Coastguard Worker
15*5225e6b1SAndroid Build Coastguard Worker"""
16*5225e6b1SAndroid Build Coastguard WorkerAction that verifies all EFI protocols used by GBL are explicitly listed in README.md
17*5225e6b1SAndroid Build Coastguard Worker"""
18*5225e6b1SAndroid Build Coastguard Worker
19*5225e6b1SAndroid Build Coastguard Workerload("@rules_rust//rust/private:providers.bzl", "CrateInfo")
20*5225e6b1SAndroid Build Coastguard Worker
21*5225e6b1SAndroid Build Coastguard Workerdef _readme_test_rule_impl(ctx):
22*5225e6b1SAndroid Build Coastguard Worker    shell_script = """
23*5225e6b1SAndroid Build Coastguard Workerwhile [[ $# -gt 0 ]]; do
24*5225e6b1SAndroid Build Coastguard Worker  case $1 in
25*5225e6b1SAndroid Build Coastguard Worker    --in)
26*5225e6b1SAndroid Build Coastguard Worker      INPUT=$2
27*5225e6b1SAndroid Build Coastguard Worker      shift
28*5225e6b1SAndroid Build Coastguard Worker      shift
29*5225e6b1SAndroid Build Coastguard Worker      ;;
30*5225e6b1SAndroid Build Coastguard Worker    --out)
31*5225e6b1SAndroid Build Coastguard Worker      OUTPUT=$2
32*5225e6b1SAndroid Build Coastguard Worker      shift
33*5225e6b1SAndroid Build Coastguard Worker      shift
34*5225e6b1SAndroid Build Coastguard Worker      ;;
35*5225e6b1SAndroid Build Coastguard Worker    --readme)
36*5225e6b1SAndroid Build Coastguard Worker      README=$2
37*5225e6b1SAndroid Build Coastguard Worker      shift
38*5225e6b1SAndroid Build Coastguard Worker      shift
39*5225e6b1SAndroid Build Coastguard Worker      ;;
40*5225e6b1SAndroid Build Coastguard Worker    *)
41*5225e6b1SAndroid Build Coastguard Worker      echo "Unexpected argument: $1"
42*5225e6b1SAndroid Build Coastguard Worker      exit 1
43*5225e6b1SAndroid Build Coastguard Worker      ;;
44*5225e6b1SAndroid Build Coastguard Worker  esac
45*5225e6b1SAndroid Build Coastguard Workerdone
46*5225e6b1SAndroid Build Coastguard Worker
47*5225e6b1SAndroid Build Coastguard Workerif [ ! -f $README ]; then
48*5225e6b1SAndroid Build Coastguard Worker  echo "README file doesn't exist: ${README}"
49*5225e6b1SAndroid Build Coastguard Worker  exit 1
50*5225e6b1SAndroid Build Coastguard Workerfi
51*5225e6b1SAndroid Build Coastguard Worker
52*5225e6b1SAndroid Build Coastguard WorkerALL_INPUTS=$(echo ${INPUT} | sed 's/,/ /g')
53*5225e6b1SAndroid Build Coastguard Worker
54*5225e6b1SAndroid Build Coastguard Worker# Look for protocols in the source code that do not exist in the documentation.
55*5225e6b1SAndroid Build Coastguard Worker# The protocol name we match on here is the Rust struct name.
56*5225e6b1SAndroid Build Coastguard WorkerDOCLESS_PROTOCOLS=""
57*5225e6b1SAndroid Build Coastguard WorkerPROTOCOLS=($(grep -hE 'impl ProtocolInfo for .* \\{' ${ALL_INPUTS} | awk '{print $4}' | sort))
58*5225e6b1SAndroid Build Coastguard Workerfor P in ${PROTOCOLS[@]}
59*5225e6b1SAndroid Build Coastguard Workerdo
60*5225e6b1SAndroid Build Coastguard Worker  grep -Lq $P ${README} || DOCLESS_PROTOCOLS+="\n\t$P"
61*5225e6b1SAndroid Build Coastguard Workerdone
62*5225e6b1SAndroid Build Coastguard Worker
63*5225e6b1SAndroid Build Coastguard Workerif [ ! -z "${DOCLESS_PROTOCOLS}" ]; then
64*5225e6b1SAndroid Build Coastguard Worker  echo -e "Missing documentation for protocol(s):$DOCLESS_PROTOCOLS"
65*5225e6b1SAndroid Build Coastguard Worker  exit 1
66*5225e6b1SAndroid Build Coastguard Workerfi
67*5225e6b1SAndroid Build Coastguard Worker
68*5225e6b1SAndroid Build Coastguard Worker# Look for protocols in the documentation that are not in the source, to try to
69*5225e6b1SAndroid Build Coastguard Worker# prevent stale docs referring to protocols we are no longer using.
70*5225e6b1SAndroid Build Coastguard Worker# Here we're matching on words ending in "Protocol", except "Protocol" itself.
71*5225e6b1SAndroid Build Coastguard WorkerUNUSED_PROTOCOLS=""
72*5225e6b1SAndroid Build Coastguard WorkerREADME_PROTOCOLS=($(grep -P " ?[^ ]+Protocol$" ${README} | awk '{print $NF}' | sort | uniq))
73*5225e6b1SAndroid Build Coastguard Workerfor P in ${README_PROTOCOLS[@]}
74*5225e6b1SAndroid Build Coastguard Workerdo
75*5225e6b1SAndroid Build Coastguard Worker  grep -qhE "impl ProtocolInfo for $P" ${ALL_INPUTS} || UNUSED_PROTOCOLS+="\n\t$P"
76*5225e6b1SAndroid Build Coastguard Workerdone
77*5225e6b1SAndroid Build Coastguard Worker
78*5225e6b1SAndroid Build Coastguard Workerif [ ! -z "${UNUSED_PROTOCOLS}" ]; then
79*5225e6b1SAndroid Build Coastguard Worker  echo -e "Unused protocol(s) found in documentation:$UNUSED_PROTOCOLS"
80*5225e6b1SAndroid Build Coastguard Worker  exit 1
81*5225e6b1SAndroid Build Coastguard Workerfi
82*5225e6b1SAndroid Build Coastguard Worker
83*5225e6b1SAndroid Build Coastguard Workertouch $OUTPUT
84*5225e6b1SAndroid Build Coastguard Worker"""
85*5225e6b1SAndroid Build Coastguard Worker
86*5225e6b1SAndroid Build Coastguard Worker    out_file = ctx.actions.declare_file("%s.script" % ctx.attr.name)
87*5225e6b1SAndroid Build Coastguard Worker    in_files = [s for d in ctx.attr.deps for s in d[CrateInfo].srcs.to_list()]
88*5225e6b1SAndroid Build Coastguard Worker    readme = ctx.attr.readme
89*5225e6b1SAndroid Build Coastguard Worker    args = ctx.actions.args()
90*5225e6b1SAndroid Build Coastguard Worker    args.add_joined(
91*5225e6b1SAndroid Build Coastguard Worker        "--in",
92*5225e6b1SAndroid Build Coastguard Worker        in_files,
93*5225e6b1SAndroid Build Coastguard Worker        join_with = ",",
94*5225e6b1SAndroid Build Coastguard Worker    )
95*5225e6b1SAndroid Build Coastguard Worker    args.add(
96*5225e6b1SAndroid Build Coastguard Worker        "--out",
97*5225e6b1SAndroid Build Coastguard Worker        out_file,
98*5225e6b1SAndroid Build Coastguard Worker    )
99*5225e6b1SAndroid Build Coastguard Worker    args.add(
100*5225e6b1SAndroid Build Coastguard Worker        "--readme",
101*5225e6b1SAndroid Build Coastguard Worker        readme[DefaultInfo].files.to_list()[0],
102*5225e6b1SAndroid Build Coastguard Worker    )
103*5225e6b1SAndroid Build Coastguard Worker    ctx.actions.run_shell(
104*5225e6b1SAndroid Build Coastguard Worker        inputs = in_files + readme[DefaultInfo].files.to_list(),
105*5225e6b1SAndroid Build Coastguard Worker        outputs = [out_file],
106*5225e6b1SAndroid Build Coastguard Worker        arguments = [args],
107*5225e6b1SAndroid Build Coastguard Worker        command = shell_script,
108*5225e6b1SAndroid Build Coastguard Worker    )
109*5225e6b1SAndroid Build Coastguard Worker    return [DefaultInfo(executable = out_file)]
110*5225e6b1SAndroid Build Coastguard Worker
111*5225e6b1SAndroid Build Coastguard Workerreadme_test = rule(
112*5225e6b1SAndroid Build Coastguard Worker    implementation = _readme_test_rule_impl,
113*5225e6b1SAndroid Build Coastguard Worker    attrs = {
114*5225e6b1SAndroid Build Coastguard Worker        "deps": attr.label_list(
115*5225e6b1SAndroid Build Coastguard Worker            providers = [CrateInfo],
116*5225e6b1SAndroid Build Coastguard Worker        ),
117*5225e6b1SAndroid Build Coastguard Worker        "readme": attr.label(
118*5225e6b1SAndroid Build Coastguard Worker            allow_single_file = [".md"],
119*5225e6b1SAndroid Build Coastguard Worker        ),
120*5225e6b1SAndroid Build Coastguard Worker    },
121*5225e6b1SAndroid Build Coastguard Worker    test = True,
122*5225e6b1SAndroid Build Coastguard Worker)
123