blob: 3d0660ce7d9ce825f3bbfe0f95b6300ace09cbc9 [file] [log] [blame]
#!/bin/bash
#
# Copyright 2020 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Generate Android.bp for AOSP blob self-extractors.
#
# For example, a blob package may contain:
# ./vendor
# └── qcom
# └── coral
# └── proprietary
# ├── lib64
# | ├── libfoo.so
# | └── libbar.so
# ├── libfoo.so
# └── libbar.so
#
# Generate prebuilt modules for these blobs:
# $ export SYSTEM_EXT_SPECIFIC=true # If installing prebuilts to system_ext/ partition
# $ export OWNER=qcom # Owner is relevant if PRODUCT_RESTRICT_VENDOR_FILES is set
# $ ./generate-android-bp-for-blobs.sh ./vendor/qcom/coral/proprietary > Android.bp.txt
# $ mv Android.bp.txt ${ANDROID_BUILD_TOP}/device/google/coral/self-extractors/qcom/staging/
#
# You may need to review the contents of Android.bp.txt as some of the blobs may
# have unsatisfied dependencies. Add `check_elf_files: false` to bypass this
# kind of build errors.
set -e
readonly PREBUILT_DIR="$1"
readonly elf_files=$(
for file in $(find "$PREBUILT_DIR" -type f); do
if readelf -h "$file" 2>/dev/null 1>&2; then
basename "$file"
fi
done | sort | uniq | xargs
)
echo "// Copyright (C) $(date +%Y) The Android Open Source Project"
echo "//"
echo "// Licensed under the Apache License, Version 2.0 (the \"License\");"
echo "// you may not use this file except in compliance with the License."
echo "// You may obtain a copy of the License at"
echo "//"
echo "// http://www.apache.org/licenses/LICENSE-2.0"
echo "//"
echo "// Unless required by applicable law or agreed to in writing, software"
echo "// distributed under the License is distributed on an \"AS IS\" BASIS,"
echo "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied."
echo "// See the License for the specific language governing permissions and"
echo "// limitations under the License."
echo ""
echo "soong_namespace {"
echo "}"
for file in $elf_files; do
file32=$(find "$PREBUILT_DIR" -type f -name "$file" | grep -v 'lib64' | head)
file64=$(find "$PREBUILT_DIR" -type f -name "$file" | grep 'lib64' | head)
if [[ -n "$file32" ]] && [[ -n "$file64" ]]; then
multilib="both"
elif [[ -n "$file32" ]]; then
multilib="32"
else
multilib="64"
fi
echo ""
echo "cc_prebuilt_library_shared {"
echo " name: \"${file%.so}\","
echo " arch: {"
if [[ -f "$file32" ]]; then
NEEDED=$(readelf -d "$file32" | sed -n -E 's/^.*\(NEEDED\).*\[(.+)\]$/\1/p' | xargs)
echo " arm: {"
echo " srcs: [\"$(realpath --relative-to="$PREBUILT_DIR" "$file32")\"],"
if [[ -n "$NEEDED" ]]; then
echo " shared_libs: ["
for entry in $NEEDED; do
echo " \"${entry%.so}\","
done
echo " ],"
fi
echo " },"
fi
if [[ -f "$file64" ]]; then
NEEDED=$(readelf -d "$file64" | sed -n -E 's/^.*\(NEEDED\).*\[(.+)\]$/\1/p' | xargs)
echo " arm64: {"
echo " srcs: [\"$(realpath --relative-to="$PREBUILT_DIR" "$file64")\"],"
if [[ -n "$NEEDED" ]]; then
echo " shared_libs: ["
for entry in $NEEDED; do
echo " \"${entry%.so}\","
done
echo " ],"
fi
echo " },"
fi
echo " },"
echo " compile_multilib: \"$multilib\","
if [[ -n "$SYSTEM_EXT_SPECIFIC" ]]; then
echo " system_ext_specific: true,"
fi
if [[ -n "$OWNER" ]]; then
echo " owner: \"${OWNER}\","
fi
echo " strip: {"
echo " none: true,"
echo " },"
echo "}"
done