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