From 045c65093559cf40389b9518400570184bf77a9c Mon Sep 17 00:00:00 2001 From: SamarV-121 Date: Tue, 19 Mar 2024 08:50:02 +0530 Subject: [PATCH] extract-utils: Support declaring symlinks to source files This will create symlink entries in the Android.bp and related PRODUCT_PACKAGES list in the product makefile for all files in the blob list which has SYMLINK argument. Example usage: vendor/lib64/egl/libGLES_mali.so;SYMLINK=vendor/lib64/hw/vulkan.universal7904.so,vendor/lib64/libOpenCL.so,vendor/lib64/libOpenCL.so.1,vendor/lib64/libOpenCL.so.1.1 For particular cases, it might help getting rid of symlink creation during build time as it breaks hermetic partition build, which is forbidden since U QPR2. Change-Id: If6d36c961cc2908d8d5cfbf61eb5d07f793ab0b9 --- extract_utils.sh | 120 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 105 insertions(+), 15 deletions(-) diff --git a/extract_utils.sh b/extract_utils.sh index fb94aa1..c26751c 100644 --- a/extract_utils.sh +++ b/extract_utils.sh @@ -12,6 +12,7 @@ PRODUCT_COPY_FILES_FIXUP_HASHES=() PRODUCT_PACKAGES_LIST=() PRODUCT_PACKAGES_HASHES=() PRODUCT_PACKAGES_FIXUP_HASHES=() +PRODUCT_SYMLINKS_LIST=() PACKAGE_LIST=() EXTRACT_SRC= EXTRACT_STATE=-1 @@ -222,7 +223,7 @@ function prefix_match() { local FILE=$(target_file "$LINE") if [[ "$FILE" =~ ^"$PREFIX" ]]; then local ARGS=$(target_args "$LINE") - if [ -z "${ARGS}" ]; then + if [[ -z "${ARGS}" || "${ARGS}" =~ 'SYMLINK' ]]; then NEW_ARRAY+=("${FILE#$PREFIX}") else NEW_ARRAY+=("${FILE#$PREFIX};${ARGS}") @@ -535,6 +536,8 @@ function write_blueprint_packages() { OVERRIDEPKG=${ARG#*=} OVERRIDEPKG=${OVERRIDEPKG//,/\", \"} printf '\toverrides: ["%s"],\n' "$OVERRIDEPKG" + elif [[ "$ARG" =~ "SYMLINK" ]]; then + continue elif [ ! -z "$ARG" ]; then USE_PLATFORM_CERTIFICATE="false" printf '\tcertificate: "%s",\n' "$ARG" @@ -910,21 +913,80 @@ function write_product_packages() { write_blueprint_packages "EXECUTABLES" "odm" "" "O_BIN" >> "$ANDROIDBP" fi - # Actually write out the final PRODUCT_PACKAGES list - local PACKAGE_COUNT=${#PACKAGE_LIST[@]} + write_package_definition "${PACKAGE_LIST[@]}" >> "$PRODUCTMK" +} - if [ "$PACKAGE_COUNT" -eq "0" ]; then + +# +# write_symlink_packages: +# +# Creates symlink entries in the Android.bp and related PRODUCT_PACKAGES +# list in the product makefile for all files in the blob list which has +# SYMLINK argument. +# +function write_symlink_packages() { + local FILE= + local ARGS= + local ARCH= + local BASENAME= + local PKGNAME= + local PREFIX= + local SYMLINK_BASENAME= + local SYMLINK_PACKAGES=() + + # Sort the symlinks list for comm + PRODUCT_SYMLINKS_LIST=($( printf '%s\n' "${PRODUCT_SYMLINKS_LIST[@]}" | LC_ALL=C sort)) + + local COUNT=${#PRODUCT_SYMLINKS_LIST[@]} + + if [ "$COUNT" = "0" ]; then return 0 fi - printf '\n%s\n' "PRODUCT_PACKAGES += \\" >> "$PRODUCTMK" - for (( i=1; i> "$PRODUCTMK" + BASENAME=$(basename "$FILE") + ARGS=$(target_args "$LINE") + ARGS=(${ARGS//;/ }) + for ARG in "${ARGS[@]}"; do + if [[ "$ARG" =~ "SYMLINK" ]]; then + SYMLINKS=${ARG#*=} + SYMLINKS=(${SYMLINKS//,/ }) + for SYMLINK in "${SYMLINKS[@]}"; do + SYMLINK_BASENAME=$(basename "$SYMLINK") + PKGNAME=${BASENAME%.*}_${SYMLINK_BASENAME%.*}_symlink${ARCH} + { + printf 'install_symlink {\n' + printf '\tname: "%s",\n' "$PKGNAME" + if prefix_match_file "vendor/" "$FILE"; then + PREFIX='vendor/' + printf '\tsoc_specific: true,\n' + elif prefix_match_file "product/" "$FILE"; then + PREFIX='product/' + printf '\tproduct_specific: true,\n' + elif prefix_match_file "system_ext/" "$FILE"; then + PREFIX='system_ext/' + printf '\tsystem_ext_specific: true,\n' + elif prefix_match_file "odm/" "$FILE"; then + PREFIX='odm/' + printf '\tdevice_specific: true,\n' + fi + printf '\tinstalled_location: "%s",\n' "${SYMLINK#"$PREFIX"}" + printf '\tsymlink_target: "/%s",\n' "$FILE" + printf '}\n\n' + } >> "$ANDROIDBP" + SYMLINK_PACKAGES+=("$PKGNAME") + done + fi + done done + + write_package_definition "${SYMLINK_PACKAGES[@]}" >> "$PRODUCTMK" } # @@ -1137,6 +1199,31 @@ function write_rro_package() { write_rro_androidmanifest "$TARGET_PACKAGE" >> "$RROMANIFEST" } +# +# write_package_definition: +# +# $@: list of packages +# +# writes out the final PRODUCT_PACKAGES list +# +function write_package_definition() { + local PACKAGE_LIST=("${@}") + local PACKAGE_COUNT=${#PACKAGE_LIST[@]} + + if [ "$PACKAGE_COUNT" -eq "0" ]; then + return 0 + fi + + printf '\n%s\n' "PRODUCT_PACKAGES += \\" + for (( i=1; i