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