xref: /aosp_15_r20/device/common/generate-android-bp-for-blobs.sh (revision dbb5c4200be91c5fe7bd13df0957f19f0e6a10bf)
1*dbb5c420SAndroid Build Coastguard Worker#!/bin/bash
2*dbb5c420SAndroid Build Coastguard Worker#
3*dbb5c420SAndroid Build Coastguard Worker# Copyright 2020 The Android Open Source Project
4*dbb5c420SAndroid Build Coastguard Worker#
5*dbb5c420SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*dbb5c420SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*dbb5c420SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*dbb5c420SAndroid Build Coastguard Worker#
9*dbb5c420SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*dbb5c420SAndroid Build Coastguard Worker#
11*dbb5c420SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*dbb5c420SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*dbb5c420SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*dbb5c420SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*dbb5c420SAndroid Build Coastguard Worker# limitations under the License.
16*dbb5c420SAndroid Build Coastguard Worker#
17*dbb5c420SAndroid Build Coastguard Worker# Generate Android.bp for AOSP blob self-extractors.
18*dbb5c420SAndroid Build Coastguard Worker#
19*dbb5c420SAndroid Build Coastguard Worker# For example, a blob package may contain:
20*dbb5c420SAndroid Build Coastguard Worker#   ./vendor
21*dbb5c420SAndroid Build Coastguard Worker#   └── qcom
22*dbb5c420SAndroid Build Coastguard Worker#       └── coral
23*dbb5c420SAndroid Build Coastguard Worker#           └── proprietary
24*dbb5c420SAndroid Build Coastguard Worker#               ├── lib64
25*dbb5c420SAndroid Build Coastguard Worker#               |   ├── libfoo.so
26*dbb5c420SAndroid Build Coastguard Worker#               |   └── libbar.so
27*dbb5c420SAndroid Build Coastguard Worker#               ├── libfoo.so
28*dbb5c420SAndroid Build Coastguard Worker#               └── libbar.so
29*dbb5c420SAndroid Build Coastguard Worker#
30*dbb5c420SAndroid Build Coastguard Worker# Generate prebuilt modules for these blobs:
31*dbb5c420SAndroid Build Coastguard Worker# $ export SYSTEM_EXT_SPECIFIC=true # If installing prebuilts to system_ext/ partition
32*dbb5c420SAndroid Build Coastguard Worker# $ export OWNER=qcom # Owner is relevant if PRODUCT_RESTRICT_VENDOR_FILES is set
33*dbb5c420SAndroid Build Coastguard Worker# $ ./generate-android-bp-for-blobs.sh ./vendor/qcom/coral/proprietary > Android.bp.txt
34*dbb5c420SAndroid Build Coastguard Worker# $ mv Android.bp.txt ${ANDROID_BUILD_TOP}/device/google/coral/self-extractors/qcom/staging/
35*dbb5c420SAndroid Build Coastguard Worker#
36*dbb5c420SAndroid Build Coastguard Worker# You may need to review the contents of Android.bp.txt as some of the blobs may
37*dbb5c420SAndroid Build Coastguard Worker# have unsatisfied dependencies. Add `check_elf_files: false` to bypass this
38*dbb5c420SAndroid Build Coastguard Worker# kind of build errors.
39*dbb5c420SAndroid Build Coastguard Worker
40*dbb5c420SAndroid Build Coastguard Workerset -e
41*dbb5c420SAndroid Build Coastguard Worker
42*dbb5c420SAndroid Build Coastguard Workerreadonly PREBUILT_DIR="$1"
43*dbb5c420SAndroid Build Coastguard Worker
44*dbb5c420SAndroid Build Coastguard Workerreadonly elf_files=$(
45*dbb5c420SAndroid Build Coastguard Worker  for file in $(find "$PREBUILT_DIR" -type f); do
46*dbb5c420SAndroid Build Coastguard Worker    if readelf -h "$file" 2>/dev/null 1>&2; then
47*dbb5c420SAndroid Build Coastguard Worker      basename "$file"
48*dbb5c420SAndroid Build Coastguard Worker    fi
49*dbb5c420SAndroid Build Coastguard Worker  done | sort | uniq | xargs
50*dbb5c420SAndroid Build Coastguard Worker)
51*dbb5c420SAndroid Build Coastguard Worker
52*dbb5c420SAndroid Build Coastguard Workerecho "// Copyright (C) $(date +%Y) The Android Open Source Project"
53*dbb5c420SAndroid Build Coastguard Workerecho "//"
54*dbb5c420SAndroid Build Coastguard Workerecho "// Licensed under the Apache License, Version 2.0 (the \"License\");"
55*dbb5c420SAndroid Build Coastguard Workerecho "// you may not use this file except in compliance with the License."
56*dbb5c420SAndroid Build Coastguard Workerecho "// You may obtain a copy of the License at"
57*dbb5c420SAndroid Build Coastguard Workerecho "//"
58*dbb5c420SAndroid Build Coastguard Workerecho "//      http://www.apache.org/licenses/LICENSE-2.0"
59*dbb5c420SAndroid Build Coastguard Workerecho "//"
60*dbb5c420SAndroid Build Coastguard Workerecho "// Unless required by applicable law or agreed to in writing, software"
61*dbb5c420SAndroid Build Coastguard Workerecho "// distributed under the License is distributed on an \"AS IS\" BASIS,"
62*dbb5c420SAndroid Build Coastguard Workerecho "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied."
63*dbb5c420SAndroid Build Coastguard Workerecho "// See the License for the specific language governing permissions and"
64*dbb5c420SAndroid Build Coastguard Workerecho "// limitations under the License."
65*dbb5c420SAndroid Build Coastguard Workerecho ""
66*dbb5c420SAndroid Build Coastguard Workerecho "soong_namespace {"
67*dbb5c420SAndroid Build Coastguard Workerecho "}"
68*dbb5c420SAndroid Build Coastguard Worker
69*dbb5c420SAndroid Build Coastguard Workerfor file in $elf_files; do
70*dbb5c420SAndroid Build Coastguard Worker  file32=$(find "$PREBUILT_DIR" -type f -name "$file" | grep -v 'lib64' | head)
71*dbb5c420SAndroid Build Coastguard Worker  file64=$(find "$PREBUILT_DIR" -type f -name "$file" | grep 'lib64' | head)
72*dbb5c420SAndroid Build Coastguard Worker  if [[ -n "$file32" ]] && [[ -n "$file64" ]]; then
73*dbb5c420SAndroid Build Coastguard Worker    multilib="both"
74*dbb5c420SAndroid Build Coastguard Worker  elif [[ -n "$file32" ]]; then
75*dbb5c420SAndroid Build Coastguard Worker    multilib="32"
76*dbb5c420SAndroid Build Coastguard Worker  else
77*dbb5c420SAndroid Build Coastguard Worker    multilib="64"
78*dbb5c420SAndroid Build Coastguard Worker  fi
79*dbb5c420SAndroid Build Coastguard Worker
80*dbb5c420SAndroid Build Coastguard Workerecho ""
81*dbb5c420SAndroid Build Coastguard Workerecho "cc_prebuilt_library_shared {"
82*dbb5c420SAndroid Build Coastguard Workerecho "    name: \"${file%.so}\","
83*dbb5c420SAndroid Build Coastguard Workerecho "    arch: {"
84*dbb5c420SAndroid Build Coastguard Worker
85*dbb5c420SAndroid Build Coastguard Worker  if [[ -f "$file32" ]]; then
86*dbb5c420SAndroid Build Coastguard Worker  NEEDED=$(readelf -d "$file32" | sed -n -E 's/^.*\(NEEDED\).*\[(.+)\]$/\1/p' | xargs)
87*dbb5c420SAndroid Build Coastguard Workerecho "        arm: {"
88*dbb5c420SAndroid Build Coastguard Workerecho "            srcs: [\"$(realpath --relative-to="$PREBUILT_DIR" "$file32")\"],"
89*dbb5c420SAndroid Build Coastguard Worker    if [[ -n "$NEEDED" ]]; then
90*dbb5c420SAndroid Build Coastguard Workerecho "            shared_libs: ["
91*dbb5c420SAndroid Build Coastguard Worker      for entry in $NEEDED; do
92*dbb5c420SAndroid Build Coastguard Workerecho "                \"${entry%.so}\","
93*dbb5c420SAndroid Build Coastguard Worker      done
94*dbb5c420SAndroid Build Coastguard Workerecho "            ],"
95*dbb5c420SAndroid Build Coastguard Worker    fi
96*dbb5c420SAndroid Build Coastguard Workerecho "        },"
97*dbb5c420SAndroid Build Coastguard Worker  fi
98*dbb5c420SAndroid Build Coastguard Worker
99*dbb5c420SAndroid Build Coastguard Worker  if [[ -f "$file64" ]]; then
100*dbb5c420SAndroid Build Coastguard Worker  NEEDED=$(readelf -d "$file64" | sed -n -E 's/^.*\(NEEDED\).*\[(.+)\]$/\1/p' | xargs)
101*dbb5c420SAndroid Build Coastguard Workerecho "        arm64: {"
102*dbb5c420SAndroid Build Coastguard Workerecho "            srcs: [\"$(realpath --relative-to="$PREBUILT_DIR" "$file64")\"],"
103*dbb5c420SAndroid Build Coastguard Worker    if [[ -n "$NEEDED" ]]; then
104*dbb5c420SAndroid Build Coastguard Workerecho "            shared_libs: ["
105*dbb5c420SAndroid Build Coastguard Worker      for entry in $NEEDED; do
106*dbb5c420SAndroid Build Coastguard Workerecho "                \"${entry%.so}\","
107*dbb5c420SAndroid Build Coastguard Worker      done
108*dbb5c420SAndroid Build Coastguard Workerecho "            ],"
109*dbb5c420SAndroid Build Coastguard Worker    fi
110*dbb5c420SAndroid Build Coastguard Workerecho "        },"
111*dbb5c420SAndroid Build Coastguard Worker  fi
112*dbb5c420SAndroid Build Coastguard Worker
113*dbb5c420SAndroid Build Coastguard Workerecho "    },"
114*dbb5c420SAndroid Build Coastguard Workerecho "    compile_multilib: \"$multilib\","
115*dbb5c420SAndroid Build Coastguard Worker  if [[ -n "$SYSTEM_EXT_SPECIFIC" ]]; then
116*dbb5c420SAndroid Build Coastguard Workerecho "    system_ext_specific: true,"
117*dbb5c420SAndroid Build Coastguard Worker  fi
118*dbb5c420SAndroid Build Coastguard Worker  if [[ -n "$OWNER" ]]; then
119*dbb5c420SAndroid Build Coastguard Workerecho "    owner: \"${OWNER}\","
120*dbb5c420SAndroid Build Coastguard Worker  fi
121*dbb5c420SAndroid Build Coastguard Workerecho "    strip: {"
122*dbb5c420SAndroid Build Coastguard Workerecho "        none: true,"
123*dbb5c420SAndroid Build Coastguard Workerecho "    },"
124*dbb5c420SAndroid Build Coastguard Workerecho "}"
125*dbb5c420SAndroid Build Coastguard Worker
126*dbb5c420SAndroid Build Coastguard Workerdone
127