#!/bin/bash
|
|
# bitbake target
|
BB_TARGET=yocto-image-full
|
|
# this project absolute path
|
PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
|
|
# top project absolute path
|
TOP_PATH=$(realpath $PRJ_PATH/..)
|
|
# prefix install path
|
PRFX_PATH=$PRJ_PATH/install
|
|
# final install path
|
#INST_PATH=/srv/ftp/
|
|
# compress system image or not
|
COMPRESS=yes
|
|
# download taballs path
|
TARBALL_PATH=$PRJ_PATH/tarballs
|
|
# config file path
|
CONF_FILE=$TOP_PATH/config.json
|
|
# Download path
|
#DL_PATH="/srv/yocto_packets/"
|
|
# shell script will exit once get command error
|
set -e
|
|
#+-------------------------+
|
#| Shell script functions |
|
#+-------------------------+
|
|
function pr_error() {
|
echo -e "\033[40;31m $1 \033[0m"
|
}
|
|
function pr_warn() {
|
echo -e "\033[40;33m $1 \033[0m"
|
}
|
|
function pr_info() {
|
echo -e "\033[40;32m $1 \033[0m"
|
}
|
|
# decompress a packet to destination path
|
function do_unpack()
|
{
|
tarball=$1
|
dstpath=`pwd`
|
|
if [[ $# == 2 ]] ; then
|
dstpath=$2
|
fi
|
|
pr_info "decompress $tarball => $dstpath"
|
|
mkdir -p $dstpath
|
case $tarball in
|
*.tar.gz)
|
tar -xzf $tarball -C $dstpath
|
;;
|
|
*.tar.bz2)
|
tar -xjf $tarball -C $dstpath
|
;;
|
|
*.tar.xz)
|
tar -xJf $tarball -C $dstpath
|
;;
|
|
*.tar.zst)
|
tar -I zstd -xf $tarball -C $dstpath
|
;;
|
|
*.tar)
|
tar -xf $tarball -C $dstpath
|
;;
|
|
*.zip)
|
unzip -qo $tarball -d $dstpath
|
;;
|
|
*)
|
pr_error "decompress Unsupport packet: $tarball"
|
return 1;
|
;;
|
esac
|
}
|
|
# parser configure file and export environment variable
|
function export_env()
|
{
|
export BOARD=`jq -r ".bsp.board" $CONF_FILE | tr 'A-Z' 'a-z'`
|
export BSP_VER=`jq -r ".bsp.version" $CONF_FILE | tr 'A-Z' 'a-z'`
|
export YCT_VER=`jq -r ".system.version" $CONF_FILE | tr 'A-Z' 'a-z'`
|
export BSP_URL=`jq -r ".bsp.giturl" $CONF_FILE`
|
|
export YCT_BOARD=`echo $BOARD| cut -d- -f1`
|
export YCT_META=meta-$YCT_BOARD
|
export YCT_SRC=$YCT_VER-$BSP_VER
|
export YCT_PATH=$PRJ_PATH/$YCT_SRC
|
export BUILD_DIR=${BOARD}
|
}
|
|
function do_fetch()
|
{
|
cd $PRJ_PATH
|
|
if [ ! -d $YCT_SRC/sources ] ; then
|
|
if [[ $BSP_URL =~ github.com ]] ; then
|
|
pr_info "start repo fetch Yocto $YCT_VER source code"
|
|
mkdir -p $YCT_PATH && cd $YCT_PATH
|
|
if ! command -v repo > /dev/null 2>&1 ; then
|
curl https://storage.googleapis.com/git-repo-downloads/repo > repo
|
chmod a+x repo
|
export PATH=$YCT_PATH:$PATH
|
fi
|
|
BSP_VER=`echo $BSP_VER | sed 's/lf/imx/'`
|
repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-$YCT_VER -m $BSP_VER.xml
|
repo sync && rm -f repo
|
|
else
|
|
pr_info "start download fetch Yocto $YCT_VER source code"
|
|
mkdir -p $TARBALL_PATH
|
|
# Download source code packet
|
if [ ! -s $TARBALL_PATH/$YCT_SRC.tar.xz ] ; then
|
wget $BSP_URL/imx/bsp/$BSP_VER/$YCT_SRC.tar.xz -P $TARBALL_PATH
|
fi
|
|
# decompress source code packet
|
do_unpack $TARBALL_PATH/$YCT_SRC.tar.xz
|
|
fi
|
|
else
|
pr_warn "Yocto $YCT_VER source code fetched already"
|
fi
|
|
if [ ! -d $PRJ_PATH/$YCT_META ] ; then
|
pr_error "Yocto meta $YCT_META not exist"
|
exit ;
|
fi
|
|
pr_warn "start update BSP patches for $YCT_META"
|
BSP_VER=`echo $BSP_VER | sed 's/imx/lf/'`
|
cp $TOP_PATH/bootloader/patches/${BOARD}/uboot-imx-${BSP_VER}.patch $PRJ_PATH/$YCT_META/recipes-bsp/u-boot/files/
|
cp $TOP_PATH/kernel/patches/${BOARD}/linux-imx-${BSP_VER}.patch $PRJ_PATH/$YCT_META/recipes-kernel/linux/files/
|
|
if [ ! -e $YCT_PATH/sources/$YCT_META ] ; then
|
ln -s $PRJ_PATH/$YCT_META $YCT_PATH/sources/$YCT_META
|
fi
|
}
|
|
function do_build()
|
{
|
cd $YCT_PATH
|
|
if [ ! -f ${BUILD_DIR}/conf/local.conf ] ; then
|
pr_info "source $YCT_BOARD-setup.sh"
|
MACHINE=${BOARD} source sources/$YCT_META/tools/$YCT_BOARD-setup.sh -b $BUILD_DIR
|
else
|
pr_info "source poky/oe-init-build-env"
|
source sources/poky/oe-init-build-env $BUILD_DIR
|
fi
|
|
if [[ -n "$DL_PATH" ]] ; then
|
sed -i "s|^#DL_DIR.*|DL_DIR ?= \"$DL_PATH/$YCT_VER\"|g" conf/local.conf
|
sed -i "s|^DL_DIR.*|DL_DIR ?= \"$DL_PATH/$YCT_VER\"|g" conf/local.conf
|
fi
|
|
bitbake $BB_TARGET
|
}
|
|
function do_install()
|
{
|
IMAGE_NAME=yocto-${YCT_VER}-${BSP_VER}.wic
|
ROOTFS_TAR=rootfs-yocto-${YCT_VER}.tar.zst
|
|
cd $YCT_PATH
|
|
echo ""
|
pr_info "Yocto($YCT_VER) installed to '$PRFX_PATH'"
|
|
mkdir -p ${PRFX_PATH}
|
cp $YCT_PATH/$BUILD_DIR/tmp/deploy/images/$BOARD/$BB_TARGET-$BOARD.wic ${PRFX_PATH}/$IMAGE_NAME
|
cp $YCT_PATH/$BUILD_DIR/tmp/deploy/images/$BOARD/$BB_TARGET-$BOARD.tar.zst ${PRFX_PATH}/$ROOTFS_TAR
|
|
if [[ $BOARD =~ mx6ull ]] ; then
|
cp $YCT_PATH/$BUILD_DIR/tmp/deploy/images/$BOARD/u-boot-${BOARD}.imx ${PRFX_PATH}/u-boot-${BOARD}.imx
|
else
|
cp $YCT_PATH/$BUILD_DIR/tmp/deploy/images/$BOARD/imx-boot ${PRFX_PATH}/u-boot-${BOARD}.imx
|
fi
|
|
cd ${PRFX_PATH}/
|
|
if [[ `echo $COMPRESS | tr 'A-Z' 'a-z'` == "yes" ]] ; then
|
pr_info "Start bzip2 compress $IMAGE_NAME"
|
rm -f $IMAGE_NAME.bz2
|
bzip2 $IMAGE_NAME
|
fi
|
chmod a+x u-boot-${BOARD}.imx
|
|
ls && echo ""
|
|
if [ -n "$INST_PATH" -a -w $INST_PATH ] ; then
|
|
pr_info "Start copy Yocto system images to $INST_PATH"
|
cp u-boot-${BOARD}.imx $INST_PATH
|
cp $IMAGE_NAME* $INST_PATH
|
cp $ROOTFS_TAR $INST_PATH
|
|
ls ${INST_PATH} && echo ""
|
fi
|
|
}
|
|
function do_clean()
|
{
|
cd $PRJ_PATH
|
|
rm -rf $PRFX_PATH
|
}
|
|
#+-------------------------+
|
#| Shell script body entry |
|
#+-------------------------+
|
|
export_env
|
|
if [[ $# == 1 && $1 == -c ]] ;then
|
pr_warn "start clean Yocto source code"
|
do_clean
|
exit;
|
fi
|
|
pr_warn "start build Yocto $YCT_VER for ${BOARD}"
|
|
do_fetch
|
|
do_build
|
|
do_install
|