| #!/bin/bash | |
| # Copyright 2024 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| #### CATEGORY=Other | |
| #### DEPRECATED | |
| ### List the dependencies of a target, and if dependencies are in SDK | |
| ## usage: fx sdk-deps [Options] | |
| ## | |
| ## Options: | |
| ## -t < target> : List all the deps of this target | |
| ## -d < dep> : Determine if the dependency is in SDK | |
| ## -o < filename> : Write output to CSV file. Default: sdk_deps_out.csv | |
| ## | |
| ## Deprecated: This command is deprecated as it only supports GN atoms. | |
| set -o errexit | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh | |
| fx-config-read | |
| readonly TEMPDIR="tmp" | |
| mkdir "${TEMPDIR}" | |
| trap 'rm -rf "$TEMPDIR"' EXIT | |
| dep_list_file="${TEMPDIR}/dep_list" | |
| partner_sdk_deps_file="${TEMPDIR}/partner_sdk_deps_list" | |
| non_sdk_deps_file="${TEMPDIR}/non_sdk_deps_list" | |
| output_csv="sdk_deps_out.csv" # Default CSV filename | |
| touch ${dep_list_file} | |
| touch ${partner_sdk_deps_file} | |
| touch ${non_sdk_deps_file} | |
| collect_deps() { | |
| local target=$1 | |
| local prefix=$(echo ${target} | cut -d ":" -f1) | |
| local deps=($(fx-command-run gn desc "${build_dir}" "${target}" deps || continue)) | |
| for dep in "${deps[@]}"; do | |
| # We skip some deps | |
| if [[ "${dep}" == *"shlib-allowlist-check"* \ | |
| || "${dep}" == *"static-libc++-deps"* \ | |
| || "${dep}" == *"tools/bindc:bin"* \ | |
| || "${dep}" == *"zircon/public/sysroot"* \ | |
| || "${dep}" != "//"* ]] ; then | |
| continue | |
| fi | |
| if [[ "${dep}" == ${prefix}* ]]; then | |
| collect_deps $dep | |
| else | |
| echo "${dep}" | xargs >> ${dep_list_file} | |
| fi | |
| done | |
| } | |
| main() { | |
| local build_dir=$(fx-command-run get-build-dir) | |
| fx-info "Using build dir: ${build_dir}" | |
| local targets=() | |
| local sdk_deps=() | |
| while [[ $# -ge 1 ]]; do | |
| case "$1" in | |
| -t) | |
| shift | |
| targets+=( "$1" ) | |
| ;; | |
| -d) | |
| shift | |
| sdk_deps+=( "$1" ) | |
| ;; | |
| -o) | |
| shift | |
| output_csv="$1" | |
| ;; | |
| esac | |
| shift | |
| done | |
| if [[ "${#targets[@]}" -eq 0 && "${#sdk_deps[@]}" -eq 0 ]]; then | |
| echo "Either a target that contains driver or a dependency needs to be passed in." | |
| fx-command-help sdk-deps | |
| exit 1 | |
| fi | |
| if [[ "${#targets[@]}" -gt 0 ]]; then | |
| local distribution_manifests=() | |
| # Use `gn meta` to walk the metadata and select all items with | |
| # `driver_package_component_files`. This is mandatory all driver. | |
| for target in "${targets[@]}"; do | |
| distribution_manifests+=( $(fx-command-run gn meta "${build_dir}" --data=driver_package_component_files "${target}" 2>/dev/null | grep "distribution_manifest = " | cut -d "\"" -f2 | sed -e "s|.*|${build_dir}/&|") ) | |
| done | |
| # Collect all the drivers from the distribution | |
| if [[ "${#targets[@]}" -gt 0 ]]; then | |
| local drivers=($(fx-command-run jq -r '.[] | select((.destination|startswith("driver"))) | .label' "${distribution_manifests[@]}" | sort -u)) | |
| fi | |
| # Collect all the deps | |
| fx-info "Listing all drivers and collect deps..." | |
| echo | |
| for driver in "${drivers[@]}"; do | |
| # Don't analyze the compat driver | |
| if [[ "${driver}" == *"src/devices/misc/drivers/compat:driver"* ]]; then | |
| continue | |
| fi | |
| echo " ${driver}" | |
| collect_deps $driver & | |
| done | |
| echo | |
| fi | |
| # Also collect the deps directly passed in | |
| for dep in "${sdk_deps[@]}"; do | |
| echo "${dep}" | xargs >> ${dep_list_file} | |
| done | |
| local non_sdk=() | |
| local partner_sdk_deps="${TEMPDIR}/partner_sdk_all_deps" | |
| fx-info "Collecting IDK dependencies..." | |
| fx-command-run gn desc "${build_dir}" "//sdk:fuchsia_collection" deps --all > ${partner_sdk_deps} & | |
| wait $(jobs -rp) | |
| for dep in $(cat ${dep_list_file} | sort -u); do | |
| if [[ "${dep}" == *"sdk/fidl"* ]]; then | |
| fidl="$(echo $dep | cut -d ":" -f1 | cut -d "/" -f5)" | |
| dep_sdk="//sdk/fidl/${fidl}:${fidl}_sdk" | |
| elif [[ "${dep}" == *"src/devices/bind"* ]]; then | |
| bind="$(echo $dep | cut -d ":" -f1 | cut -d "/" -f6)" | |
| dep_sdk="//src/devices/bind/${bind}:${bind}_sdk" | |
| else | |
| dep_sdk="$(echo ${dep} | cut -d "(" -f1)_sdk" | |
| fi | |
| if [[ $(grep -c ${dep_sdk} ${partner_sdk_deps}) -gt 0 ]]; then | |
| echo "${dep}" >> "${partner_sdk_deps_file}" | |
| continue | |
| fi | |
| echo "${dep}" >> "${non_sdk_deps_file}" | |
| done | |
| # Calculate non sdk total items | |
| num_non_sdk_total_items=$(cat ${non_sdk_deps_file} | wc -l) | |
| # Calculate items containing banjo | |
| num_total_banjo=$(cat ${non_sdk_deps_file} | grep banjo | wc -l) | |
| # Calculate total number of drivers | |
| num_drivers="${#drivers[@]}" | |
| # Calculate total number of parter sdk deps | |
| num_partner_sdk_deps=$(cat ${partner_sdk_deps_file} | wc -l) | |
| # Print to console | |
| fx-info "Result:" | |
| echo | |
| echo " In SDK:" | |
| sed -i -e 's/^/ /' ${partner_sdk_deps_file} | |
| echo " Total items:" ${num_partner_sdk_deps} | |
| cat ${partner_sdk_deps_file} | |
| echo | |
| echo " Not in SDK:" | |
| sed -i -e 's/^/ /' ${non_sdk_deps_file} | |
| echo " Total items:" ${num_non_sdk_total_items} | |
| echo " Items containing 'banjo':" ${num_total_banjo} | |
| cat ${non_sdk_deps_file} | |
| # Write to CSV with headers | |
| echo "date_time_run,number_drivers,number_partner_sdk_deps,number_non_sdk_total_items,number_total_banjo" > "${output_csv}" | |
| echo "$(date +"%Y-%m-%d %H:%M:%S"),${num_drivers},${num_partner_sdk_deps},${num_non_sdk_total_items},${num_total_banjo}" >> "${output_csv}" | |
| fx-info "CSV output written to: ${output_csv}" | |
| fx-warn "fx sdk-deps is deprecated." | |
| fx-warn "Please file an SDK Experiences bug describing why you need it." | |
| } | |
| main "$@" |