yocto-poky

本文档详细介绍了Yocto Project的核心组件Poky,包括环境配置脚本的分析,如oe-init-build-env、oe-buildenv-internal和oe-setup-builddir。此外,还深入探讨了bitbake的源码执行流程,解析配置文件、任务调度以及构建过程。同时提供了一些使用Yocto的实用技巧。

yocto-poky

关键词: yocto poky

poky工程,结构分析,源码分析

主要内容:

  • poky
  • poky 环境配置脚本

文档参考:

最新文档 https://taotaodiy-yocto.readthedocs.io/en/latest/yocto/yocto-demo.html

yocto-taotaodiy

官方工程

源码分析 - 环境配置脚本

oe-init-build-env脚本

在这个脚本中,检查了脚本的启动,并运行oe-buildenv-internal和oe-setup-builddir。

# 检查脚本启动
if [ -n "$BASH_SOURCE" ]; then
    THIS_SCRIPT=$BASH_SOURCE
elif [ -n "$ZSH_NAME" ]; then
    THIS_SCRIPT=$0
else
    THIS_SCRIPT="$(pwd)/oe-init-build-env"
    if [ ! -e "$THIS_SCRIPT" ]; then
        echo "Error: $THIS_SCRIPT doesn't exist!" >&2
        echo "Please run this script in oe-init-build-env's directory." >&2
        exit 1
    fi
fi
if [ -n "$BBSERVER" ]; then
    unset BBSERVER
fi

if [ -z "$ZSH_NAME" ] && [ "$0" = "$THIS_SCRIPT" ]; then
    echo "Error: This script needs to be sourced. Please run as '. $THIS_SCRIPT'" >&2
    exit 1
fi

if [ -z "$OEROOT" ]; then
    OEROOT=$(dirname "$THIS_SCRIPT")
    OEROOT=$(readlink -f "$OEROOT")
fi
unset THIS_SCRIPT

# 运行脚本 oe-buildenv-internal 和 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"

oe-buildenv-internal

在这个脚本中进行变量检查,python版本检查,设置BUILDDIR、PATH、BB_ENV_EXTRAWHITE等变量

#检查变量
if ! $(return >/dev/null 2>&1) ; then
    echo 'oe-buildenv-internal: error: this script must be sourced'
    echo ''
    echo 'Usage: . $OEROOT/scripts/oe-buildenv-internal &&'
    echo ''
    echo 'OpenEmbedded oe-buildenv-internal - an internal script that is'
    echo 'used in oe-init-build-env to initialize oe build environment'
    echo ''
    exit 2
fi

# 当调用此函数时,假定已经定义了oeloot
if [ -z "$OEROOT" ]; then
    echo >&2 "Error: OEROOT is not defined!"
    return 1
fi

if [ -z "$OE_SKIP_SDK_CHECK" ] && [ -n "$OECORE_SDK_VERSION" ]; then
    echo >&2 "Error: The OE SDK/ADT was detected as already being present in this shell environment. Please use a clean shell when sourcing this environment script."
    return 1
fi

# 检查python版本
# 我们可能有一些代码在Python的旧版本中无法正确解析,与其修复它,并永远警惕任何其他新特性的使用,只需检查一下这里的版本。
py_v35_check=$(python3 -c 'import sys; print(sys.version_info >= (3,5,0))')
if [ "$py_v35_check" != "True" ]; then
    echo >&2 "BitBake requires Python 3.5.0 or later as 'python3 (scripts/install-buildtools can be used if needed)'"
    return 1
fi
unset py_v35_check

#设置BUILDDIR 默认build
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

        # 删除任何可能的尾部斜杠。这是用来解决ubuntu10.04中错误的readlink,它不忽略后面的斜杠,
        # 因此“readlink-f new_dir_to_be_created/”返回空值。
        BDIR=$(echo $BDIR | sed -re 's|/+$||')

        BDIR=$(readlink -f "$BDIR")
        if [ -z "$BDIR" ]; then
            PARENTDIR=$(dirname "$1")
            echo >&2 "Error: the directory $PARENTDIR does not exist?"
            return 1
        fi
    fi
    if [ -n "$2" ]; then
        BITBAKEDIR="$2"
    fi
fi
if [ "${BDIR#/}" != "$BDIR" ]; then
    BUILDDIR="$BDIR"
else
    BUILDDIR="$(pwd)/$BDIR"
fi
unset BDIR

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

if [ ! -d "$BITBAKEDIR" ]; then
    echo >&2 "Error: The bitbake directory ($BITBAKEDIR) does not exist!  Please ensure a copy of bitbake exists at this location or specify an alternative path on the command line"
    return 1
fi

# 确保我们的路径在 $PATH
for newpath in "$BITBAKEDIR/bin" "$OEROOT/scripts"; do
    # 移除任何$PATH中的$newpath
    PATH=$(echo $PATH | sed -re "s#(^|:)$newpath(:|$)#\2#g;s#^:##")

    # Add $newpath to $PATH
    PATH="$newpath:$PATH"
done
unset BITBAKEDIR newpath

# 导出变量 这些变量在runqemu脚本中使用
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_LOGCONFIG"

BB_ENV_EXTRAWHITE="$(echo $BB_ENV_EXTRAWHITE $BB_ENV_EXTRAWHITE_OE | tr ' ' '\n' | LC_ALL=C sort --unique | tr '\n' ' ')"

export BB_ENV_EXTRAWHITE

oe-setup-builddir

这个脚本主要是创建、配置/build/conf中的内容。
比如第一次会根据poky/meta-poky下的local.conf.sample生成/build/conf/local.conf。

我们可以将local.conf中 DL_DIR ?= “${TOPDIR}/downloads”
打开或者修改其内容,已配置编译时下载文件的目录,当我们有几个yocto工程时,就能共用一个downloads文件夹。

#检查目录
if [ -z "$BUILDDIR" ]; then
    echo >&2 "Error: The build directory (BUILDDIR) must be set!"
    exit 1
fi

if [ "$1" = '--help' -o "$1" = '-h' ]; then
    echo 'Usage: oe-setup-builddir'
    echo ''
    echo "OpenEmbedded setup-builddir - setup build directory $BUILDDIR"
    echo ''
    exit 2
fi

#创建conf
mkdir -p "$BUILDDIR/conf"

#检查BUILDDIR
if [ ! -d "$BUILDDIR" ]; then
    echo >&2 "Error: The builddir ($BUILDDIR) does not exist!"
    exit 1
fi

if [ ! -w "$BUILDDIR" ]; then
    echo >&2 "Error: Cannot write to $BUILDDIR, perhaps try sourcing with a writable path? i.e. . oe-init-build-env ~/my-build"
    exit 1
fi

#正在尝试从BUILDDIR,BUILDDIR/conf中删除粘性setuid位
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"

cd "$BUILDDIR"

#创建配置模板
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可以指向模板的目录 local.conf & bblayers.conf
#
if [ -n "$TEMPLATECONF" ]; then
    if [ ! -d "$TEMPLATECONF" ]; then
        # 允许TEMPLATECONF=meta xyz/conf作为快捷方式
        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

#检查conf下文件,生成(复制)local.conf bblayers.conf
unset SHOWYPDOC
if [ -z "$OECORELOCALCONF" ]; then
    OECORELOCALCONF="$OEROOT/meta/conf/local.conf.sample"
fi
if [ ! -r "$BUILDDIR/conf/local.conf" ]; then
    cat <<EOM
You had no conf/local.conf file. This configuration file has therefore been
created for you with some default values. You may wish to edit it to, for
example, select a different MACHINE (target hardware). See conf/local.conf
for more information as common configuration options are commented.

EOM
    cp -f $OECORELOCALCONF "$BUILDDIR/conf/local.conf"
    SHOWYPDOC=yes
fi

if [ -z "$OECORELAYERCONF" ]; then
    OECORELAYERCONF="$OEROOT/meta/conf/bblayers.conf.sample"
fi
if [ ! -r "$BUILDDIR/conf/bblayers.conf" ]; then
    cat <<EOM
You had no conf/bblayers.conf file. This configuration file has therefore been
created for you with some default values. To add additional metadata layers
into your configuration please add entries to conf/bblayers.conf.

EOM

    #把abocolute路径放到bblayers.conf,以便我们可以在第一次运行后运行bitbake而不使用init脚本
    #COREBASE已弃用,因为它的含义不一致,但为了兼容性,请继续替换它。
    sed -e "s|##OEROOT##|$OEROOT|g" \
        -e "s|##COREBASE##|$OEROOT|g" \
        $OECORELAYERCONF > "$BUILDDIR/conf/bblayers.conf"
    SHOWYPDOC=yes
fi

# 防止在同一控制台中干扰新的GIT克隆
unset OECORELOCALCONF
unset OECORELAYERCONF

# 正在结束首次运行消息。显示YP文档横幅。
if [ ! -z "$SHOWYPDOC" ]; then
    cat <<EOM
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/

EOM
#    unset SHOWYPDOC
fi

if [ -z "$OECORENOTESCONF" ]; then
    OECORENOTESCONF="$OEROOT/meta/conf/conf-notes.txt"
fi
[ ! -r "$OECORENOTESCONF" ] || cat $OECORENOTESCONF
unset OECORENOTESCONF

初始化相关的三个脚本主要是设置变量和配置,然后我们就可以开始构建系统了。

源码分析 - bitbake源码

bitbake core-image-sato 之后都做了些什么

https://docs.yoctoproject.org/bitbake/bitbake-user-manual/bitbake-user-manual-execution.html

BitBake首先在当前工作目录中搜索可选的conf/bblayers.conf配置文件,使用BBPATH变量定位文件。
该配置文件通常包含用于拉入任何其他元数据的指令,例如特定于体系结构、计算机、本地环境等的文件。

在解析配置文件之后,BitBake使用其基本的继承机制,即通过类文件来继承(include
INHERIT)一些标准类。
BitBake按顺序解析在中找到的任何附加文件BBFILES并制作一个基本配置的新副本,然后逐行分析配方。

食谱的解析完成时,BitBake产生该食谱定义的任务列表以及一组由键和值以及有关任务的依赖关系信息组成的数据,既由PN_PV组成的PROVIDES列表,

当BitBake开始构建时,会根据存储库中包含的软件包的PN_PV值在PROVIDES列表中找到该软件的软件包,再次解析该软件包的元数据(如计算校验和等)。

BitBake会根据首选项和依赖关系来准确计算该软件包需要运行哪些任务以及以什么顺序运行它们。

再然后BitBake会开启多个线程,交叉构建。

任务运行完毕,就会产生我们需要的image

源码分析 - bitbake函数

yocto tips

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贪贪贪丶慎独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值