栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【SemiDrive源码分析】【Yocto源码分析】01 - yocto/base目录源码分析(编译环境初始化流程)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SemiDrive源码分析】【Yocto源码分析】01 - yocto/base目录源码分析(编译环境初始化流程)

【SemiDrive源码分析】【Yocto源码分析】01 - yocto/base目录源码分析(编译环境初始化流程)
  • 一、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源码目录列表如下,下面我们一个一个看下来吧:


一、Base目录 1.1 base/conf/bblayers.conf 模板文件

初始化编译模板,用于确指定哪些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

好,下面来看看这个脚本吧,其主要工作如下:

  1. 加载meta-semidrive目录下的setup-utils.sh脚本
  2. 获取命令行参数输入 -b build-x9ref , 配置输出目录$BUILD_DIR=build-x9ref
  3. 检查参数 $DISTRO 和 $SMDVDISTRO 如果为空,则赋初默认值 SMDVDISTRO='minimal-console'
  4. 检查传参$BUILD_DIR,如果为空则默认输出build目录
  5. 检查传参$MACHINE,如果为空则默认使用MACHINE='x9h_evb'
  6. 更新最终用户许可协议EULA.txt为EULA
  7. 运行 DISTRO=cluster-qt MACHINE=x9h_ref_serdes . setup-environment build-x9ref 命令初始化yocto环境
  8. 由于运行setup-environment后自动进入$BUILD_DIR目录,所以个临时修改BUILD_DIR=.为当前目录
  9. 拷贝$BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.org
  10. 拷贝$BUILD_DIR/conf/bblayers.conf 为 $BUILD_DIR/conf/bblayers.conf.org
  11. 修改$BUILD_DIR/conf/local.conf中的BOARD_VERSION 字段信息
  12. 添加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更新信息的则更新信息。

主要工作如下:

  1. 如果$BUILD_DIR/conf/local.conf.sample 不存在则配置build_dir_setup_enabled=true需要新建$BUILD_DIR目录,这会涉及后面是否需要拷贝 conf模板文件
  2. 调用 poky/oe-init-build-env 脚本初始化OE(openembedded)环境,调用命令为:poky/oe-init-build-env $BUILD_DIR
  3. 移动 $BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.sample
  4. 往$BUILD_DIR/conf/local.conf 中写入DL_DIR ?= "${BSPDIR}/downloads/"
  5. 更新 $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"
  1. 拷贝 /base/conf/bblayers.conf 到 $BUILD_DIR/base/conf/bblayers.conf 下
  2. 处理 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添加进环境变量

主要工作:

  1. 检测当前Python 必须为V2 版本,不能是python3
  2. 如果$BDIR长度为零,则赋值 $BDIR="build",否则 BDIR=$1
  3. 如果定义了$2 ,则直接赋值 $BITBAKEDIR="$2"
  4. 如果没有定义$BITBAKEDIR,则采用默认的 $OEROOT/bitbake$BBEXTRA,即yocto/poky/bitbake
  5. 把 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 环境

主要工作如下:

  1. 创建 $BUILDDIR/conf 目录,即 build-x9ref/conf/ 目录
  2. 进入$BUILDDIR 目录
  3. 获取模板文件$BUILDDIR/conf/templateconf.cfg的内容:meta-poky/conf
  4. 将$BUILDDIR/conf/bblayers.conf中的所有路径修改为绝对路径
  5. 打印 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 时,

  1. 加载meta-semidrive目录下的setup-utils.sh脚本,实际这个过程没干啥。
  2. 解析参数,如果没有则赋默认值,如获取命令行参数输入 -b build-x9ref , 配置输出目录$BUILD_DIR=build-x9ref
  3. 运行 DISTRO=cluster-qt MACHINE=x9h_ref_serdes . setup-environment build-x9ref 命令初始化yocto环境,主要是更新 build/conf/ 目录
  4. 如果$BUILD_DIR/conf/local.conf.sample 不存在则配置build_dir_setup_enabled=true需要新建$BUILD_DIR目录,这会涉及后面是否需要拷贝 conf模板文件
  5. 调用 poky/oe-init-build-env 脚本初始化OE(openembedded)环境,调用命令为:poky/oe-init-build-env $BUILD_DIR
  6. 调用了poky/scripts/oe-buildenv-internal 初始化OE-Core Build Environment,把 yocto/poky/bitbake/bin 和yocto/poky/scripts 目录添加进环境变量
  7. 调用 poky/scripts/oe-setup-builddir 初始化 OE Build Environment,将$BUILDDIR/conf/bblayers.conf中的所有路径修改为绝对路径
  8. 移动 $BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.sample
  9. 往$BUILD_DIR/conf/local.conf 中写入DL_DIR ?= "${BSPDIR}/downloads/"
  10. 更新 $BUILD_DIR/conf/local.conf中的MACHINE、SDKMACHINE、DISTRO 等信息
  11. 拷贝$BUILD_DIR/conf/local.conf 为 $BUILD_DIR/conf/local.conf.org
  12. 拷贝$BUILD_DIR/conf/bblayers.conf 为 $BUILD_DIR/conf/bblayers.conf.org
  13. 修改$BUILD_DIR/conf/local.conf中的BOARD_VERSION 字段信息
  14. 添加Semidrive 相关的 OE中的meta-networking、meta-python、meta-filesystems、meta-qt5 这些层到$BUILD_DIR/conf/bblayers.conf 中

也许有人会说,上面字这么多,太难看了,其实也没干啥事,简单汇总就是这样:

  1. 解析DISTRO、MACHINE、BUILD_DIR等参数
  2. 新建 $BUILD_DIR目录,拷贝 bblayers.conf、local.conf 到 $BUILD_DIR/conf/目录中
  3. 初始化OE-Core Build Environment,把 yocto/poky/bitbake/bin 和yocto/poky/scripts 目录添加进环境变量
  4. 更新$BUILD_DIR/conf/local.conf中的MACHINE、SDKMACHINE、DISTRO 等信息
  5. 添加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 目录的源码结构,加油!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853881.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号