| #!/bin/bash |
| # |
| # Copyright (C) 2017 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. |
| # |
| |
| # Test script for build/make/core/tasks/vndk.mk. |
| # Makes sure VNDK snapshots include all required prebuilts and config files. |
| # |
| # Local usage: |
| # First, generate VNDK snapshots with development/vndk/snapshot/build.sh or |
| # fetch VNDK snapshot build artifacts to $DIST_DIR, then run this script. |
| |
| set -eo pipefail |
| |
| if [[ "$#" -ne 1 ]]; then |
| echo "Usage: \"$0 all\" to test all VNDK snapshot variants at once." |
| echo " \"$0 \$TARGET_PRODUCT\" to test a specific VNDK snapshot." |
| exit 1 |
| fi |
| |
| if [[ "$1" == 'all' ]]; then |
| readonly TARGET_PRODUCTS=('aosp_arm' 'aosp_arm_ab' 'aosp_arm64' 'aosp_x86' 'aosp_x86_ab' 'aosp_x86_64') |
| else |
| readonly TARGET_PRODUCTS=($1) |
| fi |
| |
| script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| readonly ANDROID_BUILD_TOP=$(dirname $(dirname $(dirname "${script_dir}"))) |
| echo "ANDROID_BUILD_TOP: "${ANDROID_BUILD_TOP}"" |
| |
| OUT_DIR=${OUT_DIR:-} |
| DIST_DIR=${DIST_DIR:-} |
| if [[ -z "${DIST_DIR}" ]]; then |
| if [[ -z "${OUT_DIR}" ]]; then |
| DIST_DIR="${ANDROID_BUILD_TOP}"/out/dist |
| else |
| DIST_DIR="${OUT_DIR}"/dist |
| fi |
| fi |
| |
| # Get PLATFORM_VNDK_VERSION |
| source ""${ANDROID_BUILD_TOP}"/build/envsetup.sh" >/dev/null |
| readonly PLATFORM_VNDK_VERSION="$(get_build_var PLATFORM_VNDK_VERSION)" |
| |
| readonly TEMP_DIR="$(mktemp -d /tmp/"$(basename $0)"_XXXXXXXX)" |
| readonly SNAPSHOT_TOP="${TEMP_DIR}"/android-vndk-snapshot |
| readonly SNAPSHOT_TEMPFILE="${TEMP_DIR}"/snapshot_libs.txt |
| readonly SYSTEM_TEMPFILE="${TEMP_DIR}"/system_libs.txt |
| readonly BINDER_32_DIRNAME='binder32' |
| |
| readonly RED='\033[0;31m' |
| readonly NC='\033[0m' |
| readonly PASS="::: PASS :::" |
| readonly FAIL=""${RED}"::: FAIL :::"${NC}"" |
| |
| |
| function set_vars() { |
| TARGET_PRODUCT="$1" |
| ARCH='' |
| PRODUCT_OUT='' |
| BITNESS_SUFFIX='' |
| BINDER_BITNESS_PATH='' |
| TARGET_2ND_ARCH='' |
| case "$1" in |
| aosp_arm64) |
| ARCH='arm64' |
| PRODUCT_OUT='generic_arm64' |
| BITNESS_SUFFIX='64' |
| TARGET_2ND_ARCH='arm' |
| ;; |
| aosp_arm) |
| ARCH='arm' |
| PRODUCT_OUT='generic' |
| ;; |
| aosp_arm_ab) |
| ARCH='arm' |
| PRODUCT_OUT='generic_arm_ab' |
| BINDER_BITNESS_PATH="${BINDER_32_DIRNAME}" |
| ;; |
| aosp_x86_64) |
| ARCH='x86_64' |
| PRODUCT_OUT='generic_x86_64' |
| BITNESS_SUFFIX='64' |
| TARGET_2ND_ARCH='x86' |
| ;; |
| aosp_x86) |
| ARCH='x86' |
| PRODUCT_OUT='generic_x86' |
| ;; |
| aosp_x86_ab) |
| ARCH='x86' |
| PRODUCT_OUT='generic_x86' |
| BINDER_BITNESS_PATH="${BINDER_32_DIRNAME}" |
| ;; |
| *) |
| echo "Unrecognized \$TARGET_PRODUCT: "$1"" |
| exit 1 |
| ;; |
| esac |
| } |
| |
| |
| function cleanup { |
| echo "[Cleanup]" |
| echo "Removing TEMP_DIR: "${TEMP_DIR}"" |
| rm -rf ""${TEMP_DIR}"" |
| } |
| trap cleanup EXIT |
| |
| |
| ####################################### |
| # Compares the list of VNDK-core and VNDK-SP |
| # libs included in the snapshot and installed |
| # under $PRODUCT_OUT/system/lib* |
| # |
| # Arguments: |
| # $1: vndk_type: one of [vndk-core, vndk-sp] |
| ####################################### |
| function compare_vndk_libs() { |
| local vndk_type="$1" |
| local vndk_dir_suffix |
| local system_vndk_dir |
| local snapshot_dir |
| local snapshot_dir_2nd |
| local system_lib_dir |
| local system_lib_dir_2nd |
| |
| if [[ -z "${PLATFORM_VNDK_VERSION}" ]]; then |
| vndk_dir_suffix="" |
| else |
| vndk_dir_suffix="-${PLATFORM_VNDK_VERSION}" |
| fi |
| |
| if [[ "${vndk_type}" == 'vndk-core' ]]; then |
| system_vndk_dir="vndk${vndk_dir_suffix}" |
| else |
| system_vndk_dir="vndk-sp${vndk_dir_suffix}" |
| fi |
| |
| function diff_vndk_dirs() { |
| local snapshot="$1" |
| local system="$2" |
| local target_arch="$3" |
| |
| ls -1 ${snapshot} > "${SNAPSHOT_TEMPFILE}" |
| find "${system}" -type f | xargs -n 1 -I file bash -c "basename file" | sort > "${SYSTEM_TEMPFILE}" |
| |
| echo "Comparing libs for TARGET_PRODUCT="${TARGET_PRODUCT}", VNDK="${vndk_type}", ARCH="${target_arch}"" |
| echo "Snapshot dir:" ${snapshot} |
| echo "System dir: "${system}"" |
| (diff --old-line-format="Only found in VNDK snapshot: %L" \ |
| --new-line-format="Only found in /system/lib*: %L" \ |
| --unchanged-line-format="" \ |
| "${SNAPSHOT_TEMPFILE}" "${SYSTEM_TEMPFILE}" && echo "${PASS}") \ |
| || (echo -e "${FAIL}"; exit 1) |
| } |
| |
| if [[ -n "${BINDER_BITNESS_PATH}" ]]; then |
| snapshot_dir="${SNAPSHOT_TOP}"/"${ARCH}"/"${BINDER_BITNESS_PATH}"/arch-"${ARCH}"-*/shared/"${vndk_type}" |
| else |
| snapshot_dir="${SNAPSHOT_TOP}"/"${ARCH}"/arch-"${ARCH}"-*/shared/"${vndk_type}" |
| fi |
| |
| system_lib_dir="${ANDROID_BUILD_TOP}"/out/target/product/"${PRODUCT_OUT}"/system/lib"${BITNESS_SUFFIX}"/"${system_vndk_dir}" |
| diff_vndk_dirs "${snapshot_dir}" $system_lib_dir "${ARCH}" |
| |
| if [[ -n "${TARGET_2ND_ARCH}" ]]; then |
| snapshot_dir_2nd="${SNAPSHOT_TOP}"/"${ARCH}"/arch-"${TARGET_2ND_ARCH}"-*/shared/"${vndk_type}" |
| system_lib_dir_2nd="${ANDROID_BUILD_TOP}"/out/target/product/"${PRODUCT_OUT}"/system/lib/"${system_vndk_dir}" |
| diff_vndk_dirs "${snapshot_dir_2nd}" "${system_lib_dir_2nd}" "${TARGET_2ND_ARCH}" |
| fi |
| } |
| |
| |
| ####################################### |
| # Executes tests against VNDK snapshot of |
| # specified $TARGET_PRODUCT |
| # |
| # Arguments: |
| # $1: TARGET_PRODUCT |
| ####################################### |
| function run_tests() { |
| set_vars "$1" |
| local snapshot_zip="${DIST_DIR}"/android-vndk-"${TARGET_PRODUCT}".zip |
| local snapshot_variant_top="${SNAPSHOT_TOP}"/"${ARCH}" |
| |
| echo "[Setup] Unzipping \"android-vndk-"${TARGET_PRODUCT}".zip\"" |
| unzip -qn "${snapshot_zip}" -d "${SNAPSHOT_TOP}" |
| |
| echo "[Test] Comparing VNDK-core and VNDK-SP libs in snapshot vs /system/lib*" |
| compare_vndk_libs 'vndk-core' |
| compare_vndk_libs 'vndk-sp' |
| |
| echo "[Test] Checking required config files are present" |
| if [[ -z "${PLATFORM_VNDK_VERSION}" ]]; then |
| config_file_suffix="" |
| else |
| config_file_suffix=".${PLATFORM_VNDK_VERSION}" |
| fi |
| |
| config_files=( |
| "ld.config"${config_file_suffix}".txt" |
| "llndk.libraries"${config_file_suffix}".txt" |
| "vndksp.libraries"${config_file_suffix}".txt" |
| "vndkcore.libraries.txt" |
| "vndkprivate.libraries.txt" |
| "module_paths.txt") |
| for config_file in "${config_files[@]}"; do |
| config_file_abs_path="${snapshot_variant_top}"/configs/"${config_file}" |
| if [[ ! -e "${config_file_abs_path}" ]]; then |
| echo -e ""${FAIL}" The file \""${config_file_abs_path}"\" was not found in snapshot." |
| exit 1 |
| else |
| echo ""${PASS}" Found "${config_file}"" |
| fi |
| done |
| |
| echo "[Test] Checking directory structure of snapshot" |
| directories=( |
| "configs/" |
| "NOTICE_FILES/") |
| for sub_dir in "${directories[@]}"; do |
| dir_abs_path="${snapshot_variant_top}"/"${sub_dir}" |
| if [[ ! -d "${dir_abs_path}" ]]; then |
| echo -e ""${FAIL}" The directory \""${dir_abs_path}"\" was not found in snapshot." |
| exit 1 |
| else |
| echo ""${PASS}" Found "${sub_dir}"" |
| fi |
| done |
| } |
| |
| |
| # Run tests for each target product |
| for target_product in "${TARGET_PRODUCTS[@]}"; do |
| echo -e "\n::::::::: Running tests for TARGET_PRODUCT="${target_product}" :::::::::" |
| run_tests "${target_product}" |
| done |
| |
| echo "Done. All tests passed!" |