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