Files
MilkV-Duo/build.sh

265 lines
5.8 KiB
Bash
Executable File

#!/bin/bash
MILKV_BOARD_ARRAY=
MILKV_BOARD_ARRAY_LEN=
MILKV_BOARD=
MILKV_BOARD_CONFIG=
MILKV_IMAGE_CONFIG=
MILKV_DEFAULT_BOARD=milkv-duo
TOP_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
#echo "TOP_DIR: ${TOP_DIR}"
cd ${TOP_DIR}
function print_info()
{
printf "\e[1;32m%s\e[0m\n" "$1"
}
function print_err()
{
printf "\e[1;31mError: %s\e[0m\n" "$1"
}
function get_toolchain()
{
if [ ! -d host-tools ]; then
print_info "Toolchain does not exist, download it now..."
toolchain_url="https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz"
echo "toolchain_url: ${toolchain_url}"
toolchain_file=${toolchain_url##*/}
echo "toolchain_file: ${toolchain_file}"
wget ${toolchain_url} -O ${toolchain_file}
if [ $? -ne 0 ]; then
print_err "Failed to download ${toolchain_url} !"
exit 1
fi
if [ ! -f ${toolchain_file} ]; then
print_err "${toolchain_file} not found!"
exit 1
fi
print_info "Extracting ${toolchain_file}..."
tar -xf ${toolchain_file}
if [ $? -ne 0 ]; then
print_err "Extract ${toolchain_file} failed!"
exit 1
fi
[ -f ${toolchain_file} ] && rm -rf ${toolchain_file}
fi
}
function get_available_board()
{
MILKV_BOARD_ARRAY=( $(find device -mindepth 1 -maxdepth 1 -type d -print ! -name "." | awk -F/ '{ print $NF }' | sort -t '-' -k2,2) )
#echo ${MILKV_BOARD_ARRAY[@]}
MILKV_BOARD_ARRAY_LEN=${#MILKV_BOARD_ARRAY[@]}
if [ $MILKV_BOARD_ARRAY_LEN -eq 0 ]; then
echo "No available config"
exit 1
fi
#echo ${MILKV_BOARD_ARRAY[@]} | xargs -n 1 | sed "=" | sed "N;s/\n/. /"
}
function choose_board()
{
echo "Select a target to build:"
echo ${MILKV_BOARD_ARRAY[@]} | xargs -n 1 | sed "=" | sed "N;s/\n/. /"
local index
read -p "Which would you like: " index
if [[ -z $index ]]; then
echo "Nothing selected."
exit 0
fi
if [[ -n $index && $index =~ ^[0-9]+$ && $index -ge 1 && $index -le $MILKV_BOARD_ARRAY_LEN ]]; then
MILKV_BOARD="${MILKV_BOARD_ARRAY[$((index - 1))]}"
#echo "index: $index, Board: $MILKV_BOARD"
else
print_err "Invalid input!"
exit 1
fi
}
function prepare_env()
{
source ${MILKV_BOARD_CONFIG}
source build/${MV_BUILD_ENV} > /dev/null 2>&1
defconfig ${MV_BOARD_LINK} > /dev/null 2>&1
echo "OUTPUT_DIR: ${OUTPUT_DIR}" # @build/milkvsetup.sh
}
function milkv_build()
{
# clean old img
old_image_count=`ls ${OUTPUT_DIR}/*.img* | wc -l`
if [ ${old_image_count} -ge 0 ]; then
pushd ${OUTPUT_DIR}
rm -rf *.img*
popd
fi
# clean emmc/nor/nand img
if [ -f "${OUTPUT_DIR}/upgrade.zip" ]; then
rm -rf ${OUTPUT_DIR}/*
fi
clean_all
build_all
if [ $? -eq 0 ]; then
print_info "Build board ${MILKV_BOARD} success!"
else
print_err "Build board ${MILKV_BOARD} failed!"
exit 1
fi
}
function milkv_pack_sd()
{
pack_sd_image
[ ! -d out ] && mkdir out
img_in="${OUTPUT_DIR}/${MILKV_BOARD}.img"
img_out="${MILKV_BOARD}-sd-`date +%Y%m%d-%H%M`.img"
if [ -f "${img_in}" ]; then
mv ${img_in} out/${img_out}
print_info "Create SD image successful: out/${img_out}"
else
print_err "Create SD image failed!"
exit 1
fi
}
function milkv_pack_emmc()
{
[ ! -d out ] && mkdir out
img_in="${OUTPUT_DIR}/upgrade.zip"
img_out="${MILKV_BOARD}-emmc-`date +%Y%m%d-%H%M`.zip"
if [ -f "${img_in}" ]; then
mv ${img_in} out/${img_out}
print_info "Create eMMC image successful: out/${img_out}"
else
print_err "Create eMMC image failed!"
exit 1
fi
}
function milkv_pack_nor_nand()
{
[ ! -d out ] && mkdir out
if [ -f "${OUTPUT_DIR}/upgrade.zip" ]; then
img_out_patch=${MILKV_BOARD}-`date +%Y%m%d-%H%M`
mkdir -p out/$img_out_patch
if [ "${STORAGE_TYPE}" == "spinor" ]; then
cp ${OUTPUT_DIR}/fip.bin out/$img_out_patch
cp ${OUTPUT_DIR}/*.spinor out/$img_out_patch
else
cp ${OUTPUT_DIR}/fip.bin out/$img_out_patch
cp ${OUTPUT_DIR}/*.spinand out/$img_out_patch
fi
touch ${OUTPUT_DIR}/how_to_download.txt
echo "Copy all to a blank tf card, power on and automatically download firmware to NOR or NAND in U-boot." >> out/$img_out_patch/how_to_download.txt
print_info "Create spinor/nand img successful: ${img_out_patch}"
else
print_err "Create spinor/nand img failed!"
exit 1
fi
}
function milkv_pack()
{
if [ "${STORAGE_TYPE}" == "sd" ]; then
milkv_pack_sd
elif [ "${STORAGE_TYPE}" == "emmc" ]; then
milkv_pack_emmc
else
milkv_pack_nor_nand
fi
}
function build_info()
{
print_info "Target Board: ${MILKV_BOARD}"
print_info "Target Board Config: ${MILKV_BOARD_CONFIG}"
print_info "Target Image Config: ${MILKV_IMAGE_CONFIG}"
}
get_available_board
function build_usage()
{
echo "Usage:"
echo "${BASH_SOURCE[0]} - Show this menu"
echo "${BASH_SOURCE[0]} lunch - Select a board to build"
echo "${BASH_SOURCE[0]} [board] - Build [board] directly, supported boards as follows:"
for board in "${MILKV_BOARD_ARRAY[@]}"; do
print_info "$board"
done
}
if [ $# -ge 1 ]; then
if [ "$1" = "lunch" ]; then
choose_board || exit 0
else
if [[ ${MILKV_BOARD_ARRAY[@]} =~ (^|[[:space:]])"${1}"($|[[:space:]]) ]]; then
MILKV_BOARD=${1}
#echo "$MILKV_BOARD"
else
print_err "${1} not supported!"
echo "Available boards: [ ${MILKV_BOARD_ARRAY[@]} ]"
exit 1
fi
fi
else
build_usage && exit 0
fi
if [ -z "${MILKV_BOARD// }" ]; then
print_err "No board specified!"
exit 1
fi
MILKV_BOARD_CONFIG=device/${MILKV_BOARD}/boardconfig.sh
MILKV_IMAGE_CONFIG=device/${MILKV_BOARD}/genimage.cfg
if [ ! -f ${MILKV_BOARD_CONFIG} ]; then
print_err "${MILKV_BOARD_CONFIG} not found!"
exit 1
fi
if [ ! -f ${MILKV_IMAGE_CONFIG} ]; then
print_err "${MILKV_IMAGE_CONFIG} not found!"
exit 1
fi
get_toolchain
build_info
export MILKV_BOARD="${MILKV_BOARD}"
prepare_env
milkv_build
milkv_pack