参考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,继续判断 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.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