#!/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 YCT_BOARD=`echo $BOARD| cut -d- -f1` export YCT_META=meta-$YCT_BOARD export YCT_PATH=$PRJ_PATH/$YCT_VER-$BSP_VER export BUILD_DIR=${BOARD} } function do_fetch() { mkdir -p $YCT_PATH && cd $YCT_PATH if [ ! -d sources ] ; then pr_info "start repo fetch Yocto $YCT_VER source code" 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_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() { 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}/ cp $YCT_PATH/$BUILD_DIR/tmp/deploy/images/$BOARD/$BB_TARGET-$BOARD.tar.zst ${PRFX_PATH}/ 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 $BB_TARGET-$BOARD.wic" rm -f $BB_TARGET-$BOARD.wic.bz2 bzip2 $BB_TARGET-$BOARD.wic 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 $BB_TARGET-$BOARD.wic* $INST_PATH cp $BB_TARGET-$BOARD.tar.zst $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