参考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.shCWD=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,继续判断 DISTRO变量长度是否为0;如果为0,继续判断FSLDISTRO变量的长度是否为0;
判断 D I S T R O 变 量 长 度 不 为 0 的 话 , 直 接 进 行 赋 值 F S L D I S T R O = " DISTRO变量长度不为0的话,直接进行赋值 FSLDISTRO=" DISTRO变量长度不为0的话,直接进行赋值FSLDISTRO="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.txtyocto基本环境设置
如果$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