yocto启动脚本分析:imx-setup-release.sh

​ 参考yocto的oe-init-build-env文件,i.MX提供了脚本文件 imx-setup-release.sh,这个文件可以很简答的配置 i.MX的机器。该脚本为指定的机器设置了一个目录和配置文件。在meta-imx层, i.MX提供了一个新的或者升级的机器配置去覆盖meta-freescale中的机器配置。通过imx-setup-release.sh脚本文件将配置文件拷贝到meta-freescale/conf/machine目录中。

​ 每个构建目录必须配置为只使用一个发行版。每次更改变量DISTRO_FEATURES时,都需要一个空的构建文件夹。如果没有指定发行版文件,xwayland发行版将被设置为默认版本。发行版配置保存在发行版设置中的local.conf中,并在bitbake运行时显示。

通过对输入命令行内容得解析,做了如下工作:

1.对环境变量得配置,包括对machine的配置

2.创建构建目录

3.生成local.conf

4.填充bblayers.conf

几个变量

$CWD:记录脚本运行前的工作目录;

${BSPDIR} :记录脚本运行前的工作目录;

$MACHINE :机器配置,如果不设置默认机器名为imx6qpsabresd

$BUILD_DIR: 记录yocto构建目录;如果不设置即默认构建目录为build

$DISTRO : 发行版配置;如果不设置默认默认发行版xwayland

一些调用函数

下面我们按照脚本的顺序简要分析一下:注释部分一般在脚本的上一行或者右侧;

#!/bin/sh

首先执行该脚本,该脚本为构建环境提供一些设置功能;

如函数:hook_in_layer()

该函数将指定层添加到bblayers.conf 并通过删除同名的上游文件来方便替换上游machine或bbclass文件。

. sources/meta-imx/tools/setup-utils.sh

CWD=pwd
PROGNAME=“setup-environment”

退出打印的消息

exit_message ()
{
   echo "To return to this build environment later please run:"
   echo "    source setup-environment <build_dir>"

}

usage函数,在clean_up()函数中调用该函数

usage()
{
    echo -e "\nUsage: source imx-setup-release.sh
    Optional parameters: [-b build-dir] [-h]"
echo "
    * [-b build-dir]: Build directory, if unspecified script uses 'build' as output directory
    * [-h]: help
"
}

clean_up(),清楚一些构建和设置,打印一些相关信息

clean_up()
{
​```
unset CWD BUILD_DIR FSLDISTRO
unset fsl_setup_help fsl_setup_error fsl_setup_flag
unset usage clean_up
unset ARM_DIR META_FSL_BSP_RELEASE
exit_message clean_up
​```
}

使用getopts()函数 解析命令行

OLD_OPTIND=$OPTIND
unset FSLDISTRO

使用getopts获取命令行参数,我输入的命令行对应部分为:xxx imx-setup-release.sh -b build-xwayland

执行b) BUILD_DIR="$OPTARG";
echo -e "\n Build directory is " $BUILD_DIR

此时BUILD_DIR = build-xwayland

​ shift $((OPTIND-1))

变量索引指到下一个

while getopts "k:r:t:b:e:gh" fsl_setup_flag
do
    case $fsl_setup_flag in
        b) BUILD_DIR="$OPTARG";
           echo -e "\n Build directory is " $BUILD_DIR
           ;;
        h) fsl_setup_help='true';
           ;;
        \?) fsl_setup_error='true';
           ;;
    esac
done
shift $((OPTIND-1))

getopts 简介

由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高。使用内部命令 getopts 可以很方便地处理命令行参数。一般格式为:getopts options variable

getopts 的设计目标是在循环中运行,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法。即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母。如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0;如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以 - 开头,就返回不为0的退出状态。

判断该参数是否为空,且文件是否存在

if [ $# -ne 0 ]; then
    fsl_setup_error=true
    echo -e "Invalid command line ending: '$@'"
fi

使用test判断$fsl_setup_help 和 $fsl_setup_error 是否为真(即命令行输入h 或者 ?),如果为真就clean_up && return 1;

OPTIND=$OLD_OPTIND
if test $fsl_setup_help; then
    usage && clean_up && return 1
elif test $fsl_setup_error; then
    clean_up && return 1
fi

判断 D I S T R O 变 量 长 度 是 否 为 0 ; 如 果 为 0 , 继 续 判 断 DISTRO变量长度是否为0;如果为0,继续判断 DISTRO00FSLDISTRO变量的长度是否为0;

判断 D I S T R O 变 量 长 度 不 为 0 的 话 , 直 接 进 行 赋 值 F S L D I S T R O = " DISTRO变量长度不为0的话,直接进行赋值 FSLDISTRO=" DISTRO0FSLDISTRO="DISTRO"

if [ -z "$DISTRO" ]; then
    if [ -z "$FSLDISTRO" ]; then
        FSLDISTRO='fsl-imx-xwayland'
    fi
else
    FSLDISTRO="$DISTRO"
fi

判断$BUILD_DIR"的变量的长度是否为0.如果为0即输入的变量为空或者没有设置,即默认构建目录为build

判断$MACHINE" 是否为空,如果为空 MACHINE=‘imx6qpsabresd’

if [ -z "$BUILD_DIR" ]; then
    BUILD_DIR='build'
fi

if [ -z "$MACHINE" ]; then
    echo setting to default machine
    MACHINE='imx6qpsabresd'
fi

判断$MACHINE是否为imx8*,如果是且image为Wayland ,则提示不支持;

case $MACHINE in
imx8*)
    case $DISTRO in
    *wayland)
        : ok
        ;;
    *)
        echo -e "\n ERROR - Only Wayland distros are supported for i.MX 8 or i.MX 8M"
        echo -e "\n"
        return 1
        ;;
    esac
    ;;
*)
    : ok
    ;;
esac

< EULA是否为1,当脚本运行时,它提示用户接受EULA。一旦接受EULA,接受将存储在每个构建文件夹的local.conf中,并且不再为该构建文件夹显示EULA接受查询>

清除meta-freescale/EULA

清除classes/fsl-eula-unpack.bbclass

cd $CWD/sources/meta-freescale
if [ -h EULA ]; then
    echo Cleanup meta-freescale/EULA...
    git checkout -- EULA
fi
if [ ! -f classes/fsl-eula-unpack.bbclass ]; then
    echo Cleanup meta-freescale/classes/fsl-eula-unpack.bbclass...
    git checkout -- classes/fsl-eula-unpack.bbclass
fi
cd -

覆盖掉meta-freescale/EULA

FSL_EULA_FILE=$CWD/sources/meta-imx/EULA.txt

yocto基本环境设置

如果$DISTRO没有设置,把设置为默认值

if [ -z "$DISTRO" ]; then
   DISTRO=$FSLDISTRO MACHINE=$MACHINE . ./$PROGNAME $BUILD_DIR
else
   MACHINE=$MACHINE . ./$PROGNAME $BUILD_DIR
fi

其中:$PROGNAME=setup-environment $BUILD_DIR=你设置的构建目录,默认为build

./$PROGNAME $BUILD_DIR ;等同于 source setup-environment build-dir

该条命令执行环境配置,并进入构建目录$BUILD_DIR

在setup-environment build-xwayland 时,目录已切换到build-xwayland,对该目录$BUILD_DIR/conf/local.conf进行检查

BUILD_DIR=.

if [ ! -e $BUILD_DIR/conf/local.conf ]; then
    echo -e "\n ERROR - No build directory is set yet. Run the 'setup-environment' script before running this script to create " $BUILD_DIR
    echo -e "\n"
    return 1
fi

第一个脚本运行时,将会备份local.config,连续运行,它恢复备份并将更改附加到此备份上

##############判断$BUILD_DIR/conf/local.conf.org,存在则把local.conf进行备份
if [ ! -e $BUILD_DIR/conf/local.conf.org ]; then
    cp $BUILD_DIR/conf/local.conf $BUILD_DIR/conf/local.conf.org
else
    cp $BUILD_DIR/conf/local.conf.org $BUILD_DIR/conf/local.conf
fi

echo >> conf/local.conf
echo "# Switch to Debian packaging and include package-management in the image" >> conf/local.conf
echo "PACKAGE_CLASSES = \"package_deb\"" >> conf/local.conf
echo "EXTRA_IMAGE_FEATURES += \"package-management\"" >> conf/local.conf
##############判断$BUILD_DIR/conf/local.conf,不存在则把local.conf.org复制到local.conf
if [ ! -e $BUILD_DIR/conf/bblayers.conf.org ]; then
    cp $BUILD_DIR/conf/bblayers.conf $BUILD_DIR/conf/bblayers.conf.org
else
    cp $BUILD_DIR/conf/bblayers.conf.org $BUILD_DIR/conf/bblayers.conf
fi

META_FSL_BSP_RELEASE="${CWD}/sources/meta-imx/meta-bsp"
##############往bblayers.conf中填充信息,这里使用到了hook_in_layer() xxx
echo "" >> $BUILD_DIR/conf/bblayers.conf
echo "# i.MX Yocto Project Release layers" >> $BUILD_DIR/conf/bblayers.conf
hook_in_layer meta-imx/meta-bsp
hook_in_layer meta-imx/meta-sdk
hook_in_layer meta-imx/meta-ml

echo "" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += \"\${BSPDIR}/sources/meta-browser\"" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += \"\${BSPDIR}/sources/meta-rust\"" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += \"\${BSPDIR}/sources/meta-openembedded/meta-gnome\"" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += \"\${BSPDIR}/sources/meta-openembedded/meta-networking\"" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += \"\${BSPDIR}/sources/meta-openembedded/meta-filesystems\"" >> $BUILD_DIR/conf/bblayers.conf

echo "BBLAYERS += \"\${BSPDIR}/sources/meta-qt5\"" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += \"\${BSPDIR}/sources/meta-python2\"" >> $BUILD_DIR/conf/bblayers.conf
##############判断sources/meta-ivi是否有该文件,如果有把meta-ivi相关的追加到层中
if [ -d ../sources/meta-ivi ]; then
    echo -e "\n## Genivi layers" >> $BUILD_DIR/conf/bblayers.conf
    echo "BBLAYERS += \"\${BSPDIR}/sources/meta-gplv2\"" >> $BUILD_DIR/conf/bblayers.conf
    echo "BBLAYERS += \"\${BSPDIR}/sources/meta-ivi/meta-ivi\"" >> $BUILD_DIR/conf/bblayers.conf
    echo "BBLAYERS += \"\${BSPDIR}/sources/meta-ivi/meta-ivi-bsp\"" >> $BUILD_DIR/conf/bblayers.conf
    echo "BBLAYERS += \"\${BSPDIR}/sources/meta-ivi/meta-ivi-test\"" >> $BUILD_DIR/conf/bblayers.conf
fi

echo BSPDIR=$BSPDIR
echo BUILD_DIR=$BUILD_DIR
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值