xref: /aosp_15_r20/build/bazel/scripts/queryview-bottom-up.sh (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker#!/usr/bin/bash
2*7594170eSAndroid Build Coastguard Worker# Copyright 2020 The Bazel Authors. All rights reserved.
3*7594170eSAndroid Build Coastguard Worker#
4*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*7594170eSAndroid Build Coastguard Worker#
8*7594170eSAndroid Build Coastguard Worker#    http://www.apache.org/licenses/LICENSE-2.0
9*7594170eSAndroid Build Coastguard Worker#
10*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*7594170eSAndroid Build Coastguard Worker# limitations under the License.
15*7594170eSAndroid Build Coastguard Worker
16*7594170eSAndroid Build Coastguard Worker# queryview-bottom-up.sh: A query script to strategize the bottom-up migration
17*7594170eSAndroid Build Coastguard Worker# approach of any target in the queryview workspace.
18*7594170eSAndroid Build Coastguard Worker#
19*7594170eSAndroid Build Coastguard Worker# Usage: ./queryview-bottom-up.sh <label of target in queryview>
20*7594170eSAndroid Build Coastguard Worker#
21*7594170eSAndroid Build Coastguard Worker# You can generate the queryview workspace using "m queryview". Note that the
22*7594170eSAndroid Build Coastguard Worker# queryview targets represent the fully configured build graph of Soong, so the
23*7594170eSAndroid Build Coastguard Worker# results may differ based on the product configuration and environment which
24*7594170eSAndroid Build Coastguard Worker# the queryview workspace was created in.
25*7594170eSAndroid Build Coastguard Worker#
26*7594170eSAndroid Build Coastguard Worker# This script obtains the transitive closure of a target, sorts its dependencies
27*7594170eSAndroid Build Coastguard Worker# based on minrank (shortest path from root to dep), and gets their module type.
28*7594170eSAndroid Build Coastguard Worker# This can help to figure out the exact module types we need to work on
29*7594170eSAndroid Build Coastguard Worker# converting first,
30*7594170eSAndroid Build Coastguard Worker#
31*7594170eSAndroid Build Coastguard Worker# This script produces the following (a sample):
32*7594170eSAndroid Build Coastguard Worker#
33*7594170eSAndroid Build Coastguard Worker# 0  //bionic/libc:libc--android_arm_armv7-a-neon_shared                                                                         cc_library
34*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:bionic_libc_license                                                                                           license
35*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc--android_arm_armv7-a-neon_shared_29                                                                      cc_library
36*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc--android_arm_armv7-a-neon_shared_30                                                                      cc_library
37*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc--android_arm_armv7-a-neon_shared_current                                                                 cc_library
38*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc--android_arm_armv7-a-neon_static                                                                         cc_library
39*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc.arm.map                                                                                                  genrule
40*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_common_shared--android_arm_armv7-a-neon_static                                                           cc_library_static
41*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_defaults                                                                                                 cc_defaults
42*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_headers--android_arm_armv7-a-neon                                                                        cc_library_headers
43*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_init_dynamic--android_arm_armv7-a-neon_static                                                            cc_library_static
44*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_native_allocator_defaults                                                                                cc_defaults
45*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_sources_shared_arm                                                                                       filegroup
46*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_sources_shared                                                                                           filegroup
47*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libc:libc_sources_static                                                                                           filegroup
48*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libdl:libdl_android--android_arm_armv7-a-neon_static                                                               cc_library
49*7594170eSAndroid Build Coastguard Worker# 1  //bionic/libdl:libdl--android_arm_armv7-a-neon_shared                                                                       cc_library
50*7594170eSAndroid Build Coastguard Worker# 1  //bionic/linker:ld-android--android_arm_armv7-a-neon_shared                                                                 cc_library
51*7594170eSAndroid Build Coastguard Worker# 1  //external/gwp_asan:gwp_asan--android_arm_armv7-a-neon_static                                                               cc_library_static
52*7594170eSAndroid Build Coastguard Worker# 1  //external/gwp_asan:gwp_asan_headers--android_arm_armv7-a-neon                                                              cc_library_headers
53*7594170eSAndroid Build Coastguard Worker# 1  //external/scudo:libscudo--android_arm_armv7-a-neon_static                                                                  cc_library_static
54*7594170eSAndroid Build Coastguard Worker# 1  //prebuilts/clang/host/linux-x86:libclang_rt.builtins-arm-android-exported--android_arm_armv7-a-neon_static                 libclang_rt_prebuilt_library_static
55*7594170eSAndroid Build Coastguard Worker# 1  //prebuilts/clang/host/linux-x86:libunwind-exported--android_arm_armv7-a-neon_static                                        llvm_prebuilt_library_static
56*7594170eSAndroid Build Coastguard Worker# 1  //prebuilts/runtime/mainline/runtime/sdk:prebuilt_libc--android_arm_armv7-a-neon_shared                                     cc_prebuilt_library_shared
57*7594170eSAndroid Build Coastguard Worker# 2  //bionic/libc:bionic_libc_platform_headers--android_arm_armv7-a-neon                                                        cc_library_headers
58*7594170eSAndroid Build Coastguard Worker# 2  //bionic/libc:crtbegin_so--android_arm_armv7-a-neon                                                                         cc_object
59*7594170eSAndroid Build Coastguard Worker# 2  //bionic/libc:crtend_so--android_arm_armv7-a-neon                                                                           cc_object
60*7594170eSAndroid Build Coastguard Worker# 2  //bionic/libc:libc_common--android_arm_armv7-a-neon_static                                                                  cc_library_static
61*7594170eSAndroid Build Coastguard Worker# 2  //bionic/libc:libc_common_static--android_arm_armv7-a-neon_static                                                           cc_library_static
62*7594170eSAndroid Build Coastguard Worker# 2  //bionic/libc:libc_dynamic_dispatch--android_arm_armv7-a-neon_static                                                        cc_library_static
63*7594170eSAndroid Build Coastguard Worker# ...
64*7594170eSAndroid Build Coastguard Worker
65*7594170eSAndroid Build Coastguard Workerset -euo pipefail
66*7594170eSAndroid Build Coastguard Worker
67*7594170eSAndroid Build Coastguard Worker# Convenience function to use the checked-in bazel binary
68*7594170eSAndroid Build Coastguard Workerfunction bazel() {
69*7594170eSAndroid Build Coastguard Worker  # We're in <root>/build/bazel/scripts
70*7594170eSAndroid Build Coastguard Worker  AOSP_ROOT="$(dirname $0)/../../.."
71*7594170eSAndroid Build Coastguard Worker  "${AOSP_ROOT}/build/bazel/bin/bazel" "$@"
72*7594170eSAndroid Build Coastguard Worker}
73*7594170eSAndroid Build Coastguard Worker
74*7594170eSAndroid Build Coastguard WorkerT=${1:-//bionic/libc:libc--android_arm_armv7-a-neon_shared}
75*7594170eSAndroid Build Coastguard WorkerCOMMON_BAZEL_OPTS="--noshow_loading_progress --color=no --curses=no"
76*7594170eSAndroid Build Coastguard Worker
77*7594170eSAndroid Build Coastguard Workerdeclare -a label_array
78*7594170eSAndroid Build Coastguard Workerdeclare -a minrank_array
79*7594170eSAndroid Build Coastguard Workerdeclare -a label_kind_array
80*7594170eSAndroid Build Coastguard Worker
81*7594170eSAndroid Build Coastguard Worker# Obtain the sorted list of labels in the transitive dependency closure of T.
82*7594170eSAndroid Build Coastguard Workerlabel_array=$(bazel query --config=queryview "deps($T)" --output=label $COMMON_BAZEL_OPTS 2>/dev/null | sort)
83*7594170eSAndroid Build Coastguard Worker
84*7594170eSAndroid Build Coastguard Worker# Obtain the sorted list of ranks based on the label as sort key. The rank value is the minimum distance between the root node to the dep.
85*7594170eSAndroid Build Coastguard Workerminrank_array=$(bazel query --config=queryview "deps($T)" --output=minrank $COMMON_BAZEL_OPTS 2>/dev/null | awk -e '{print $2 " " $1}' | sort | awk -e '{print $2}')
86*7594170eSAndroid Build Coastguard Worker
87*7594170eSAndroid Build Coastguard Worker# Obtain the sorted list of module types (label kinds) based on the label as sort key.
88*7594170eSAndroid Build Coastguard Workerlabel_kind_array=$(bazel query --config=queryview "deps($T)" --output=label_kind $COMMON_BAZEL_OPTS 2>/dev/null | awk -e '{print $3 " " $1}' | sort | awk -e '{print $2}')
89*7594170eSAndroid Build Coastguard Worker
90*7594170eSAndroid Build Coastguard Worker# Zip the lists together, tabularize it, and sort the list based on the rank
91*7594170eSAndroid Build Coastguard Worker# value of the dep. A rank value of 0 represents the root node.
92*7594170eSAndroid Build Coastguard Workerpaste <(echo "${minrank_array[*]}") <(echo "${label_array[*]}")  <(echo "${label_kind_array[*]}") | column -t | sort -n
93