- 一、Base目录
- 1.1 base/conf/bblayers.conf 模板文件
- 1.2 base/sd_setup.sh 初始化编译环境脚本
- 1.3 meta-semidrive/scripts/setup-utils.sh
- 1.4 base/setup-environment 初始化Yocto环境, 更新 build/conf/ 目录
- 1.5 poky/oe-init-build-env 初始化OE环境
- 1.5.1 poky/scripts/oe-buildenv-internal 初始化OE-Core Build 环境,将bitbake添加进环境变量
- 1.5.2 poky/scripts/oe-setup-builddir 初始化 OE Build 环境
- 1.6 Base 目录下编译环境初始化总结
接下来要搞这个,刚好趁五一有时间,在家提前看看源码,还是老规矩,分两步走:
-
第一步:不求甚解
先把各个目录大概浏览一遍,知道其代码框架,知道各目录及其子目录中的文件大概什么作用就行了。 -
第二步:深入分析
针对各个模块深入去挖掘分析其原理。
好了,我们开始第一步吧
SemiDrive X9 Yocto源码目录列表如下,下面我们一个一个看下来吧:
初始化编译模板,用于确指定哪些Yocto Layer层目录需要参与编译。
这个文件会在编译时直接拷贝到 $BUILD_DIR/conf/bblayers.conf 中。
# yocto/base/conf/bblayers.conf
LCONF_VERSION = "6"
BBPATH = "${TOPDIR}"
BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}"
BBFILES ?= ""
BBLAYERS = "
${BSPDIR}/poky/meta
${BSPDIR}/poky/meta-poky
${BSPDIR}/meta-openembedded/meta-oe
${BSPDIR}/meta-openembedded/meta-multimedia
${BSPDIR}/meta-semidrive
"
分析脚本前,我们先来运行下:DISTRO=cluster-qt MACHINE=x9h_ref_serdes source sd_setup.sh -b build-x9ref
输出如下:
ciellee@ubuntu:~/work/code/x9/buildsystem/yocto$ DISTRO=cluster-qt MACHINE=x9h_ref_serdes source sd_setup.sh -b build-x9ref Build directory is build-x9ref machine=x9h_ref_serdes distro=cluster-qt BUILD_DIR=build-x9ref Welcome to Semidrive Community BSP The Yocto Project has extensive documentation about OE including a reference manual which can be found at: http://yoctoproject.org/documentation For more information about OpenEmbedded see their website: http://www.openembedded.org/ You can now run 'bitbake' Common targets are: core-image-minimal meta-toolchain meta-toolchain-sdk adt-installer meta-ide-support semidrive targets are: bitbake lk bitbake baremetal bitbake virtual/kernel bitbake safety bitbake core-image-base Your configuration files at build-x9ref have not been touched. BSPDIR= BUILD_DIR=. meta-semidrive directory found
1.2 base/sd_setup.sh 初始化编译环境脚本
这个脚本使用命令如下:
DISTRO=cluster-qt MACHINE=x9h_ref_serdes source sd_setup.sh -b build-x9ref
注意,只能用python2 ,所以编译前要修改下python 指向python2,命令如下:
sudo rm /usr/bin/python,sudo ln -s /usr/bin/python2 /usr/bin/python
好,下面来看看这个脚本吧,其主要工作如下:
- 加载meta-semidrive目录下的setup-utils.sh脚本
- 获取命令行参数输入 -b build-x9ref , 配置输出目录$BUILD_DIR=build-x9ref
- 检查参数 $DISTRO 和 $SMDVDISTRO 如果为空,则赋初默认值 SMDVDISTRO='minimal-console'
- 检查传参$BUILD_DIR,如果为空则默认输出build目录
- 检查传参$MACHINE,如果为空则默认使用MACHINE='x9h_evb'
- 更新最终用户许可协议EULA.txt为EULA
- 运行 DISTRO=cluster-qt MACHINE=x9h_ref_serdes . setup-environment build-x9ref 命令初始化yocto环境
- 由于运行setup-environment后自动进入$BUILD_DIR目录,所以个临时修改BUILD_DIR=.为当前目录
- 拷贝$BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.org
- 拷贝$BUILD_DIR/conf/bblayers.conf 为 $BUILD_DIR/conf/bblayers.conf.org
- 修改$BUILD_DIR/conf/local.conf中的BOARD_VERSION 字段信息
- 添加Semidrive 相关的 OE中的meta-networking、meta-python、meta-filesystems、meta-qt5 这些层到$BUILD_DIR/conf/bblayers.conf 中
代码如下:
# buildsystem/yocto/base/sd_setup.sh
#!/bin/sh
. meta-semidrive/scripts/setup-utils.sh ## 1. 加载meta-semidrive目录下的setup-utils.sh脚本
CWD=`pwd`
PROGNAME="setup-environment"
clean_up() ## 清除临时的环境变量配置
{
unset CWD BUILD_DIR SMDVDISTRO BUILD_DIR
unset sd_setup_help sd_setup_error sd_setup_flag
unset usage clean_up
unset ARM_DIR META_FSL_BSP_RELEASE
exit_message clean_up
}
# get command line options
OLD_OPTIND=$OPTIND
unset SMDVDISTRO
unset BUILD_DIR
## 2. 获取命令行参数输入 -b build-x9ref , 配置输出目录BUILD_DIR=build-x9ref
while getopts "k:r:t:b:e:gh" sd_setup_flag
do
case $sd_setup_flag in
b) BUILD_DIR="$OPTARG";
echo -e "n Build directory is " $BUILD_DIR
;;
esac
done
## 3. 检查参数 $DISTRO 和 $SMDVDISTRO 如果为空,则赋初默认值
if [ -z "$DISTRO" ]; then
if [ -z "$SMDVDISTRO" ]; then
SMDVDISTRO='minimal-console'
fi
else
SMDVDISTRO="$DISTRO"
fi
## 4. 检查传参$BUILD_DIR,如果为空则默认输出build目录
if [ -z "$BUILD_DIR" ]; then
BUILD_DIR='build'
fi
## 5. 检查传参$MACHINE,如果为空则默认使用MACHINE='x9h_evb'
if [ -z "$MACHINE" ]; then
echo setting to default machine
MACHINE='x9h_evb'
fi
echo machine=$MACHINE distro=$SMDVDISTRO BUILD_DIR=$BUILD_DIR
case $MACHINE in
x9*)
case $SMDVDISTRO in
*console)
: ok
;;
esac
;;
g9*)
case $SMDVDISTRO in
gateway*)
: ok
;;
*)
echo -e "n ERROR - G9 must use gateway distro."
echo -e "n Set DISTRO=gateway in command line."
echo -e "n"
return 1
;;
esac
;;
*)
: ok
;;
esac
## 6. 更新最终用户许可协议EULA.txt为EULA
# copy new EULA into community so setup uses latest Semidrive EULA
cp meta-semidrive/EULA.txt meta-semidrive/EULA
## 7. 运行 DISTRO=cluster-qt MACHINE=x9h_ref_serdes . setup-environment build-x9ref 命令初始化yocto环境
# Set up the basic yocto environment
if [ -z "$DISTRO" ]; then
DISTRO=$SMDVDISTRO MACHINE=$MACHINE . ./$PROGNAME $BUILD_DIR
else
MACHINE=$MACHINE . ./$PROGNAME $BUILD_DIR
fi
## 8. 由于运行setup-environment后自动进入$BUILD_DIR目录,所以个临时修改BUILD_DIR=.为当前目录,此时$BUILD_DIR/conf/local.conf 已经拷贝好了
# Point to the current directory since the last command changed the directory to $BUILD_DIR
BUILD_DIR=.
## 9. 拷贝$BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.org
# On the first script run, backup the local.conf file Consecutive runs, it restores the backup and changes are appended on this one.
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
## 10. 拷贝$BUILD_DIR/conf/bblayers.conf 为 $BUILD_DIR/conf/bblayers.conf.org
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
## 11. 修改$BUILD_DIR/conf/local.conf中的BOARD_VERSION 字段信息
echo "BOARD_VERSION ?= "${BOARD_VERSION}"" >> $BUILD_DIR/conf/local.conf
echo "" >> $BUILD_DIR/conf/bblayers.conf
## 12. 添加Semidrive 相关的 OE中的meta-networking、meta-python、meta-filesystems、meta-qt5 这些层到$BUILD_DIR/conf/bblayers.conf 中
echo "# Semidrive Yocto Project Release layers" >> $BUILD_DIR/conf/bblayers.conf
echo "" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += " ${BSPDIR}/meta-openembedded/meta-networking "" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += " ${BSPDIR}/meta-openembedded/meta-python "" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += " ${BSPDIR}/meta-openembedded/meta-filesystems "" >> $BUILD_DIR/conf/bblayers.conf
echo "BBLAYERS += " ${BSPDIR}/meta-qt5 "" >> $BUILD_DIR/conf/bblayers.conf
## 13. 最后打印 BSPDIR、BUILD_DIR、YOCTO_MACHINE、YOCTO_DISTRO 这些环境变值
echo BSPDIR=$BSPDIR
echo BUILD_DIR=$BUILD_DIR
export YOCTO_MACHINE=$MACHINE
export YOCTO_DISTRO=$SMDVDISTRO
# Support integrating community meta-semidrive
if [ -d ../meta-semidrive ]; then
echo meta-semidrive directory found
# Change settings according to environment
fi
cd $BUILD_DIR
clean_up
unset SMDVDISTRO
1.3 meta-semidrive/scripts/setup-utils.sh
这个脚本定义了一个函数hook_in_layer() 供外部调用,
当后续的脚本中调用了这个函数时,会将传参目录$1下的 machine(config目录) 和 bbclass 将目录$2的覆盖掉。
代码如下:
# /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/scripts/setup-utils.sh
#!/bin/sh
file_override() {
source_path=$1
override_root=$2
if [ -f $source_path ]; then
override_path=$override_root/`basename $source_path`
if [ -f $override_path ]; then
rm $override_path
fi
fi
}
machine_overrides() {
layer=$1
upstream_layer=$2
machines="../$layer/conf/machine/*"
machine_includes="../$layer/conf/machine/include/*"
for machine in $machines; do
file_override $machine ../$upstream_layer/conf/machine
done
for machine_include in $machine_includes; do
file_override $machine_include ../$upstream_layer/conf/machine/include
done
}
bbclass_overrides() {
layer=$1
upstream_layer=$2
bbclasses="../$layer/classes/*"
for bbclass in $bbclasses; do
file_override $bbclass ../$upstream_layer/classes
done
}
# hook_in_layer LAYER-NAME [UPSTREAM-LAYER-NAME]...
# Adds the specified layer to bblayers.conf and facilitates the replacement of upstream machine and/or bbclass files by removing upstream files with the same name.
# If no upstream layer is specified, meta-freescale is used.
# The function is expected to be called from the build folder.
# The specified layer is defined as the path from the sources folder to the layer folder.
#
# Example:
# hook_in_layer meta-fsl-bsp-release/imx/meta-bsp
hook_in_layer() {
layer=$1
shift
if [ "$1" = "" ]; then
upstream_layers="meta-semidrive"
else
upstream_layers="$@"
fi
echo "BBLAYERS += " ${BSPDIR}/$layer "" >> conf/bblayers.conf
for upstream_layer in $upstream_layers; do
machine_overrides $layer $upstream_layer
bbclass_overrides $layer $upstream_layer
done
}
1.4 base/setup-environment 初始化Yocto环境, 更新 build/conf/ 目录
setup-environment 脚本主要是处理 $BUILD_DIR/conf/ 目录中的 local.conf、local.conf.sample、bblayers.conf 等文件,该拷贝的拷贝,该sed更新信息的则更新信息。
主要工作如下:
- 如果$BUILD_DIR/conf/local.conf.sample 不存在则配置build_dir_setup_enabled=true需要新建$BUILD_DIR目录,这会涉及后面是否需要拷贝 conf模板文件
- 调用 poky/oe-init-build-env 脚本初始化OE(openembedded)环境,调用命令为:poky/oe-init-build-env $BUILD_DIR
- 移动 $BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.sample
- 往$BUILD_DIR/conf/local.conf 中写入DL_DIR ?= "${BSPDIR}/downloads/"
- 更新 $BUILD_DIR/conf/local.conf中的MACHINE、SDKMACHINE、DISTRO 等信息
如下是我这边编译好的build-x9ref/conf/local.conf 文件,结合这个,看前面的脚本就很好理解了。
代码如下:
# build-x9ref/conf/local.conf
MACHINE ??= 'x9h_ref_serdes'
DISTRO ?= 'cluster-qt'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS ??= "
STOPTASKS,${TMPDIR},1G,100K
STOPTASKS,${DL_DIR},1G,100K
STOPTASKS,${SSTATE_DIR},1G,100K
STOPTASKS,/tmp,100M,100K
ABORT,${TMPDIR},100M,1K
ABORT,${DL_DIR},100M,1K
ABORT,${SSTATE_DIR},100M,1K
ABORT,/tmp,10M,1K"
PACKAGECONFIG_append_pn-qemu-native = " sdl"
PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
CONF_VERSION = "1"
DL_DIR ?= "${BSPDIR}/downloads/"
BOARD_VERSION ?= ""
ACCEPT_SDRV_EULA = "1"
- 拷贝 /base/conf/bblayers.conf 到 $BUILD_DIR/base/conf/bblayers.conf 下
- 处理 EULA协议,需要开发者 输入 Y 进入下一步
代码如下:
# yocto/base/setup-environment
#!/bin/sh
CWD=`pwd`
PROGNAME="setup-environment"
# get command line options
SHORTOPTS="h"
LONGOPTS="help"
## 1. 如果$BUILD_DIR/conf/local.conf.sample 不存在则配置build_dir_setup_enabled需要新建$BUILD_DIR目录,这会涉及后面是否需要拷贝 conf模板文件
if [ ! -e $1/conf/local.conf.sample ]; then
build_dir_setup_enabled="true"
else
build_dir_setup_enabled="false"
fi
## 2. 调用 poky/oe-init-build-env 脚本初始化OE(openembedded)环境, 调用命令为:poky/oe-init-build-env $BUILD_DIR
OEROOT=$PWD/poky
. $OEROOT/oe-init-build-env $CWD/$1 > /dev/null
# Clean up PATH, because if it includes tokens to current directories somehow,
# wrong binaries can be used instead of the expected ones during task execution
export PATH="`echo $PATH | sed 's/(:.|:)*:/:/g;s/^.?://;s/:.?$//'`"
## 3. 移动 $BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.sample
## 4. 往$BUILD_DIR/conf/local.conf 中写入DL_DIR ?= "${BSPDIR}/downloads/"
generated_config=
if [ "$build_dir_setup_enabled" = "true" ]; then
mv conf/local.conf conf/local.conf.sample
# Generate the local.conf based on the Yocto defaults
TEMPLATES=$CWD/base/conf
grep -v '^#|^$' conf/local.conf.sample > conf/local.conf
cat >> conf/local.conf <
1.5 poky/oe-init-build-env 初始化OE环境
这个脚本主要是
调用了poky/scripts/oe-buildenv-internal 初始化OE-Core Build Environment
调用 poky/scripts/oe-setup-builddir 初始化 OE Build Environment
代码如下:
# yocto/poky/oe-init-build-env
#!/bin/sh
THIS_SCRIPT="$(pwd)/oe-init-build-env"
if [ -z "$OEROOT" ]; then
OEROOT=$(dirname "$THIS_SCRIPT") ## OEROOT=poky/
OEROOT=$(readlink -f "$OEROOT")
fi
## 运行 . poky/scripts/oe-buildenv-internal && poky/scripts/oe-setup-builddir 这两个脚本,如果成功的话,直接退出
export OEROOT
. $OEROOT/scripts/oe-buildenv-internal &&
TEMPLATECONF="$TEMPLATECONF" $OEROOT/scripts/oe-setup-builddir || {
unset OEROOT
return 1
}
unset OEROOT
[ -z "$BUILDDIR" ] || cd "$BUILDDIR"
1.5.1 poky/scripts/oe-buildenv-internal 初始化OE-Core Build 环境,将bitbake添加进环境变量
主要工作:
- 检测当前Python 必须为V2 版本,不能是python3
- 如果$BDIR长度为零,则赋值 $BDIR="build",否则 BDIR=$1
- 如果定义了$2 ,则直接赋值 $BITBAKEDIR="$2"
- 如果没有定义$BITBAKEDIR,则采用默认的 $OEROOT/bitbake$BBEXTRA,即yocto/poky/bitbake
- 把 yocto/poky/bitbake/bin 和yocto/poky/scripts 目录添加进环境变量
代码如下:
# /yocto/poky/scripts/oe-buildenv-internal
#!/bin/sh
# OE-Core Build Environment Setup Script
## 1. 检测当前Python 必须为V2 版本,不能是python3,导入sys环境变量
# Make sure we're not using python v3.x as 'python', we don't support it.
py_v2_check=$(/usr/bin/env python --version 2>&1 | grep "Python 3")
if [ -n "$py_v2_check" ]; then
echo >&2 "OpenEmbedded requires 'python' to be python v2 (>= 2.7.3), not python v3."
echo >&2 "Please set up python v2 as your default 'python' interpreter."
return 1
fi
unset py_v2_check
py_v27_check=$(python -c 'import sys; print sys.version_info >= (2,7,3)')
if [ "$py_v27_check" != "True" ]; then
echo >&2 "OpenEmbedded requires 'python' to be python v2 (>= 2.7.3), not python v3."
echo >&2 "Please upgrade your python v2."
fi
unset py_v27_check
# We potentially have code that doesn't parse correctly with older versions
# of Python, and rather than fixing that and being eternally vigilant for
# any other new feature use, just check the version here.
py_v34_check=$(python3 -c 'import sys; print(sys.version_info >= (3,4,0))')
if [ "$py_v34_check" != "True" ]; then
echo >&2 "BitBake requires Python 3.4.0 or later as 'python3'"
return 1
fi
unset py_v34_check
## 2. 如果$BDIR长度为零,则赋值 $BDIR="build",否则 BDIR=$1
if [ -z "$BDIR" ]; then
if [ -z "$1" ]; then
BDIR="build"
else
BDIR="$1"
if [ "$BDIR" = "/" ]; then
echo >&2 "Error: / is not supported as a build directory."
return 1
fi
# Remove any possible trailing slashes. This is used to work around
# buggy readlink in Ubuntu 10.04 that doesn't ignore trailing slashes
# and hence "readlink -f new_dir_to_be_created/" returns empty.
BDIR=$(echo $BDIR | sed -re 's|/+$||')
BDIR=$(readlink -f "$BDIR")
fi
## 3. 如果定义了$2 ,则直接赋值 $BITBAKEDIR="$2"
if [ -n "$2" ]; then
BITBAKEDIR="$2"
fi
fi
if [ "${BDIR#/}" != "$BDIR" ]; then
BUILDDIR="$BDIR"
else
BUILDDIR="$(pwd)/$BDIR"
fi
unset BDIR
## 4. 如果没有定义$BITBAKEDIR,则采用默认的 $OEROOT/bitbake$BBEXTRA,即yocto/poky/bitbake
if [ -z "$BITBAKEDIR" ]; then
BITBAKEDIR="$OEROOT/bitbake$BBEXTRA"
test -d "$BITBAKEDIR" || BITBAKEDIR="$OEROOT/../bitbake$BBEXTRA"
fi
BITBAKEDIR=$(readlink -f "$BITBAKEDIR")
BUILDDIR=$(readlink -f "$BUILDDIR")
BBPATH=$BUILDDIR
export BBPATH
## 5. 把 yocto/poky/bitbake/bin 和yocto/poky/scripts 目录添加进环境变量
# Make sure our paths are at the beginning of $PATH
for newpath in "$BITBAKEDIR/bin" "$OEROOT/scripts"; do
# Remove any existences of $newpath from $PATH
PATH=$(echo $PATH | sed -re "s#(^|:)$newpath(:|$)#2#g;s#^:##")
# Add $newpath to $PATH
PATH="$newpath:$PATH"
done
unset BITBAKEDIR newpath
# Used by the runqemu script
export BUILDDIR
export PATH
BB_ENV_EXTRAWHITE_OE="MACHINE DISTRO TCMODE TCLIBC HTTP_PROXY http_proxy
HTTPS_PROXY https_proxy FTP_PROXY ftp_proxy FTPS_PROXY ftps_proxy ALL_PROXY
all_proxy NO_PROXY no_proxy SSH_AGENT_PID SSH_AUTH_SOCK BB_SRCREV_POLICY
SDKMACHINE BB_NUMBER_THREADS BB_NO_NETWORK PARALLEL_MAKE GIT_PROXY_COMMAND
SOCKS5_PASSWD SOCKS5_USER SCREENDIR STAMPS_DIR BBPATH_EXTRA BB_SETSCENE_ENFORCE"
BB_ENV_EXTRAWHITE="$(echo $BB_ENV_EXTRAWHITE $BB_ENV_EXTRAWHITE_OE | tr ' ' 'n' | LC_ALL=C sort --unique | tr 'n' ' ')"
export BB_ENV_EXTRAWHITE
1.5.2 poky/scripts/oe-setup-builddir 初始化 OE Build 环境
主要工作如下:
- 创建 $BUILDDIR/conf 目录,即 build-x9ref/conf/ 目录
- 进入$BUILDDIR 目录
- 获取模板文件$BUILDDIR/conf/templateconf.cfg的内容:meta-poky/conf
- 将$BUILDDIR/conf/bblayers.conf中的所有路径修改为绝对路径
- 打印 pokey/meta/conf/conf-notes.txt,内容如下:
### Shell environment set up for builds. ###
You can now run 'bitbake '
Common targets are:
core-image-minimal
core-image-sato
meta-toolchain
meta-ide-support
You can also run generated qemu images with a command like 'runqemu qemux86'
代码如下:
# yocto/poky/scripts/oe-setup-builddir
#!/bin/sh
# OE Build Environment Setup Script
## 1. 创建 $BUILDDIR/conf 目录,即 build-x9ref/conf/ 目录
mkdir -p "$BUILDDIR/conf"
# Attempting removal of sticky,setuid bits from BUILDDIR, BUILDDIR/conf
chmod -st "$BUILDDIR" 2>/dev/null || echo "WARNING: unable to chmod $BUILDDIR"
chmod -st "$BUILDDIR/conf" 2>/dev/null || echo "WARNING: unable to chmod $BUILDDIR/conf"
## 2. 进入$BUILDDIR 目录
cd "$BUILDDIR"
## 3. 获取模板文件$BUILDDIR/conf/templateconf.cfg的内容:meta-poky/conf
if [ -f "$BUILDDIR/conf/templateconf.cfg" ]; then
TEMPLATECONF=$(cat "$BUILDDIR/conf/templateconf.cfg")
fi
. $OEROOT/.templateconf
if [ ! -f "$BUILDDIR/conf/templateconf.cfg" ]; then
echo "$TEMPLATECONF" >"$BUILDDIR/conf/templateconf.cfg"
fi
#
# $TEMPLATECONF can point to a directory for the template local.conf & bblayers.conf
#
if [ -n "$TEMPLATECONF" ]; then
if [ ! -d "$TEMPLATECONF" ]; then
# Allow TEMPLATECONF=meta-xyz/conf as a shortcut
if [ -d "$OEROOT/$TEMPLATECONF" ]; then
TEMPLATECONF="$OEROOT/$TEMPLATECONF"
fi
if [ ! -d "$TEMPLATECONF" ]; then
echo >&2 "Error: TEMPLATECONF value points to nonexistent directory '$TEMPLATECONF'"
exit 1
fi
fi
OECORELAYERCONF="$TEMPLATECONF/bblayers.conf.sample"
OECORELOCALCONF="$TEMPLATECONF/local.conf.sample"
OECORENOTESCONF="$TEMPLATECONF/conf-notes.txt"
fi
unset SHOWYPDOC
if [ -z "$OECORELOCALCONF" ]; then
OECORELOCALCONF="$OEROOT/meta/conf/local.conf.sample"
fi
if [ ! -r "$BUILDDIR/conf/local.conf" ]; then
cat < "$BUILDDIR/conf/bblayers.conf"
SHOWYPDOC=yes
fi
# Prevent disturbing a new GIT clone in same console
unset OECORELOCALCONF
unset OECORELAYERCONF
fi
## 5. 打印 pokey/meta/conf/conf-notes.txt的内容
if [ -z "$OECORENOTESCONF" ]; then
OECORENOTESCONF="$OEROOT/meta/conf/conf-notes.txt"
fi
[ ! -r "$OECORENOTESCONF" ] || cat $OECORENOTESCONF
unset OECORENOTESCONF
走到这里,脚本基本走完了,接下来,我来返回前面的未分析的代码继续分。
1.6 Base 目录下编译环境初始化总结
在base 目录中主要包含了 bblayers.conf 这个层模板,这个文件会在编译时直接拷贝到 $BUILD_DIR/conf/bblayers.conf 中。
整个编译环境初始化过程如下:
当开发者运行 DISTRO=cluster-qt MACHINE=x9h_ref_serdes source sd_setup.sh -b build-x9ref 时,
- 加载meta-semidrive目录下的setup-utils.sh脚本,实际这个过程没干啥。
- 解析参数,如果没有则赋默认值,如获取命令行参数输入 -b build-x9ref , 配置输出目录$BUILD_DIR=build-x9ref
- 运行 DISTRO=cluster-qt MACHINE=x9h_ref_serdes . setup-environment build-x9ref 命令初始化yocto环境,主要是更新 build/conf/ 目录
- 如果$BUILD_DIR/conf/local.conf.sample 不存在则配置build_dir_setup_enabled=true需要新建$BUILD_DIR目录,这会涉及后面是否需要拷贝 conf模板文件
- 调用 poky/oe-init-build-env 脚本初始化OE(openembedded)环境,调用命令为:poky/oe-init-build-env $BUILD_DIR
- 调用了poky/scripts/oe-buildenv-internal 初始化OE-Core Build Environment,把 yocto/poky/bitbake/bin 和yocto/poky/scripts 目录添加进环境变量
- 调用 poky/scripts/oe-setup-builddir 初始化 OE Build Environment,将$BUILDDIR/conf/bblayers.conf中的所有路径修改为绝对路径
- 移动 $BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.sample
- 往$BUILD_DIR/conf/local.conf 中写入DL_DIR ?= "${BSPDIR}/downloads/"
- 更新 $BUILD_DIR/conf/local.conf中的MACHINE、SDKMACHINE、DISTRO 等信息
- 拷贝$BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.org
- 拷贝$BUILD_DIR/conf/bblayers.conf 为 $BUILD_DIR/conf/bblayers.conf.org
- 修改$BUILD_DIR/conf/local.conf中的BOARD_VERSION 字段信息
- 添加Semidrive 相关的 OE中的meta-networking、meta-python、meta-filesystems、meta-qt5 这些层到$BUILD_DIR/conf/bblayers.conf 中
也许有人会说,上面字这么多,太难看了,其实也没干啥事,简单汇总就是这样:
- 解析DISTRO、MACHINE、BUILD_DIR等参数
- 新建 $BUILD_DIR目录,拷贝 bblayers.conf、local.conf 到 $BUILD_DIR/conf/目录中
- 初始化OE-Core Build Environment,把 yocto/poky/bitbake/bin 和yocto/poky/scripts 目录添加进环境变量
- 更新$BUILD_DIR/conf/local.conf中的MACHINE、SDKMACHINE、DISTRO 等信息
- 添加Semidrive 相关的 OE中的meta-networking、meta-python、meta-filesystems、meta-qt5 这些层到$BUILD_DIR/conf/bblayers.conf 中
如果还要更简洁,就是一句话:
创建$BUILD_DIR目录,拷贝并更新$BUILD_DIR/conf下的local.conf、bblayers.conf等文件中的信息,同时把 yocto/poky/bitbake/bin 和yocto/poky/scripts 目录添加进环境变量。
接下来就是等用户通过 bitbake 执行相关编译指令了。
好了,yocto/base目录源码我们就分析到这里,明天我们来分析下 meta-openembedded 目录的源码结构,加油!!!



