2026-08-13 11:28:40 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
#
|
|
|
|
|
|
# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
|
|
|
|
|
|
#
|
|
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
|
|
###############################################################
|
|
|
|
|
|
# Function: choose board and product, set environment variables.
|
|
|
|
|
|
###############################################################
|
|
|
|
|
|
|
|
|
|
|
|
RTOS_ROOT_DIR=$(realpath $(dirname $(readlink -f ${BASH_SOURCE[0]:-$0})))
|
|
|
|
|
|
export RTOS_ROOT_DIR
|
|
|
|
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
|
|
echo "Usage: source $BASH_SOURCE [arch_name] [soc_name] [board_name] [product_name]"
|
|
|
|
|
|
echo "−h: display help."
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; }
|
|
|
|
|
|
|
|
|
|
|
|
# $1: arch
|
|
|
|
|
|
# $2: soc
|
|
|
|
|
|
# $3: board
|
|
|
|
|
|
# $4: product
|
|
|
|
|
|
check_package_combination() {
|
|
|
|
|
|
i=0
|
|
|
|
|
|
for arch in ${ARCHES[*]}; do
|
|
|
|
|
|
[[ "$1" == "$arch" ]] && break
|
|
|
|
|
|
i=$((i + 1))
|
|
|
|
|
|
done
|
|
|
|
|
|
[ $i -ge ${#ARCHES[*]} ] && return 1
|
|
|
|
|
|
|
|
|
|
|
|
i=0
|
|
|
|
|
|
for soc in ${SOCS[*]}; do
|
|
|
|
|
|
[[ "$2" == "$soc" ]] && break
|
|
|
|
|
|
i=$((i + 1))
|
|
|
|
|
|
done
|
|
|
|
|
|
[ "$i" -ge ${#SOCS[*]} ] && return 2
|
|
|
|
|
|
|
|
|
|
|
|
i=0
|
|
|
|
|
|
for board in ${BOARDS[*]}; do
|
|
|
|
|
|
[[ "$3" == "$board" ]] && break
|
|
|
|
|
|
i=$((i + 1))
|
|
|
|
|
|
done
|
|
|
|
|
|
[ "$i" -ge ${#BOARDS[*]} ] && return 3
|
|
|
|
|
|
|
|
|
|
|
|
i=0
|
|
|
|
|
|
for product in ${PRODUCTS[*]}; do
|
|
|
|
|
|
[[ "$4" == "$product" ]] && break
|
|
|
|
|
|
i=$((i + 1))
|
|
|
|
|
|
done
|
|
|
|
|
|
[ "$i" -ge ${#PRODUCTS[*]} ] && return 4
|
|
|
|
|
|
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function parse_package_combination() {
|
|
|
|
|
|
unset ARCHES SOCS BOARDS PRODUCTS
|
|
|
|
|
|
|
|
|
|
|
|
ARCHES=($(find $RTOS_ROOT_DIR/rtos/*/arch -mindepth 1 -maxdepth 1 -type d ! -name ".*" | \
|
|
|
|
|
|
xargs basename -a | sort -n))
|
|
|
|
|
|
SOCS=($(find $RTOS_ROOT_DIR/rtos/*/soc -mindepth 2 -maxdepth 2 -type d ! -name ".*" | \
|
|
|
|
|
|
xargs basename -a | sort -n))
|
|
|
|
|
|
BOARDS=($(find $RTOS_ROOT_DIR/rtos/*/boards -mindepth 2 -maxdepth 2 -type d ! -name ".*" | \
|
|
|
|
|
|
xargs basename -a | sort -n))
|
|
|
|
|
|
PRODUCTS=($(find $RTOS_ROOT_DIR/rtos/*/products -mindepth 1 -maxdepth 1 -type d ! -name ".*" | \
|
|
|
|
|
|
xargs basename -a | sort -n))
|
|
|
|
|
|
|
|
|
|
|
|
PACKAGE_COMBINATION_INPUT="$PWD/image_packer/package_combination.in"
|
|
|
|
|
|
export PACKAGE_COMBINATION="$PWD/output/package_combination.txt"
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -d "$PWD/output" ]; then
|
|
|
|
|
|
mkdir -p $PWD/output
|
|
|
|
|
|
fi
|
|
|
|
|
|
if [ ! -s "$PACKAGE_COMBINATION" ] || [ $PACKAGE_COMBINATION -ot $PACKAGE_COMBINATION_INPUT ]; then
|
|
|
|
|
|
: >$PACKAGE_COMBINATION
|
|
|
|
|
|
while IFS= read -r LINE; do
|
|
|
|
|
|
valid_line=true
|
|
|
|
|
|
read -a ARRY <<< "$LINE"
|
|
|
|
|
|
for ((loop = 0; loop < ${#ARRY[@]}; loop += 4)); do
|
|
|
|
|
|
arch=${ARRY[loop]}
|
|
|
|
|
|
soc=${ARRY[loop + 1]}
|
|
|
|
|
|
board=${ARRY[loop + 2]}
|
|
|
|
|
|
product=${ARRY[loop + 3]}
|
|
|
|
|
|
check_package_combination $arch $soc $board $product
|
|
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
|
|
valid_line=false
|
|
|
|
|
|
break
|
|
|
|
|
|
fi
|
|
|
|
|
|
done
|
|
|
|
|
|
if [ "$valid_line" = false ]; then
|
|
|
|
|
|
continue
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo $LINE >>$PACKAGE_COMBINATION
|
|
|
|
|
|
done <$PACKAGE_COMBINATION_INPUT
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-25 10:02:36 +08:00
|
|
|
|
function apply_default_patches()
|
|
|
|
|
|
{
|
|
|
|
|
|
AML_PATCHES_PATH="$RTOS_ROOT_DIR/aml-patches"
|
|
|
|
|
|
if [ -d $AML_PATCHES_PATH ] && [ -n "$(find $AML_PATCHES_PATH -name '*.patch')" ] \
|
|
|
|
|
|
&& [ ! -f $RTOS_ROOT_DIR/.aml-rtos-patch-done ]; then
|
|
|
|
|
|
echo "Appling Patches in $RTOS_ROOT_DIR/aml-patches"
|
|
|
|
|
|
touch $RTOS_ROOT_DIR/.aml-rtos-patch-done
|
|
|
|
|
|
for PatchFolder in $(for p in $(find $AML_PATCHES_PATH -name *.patch \
|
|
|
|
|
|
-printf "%P\n"); do dirname $p; done | sort -u | xargs);
|
|
|
|
|
|
do
|
|
|
|
|
|
if [ -d $RTOS_ROOT_DIR/$PatchFolder ]; then
|
|
|
|
|
|
PROJ_PATH=$RTOS_ROOT_DIR/$PatchFolder
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "$RTOS_ROOT_DIR/$PatchFolder not exist"
|
|
|
|
|
|
continue
|
|
|
|
|
|
fi
|
|
|
|
|
|
for Patch in $(find $AML_PATCHES_PATH/$PatchFolder -maxdepth 1 \
|
|
|
|
|
|
-name '*.patch' -printf "%P\n" | sort | xargs)
|
|
|
|
|
|
do
|
|
|
|
|
|
echo "Try applying patch: $AML_PATCHES_PATH/$PatchFolder/$Patch..."
|
|
|
|
|
|
if git -C $PROJ_PATH apply --check \
|
|
|
|
|
|
$AML_PATCHES_PATH/$PatchFolder/$Patch; then
|
|
|
|
|
|
git -C $PROJ_PATH am $AML_PATCHES_PATH/$PatchFolder/$Patch
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "$PatchFolder/$Patch can't be applied to $PROJ_PATH"
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo "....Done"
|
|
|
|
|
|
done
|
|
|
|
|
|
done
|
|
|
|
|
|
else
|
|
|
|
|
|
return 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-13 11:28:40 +08:00
|
|
|
|
CMAKE_FILE=$(which cmake)
|
|
|
|
|
|
if [ -x /opt/cmake-3.18.4-Linux-x86_64/bin/cmake ]; then
|
|
|
|
|
|
export PATH=/opt/cmake-3.18.4-Linux-x86_64/bin/:$PATH
|
|
|
|
|
|
elif [ -n "$CMAKE_FILE" ]; then
|
|
|
|
|
|
CMAKE_VERSION=$(cmake --version)
|
|
|
|
|
|
pattern="cmake version "
|
|
|
|
|
|
CMAKE_VERSION=$(echo ${CMAKE_VERSION#*${pattern}})
|
|
|
|
|
|
pattern=" CMake"
|
|
|
|
|
|
CMAKE_VERSION=$(echo ${CMAKE_VERSION%${pattern}*})
|
|
|
|
|
|
if version_lt $CMAKE_VERSION "3.13.1"; then
|
|
|
|
|
|
echo "cmake version $CMAKE_VERSION < 3.13.1!"
|
|
|
|
|
|
echo "Please upgrade cmake!"
|
|
|
|
|
|
return 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "cmake not found!"
|
|
|
|
|
|
echo "Please install cmake!"
|
|
|
|
|
|
return 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
NINJA_FILE=$(which ninja)
|
|
|
|
|
|
if [ -z "$NINJA_FILE" ]; then
|
|
|
|
|
|
echo "ninja not found!"
|
|
|
|
|
|
echo "Please install ninja!"
|
|
|
|
|
|
return 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2026-08-25 10:02:36 +08:00
|
|
|
|
apply_default_patches
|
2026-08-13 11:28:40 +08:00
|
|
|
|
parse_package_combination
|
|
|
|
|
|
|
|
|
|
|
|
if [ -n "$1" ] && [ $1 == "-h" ]; then
|
|
|
|
|
|
usage
|
|
|
|
|
|
return 0
|
|
|
|
|
|
elif [ $# -eq 2 ] && [ $2 == "gen_all" ]; then
|
|
|
|
|
|
CHOICE_PACKAGE=$1
|
|
|
|
|
|
echo "Choose project:$CHOICE_PACKAGE"
|
|
|
|
|
|
else
|
|
|
|
|
|
unset CHOICE_PACKAGE
|
|
|
|
|
|
|
|
|
|
|
|
if [ -z "$CHOICE_PACKAGE" ]; then
|
|
|
|
|
|
echo "Available projects:"
|
|
|
|
|
|
#show all package combinations
|
|
|
|
|
|
j=0
|
|
|
|
|
|
while IFS= read -r LINE; do
|
|
|
|
|
|
NR=$j
|
|
|
|
|
|
echo -e "\t$NR. ${LINE[@]}"
|
|
|
|
|
|
j=$((j + 1))
|
|
|
|
|
|
done <$PACKAGE_COMBINATION
|
|
|
|
|
|
read -p "Choose your project: " CHOICE_PACKAGE
|
|
|
|
|
|
# Determine whether it is a digital number
|
|
|
|
|
|
expr $CHOICE_PACKAGE + 1 >/dev/null 2>&1
|
|
|
|
|
|
if [[ $? -ne 0 ]] || [[ $CHOICE_PACKAGE -ge $j ]]; then
|
|
|
|
|
|
echo "Wrong choice!"
|
|
|
|
|
|
return 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
KERNEL=freertos
|
|
|
|
|
|
|
|
|
|
|
|
export KERNEL CHOICE_PACKAGE
|
|
|
|
|
|
|
|
|
|
|
|
LINK_SRC_PACKAGE=$RTOS_ROOT_DIR/rtos/speaker/scripts/gen_package.sh
|
|
|
|
|
|
LINK_DST_PACKAGE=$RTOS_ROOT_DIR/gen_package.sh
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -f "$LINK_SRC_PACKAGE" ]]; then
|
|
|
|
|
|
ln -sfn "$LINK_SRC_PACKAGE" "$LINK_DST_PACKAGE"
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "Please ensure the $LINK_SRC_PACKAGE is exist or execute repo sync"
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2026-08-25 10:02:36 +08:00
|
|
|
|
return 0
|