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
This commit is contained in:
SamarV-121
2024-03-19 08:50:02 +05:30
committed by Bruno Martins
parent 39c6124e01
commit 045c650935

View File

@@ -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<PACKAGE_COUNT+1; i++ )); do
local LINEEND=" \\"
if [ "$i" -eq "$PACKAGE_COUNT" ]; then
LINEEND=""
for LINE in "${PRODUCT_SYMLINKS_LIST[@]}"; do
FILE=$(src_file "$LINE")
if [[ "$LINE" =~ '/lib/' ]]; then
ARCH="32"
elif [[ "$LINE" =~ '/lib64/' ]]; then
ARCH="64"
fi
printf ' %s%s\n' "${PACKAGE_LIST[$i-1]}" "$LINEEND" >> "$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<PACKAGE_COUNT+1; i++ )); do
local LINEEND=" \\"
if [ "$i" -eq "$PACKAGE_COUNT" ]; then
LINEEND=""
fi
printf ' %s%s\n' "${PACKAGE_LIST[$i-1]}" "$LINEEND"
done
}
#
# write_headers:
#
@@ -1259,10 +1346,10 @@ function parse_file_list() {
LIST=$1
fi
PRODUCT_PACKAGES_LIST=()
PRODUCT_PACKAGES_HASHES=()
PRODUCT_PACKAGES_FIXUP_HASHES=()
PRODUCT_SYMLINKS_LIST=()
PRODUCT_COPY_FILES_LIST=()
PRODUCT_COPY_FILES_HASHES=()
PRODUCT_COPY_FILES_FIXUP_HASHES=()
@@ -1284,7 +1371,9 @@ function parse_file_list() {
if [ "$COUNT" -gt "2" ]; then
FIXUP_HASH=${SPLIT[2]}
fi
if [[ "$SPEC" =~ 'SYMLINK=' ]]; then
PRODUCT_SYMLINKS_LIST+=("${SPEC#-}")
fi
# if line starts with a dash, it needs to be packaged
if [[ "$SPEC" =~ ^- ]]; then
PRODUCT_PACKAGES_LIST+=("${SPEC#-}")
@@ -1317,14 +1406,15 @@ function parse_file_list() {
# $1: file containing the list of items to extract
# $2: make treble compatible makefile - optional
#
# Calls write_product_copy_files and write_product_packages on
# the given file and appends to the Android.bp as well as
# the product makefile.
# Calls write_product_copy_files, write_product_packages and
# lastly write_symlink_packages on the given file and appends
# to the Android.bp as well as the product makefile.
#
function write_makefiles() {
parse_file_list "$1"
write_product_copy_files "$2"
write_product_packages
write_symlink_packages
}
#