yocto-poky

关键词: yocto poky

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

主要内容:

  • poky
  • poky 环境配置脚本

文档参考:

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

官方工程

源码分析 - 环境配置脚本

oe-init-build-env脚本

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

# 检查脚本启动
if [ -n "$BASH_SOURCE" ]; thenTHIS_SCRIPT=$BASH_SOURCE
elif [ -n "$ZSH_NAME" ]; thenTHIS_SCRIPT=$0
elseTHIS_SCRIPT="$(pwd)/oe-init-build-env"if [ ! -e "$THIS_SCRIPT" ]; thenecho "Error: $THIS_SCRIPT doesn't exist!" >&2echo "Please run this script in oe-init-build-env's directory." >&2exit 1fi
fi
if [ -n "$BBSERVER" ]; thenunset BBSERVER
fiif [ -z "$ZSH_NAME" ] && [ "$0" = "$THIS_SCRIPT" ]; thenecho "Error: This script needs to be sourced. Please run as '. $THIS_SCRIPT'" >&2exit 1
fiif [ -z "$OEROOT" ]; thenOEROOT=$(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 OEROOTreturn 1
}
unset OEROOT[ -z "$BUILDDIR" ] || cd "$BUILDDIR"

oe-buildenv-internal

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

#检查变量
if ! $(return >/dev/null 2>&1) ; thenecho '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" ]; thenecho >&2 "Error: OEROOT is not defined!"return 1
fiif [ -z "$OE_SKIP_SDK_CHECK" ] && [ -n "$OECORE_SDK_VERSION" ]; thenecho >&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" ]; thenecho >&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" ]; thenif [ -z "$1" ]; thenBDIR="build"elseBDIR="$1"if [ "$BDIR" = "/" ]; thenecho >&2 "Error: / is not supported as a build directory."return 1fi# 删除任何可能的尾部斜杠。这是用来解决ubuntu10.04中错误的readlink,它不忽略后面的斜杠,# 因此“readlink-f new_dir_to_be_created/”返回空值。BDIR=$(echo $BDIR | sed -re 's|/+$||')BDIR=$(readlink -f "$BDIR")if [ -z "$BDIR" ]; thenPARENTDIR=$(dirname "$1")echo >&2 "Error: the directory $PARENTDIR does not exist?"return 1fifiif [ -n "$2" ]; thenBITBAKEDIR="$2"fi
fi
if [ "${BDIR#/}" != "$BDIR" ]; thenBUILDDIR="$BDIR"
elseBUILDDIR="$(pwd)/$BDIR"
fi
unset BDIRif [ -z "$BITBAKEDIR" ]; thenBITBAKEDIR="$OEROOT/bitbake$BBEXTRA"test -d "$BITBAKEDIR" || BITBAKEDIR="$OEROOT/../bitbake$BBEXTRA"
fiBITBAKEDIR=$(readlink -f "$BITBAKEDIR")
BUILDDIR=$(readlink -f "$BUILDDIR")
BBPATH=$BUILDDIRexport BBPATHif [ ! -d "$BITBAKEDIR" ]; thenecho >&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中的$newpathPATH=$(echo $PATH | sed -re "s#(^|:)$newpath(:|$)#\2#g;s#^:##")# Add $newpath to $PATHPATH="$newpath:$PATH"
done
unset BITBAKEDIR newpath# 导出变量 这些变量在runqemu脚本中使用
export BUILDDIR
export PATHBB_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" ]; thenecho >&2 "Error: The build directory (BUILDDIR) must be set!"exit 1
fiif [ "$1" = '--help' -o "$1" = '-h' ]; thenecho '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" ]; thenecho >&2 "Error: The builddir ($BUILDDIR) does not exist!"exit 1
fiif [ ! -w "$BUILDDIR" ]; thenecho >&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" ]; thenTEMPLATECONF=$(cat "$BUILDDIR/conf/templateconf.cfg")
fi. $OEROOT/.templateconfif [ ! -f "$BUILDDIR/conf/templateconf.cfg" ]; thenecho "$TEMPLATECONF" >"$BUILDDIR/conf/templateconf.cfg"
fi#
# $TEMPLATECONF可以指向模板的目录 local.conf & bblayers.conf
#
if [ -n "$TEMPLATECONF" ]; thenif [ ! -d "$TEMPLATECONF" ]; then# 允许TEMPLATECONF=meta xyz/conf作为快捷方式if [ -d "$OEROOT/$TEMPLATECONF" ]; thenTEMPLATECONF="$OEROOT/$TEMPLATECONF"fiif [ ! -d "$TEMPLATECONF" ]; thenecho >&2 "Error: TEMPLATECONF value points to nonexistent directory '$TEMPLATECONF'"exit 1fifiOECORELAYERCONF="$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" ]; thenOECORELOCALCONF="$OEROOT/meta/conf/local.conf.sample"
fi
if [ ! -r "$BUILDDIR/conf/local.conf" ]; thencat <<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.EOMcp -f $OECORELOCALCONF "$BUILDDIR/conf/local.conf"SHOWYPDOC=yes
fiif [ -z "$OECORELAYERCONF" ]; thenOECORELAYERCONF="$OEROOT/meta/conf/bblayers.conf.sample"
fi
if [ ! -r "$BUILDDIR/conf/bblayers.conf" ]; thencat <<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" ]; thencat <<EOM
The Yocto Project has extensive documentation about OE including a reference
manual which can be found at:http://yoctoproject.org/documentationFor more information about OpenEmbedded see their website:http://www.openembedded.org/EOM
#    unset SHOWYPDOC
fiif [ -z "$OECORENOTESCONF" ]; thenOECORENOTESCONF="$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

yocto-poky相关推荐

  1. [yocto]poky环境搭建和基本概念

    poky本地搭建 环境搭建 source oe-init-build-env <builddir> 后面的参数可以忽略.该脚本主要用来设置构建环境的目录结构和初始化核心集合的配置文件 脚本 ...

  2. yocto,poky,qemu

    Yocto ,(本意Yocto是最小的计量单位,幺(科托),10^-24[1])是一个开源社区.它通过提供模版.工具和方法帮助开发者创建基于linux内核的定制系统,支持ARM, PPC, MIPS, ...

  3. Yocto Poky OpenEmbeded之间的关系

    总结: 1. Yocto 项目是一个包含大量"嵌入式linux" 组件的集合体 2.Poky是Yocto的其中一个特殊的组件,用于构建一个完整的嵌入式系统,可以称之为Yocto的& ...

  4. Yocto开发篇 | Ubuntu构建与体验Poky发行版(Yocto 3.1版本)

    一.开发环境要求 50GB空闲磁盘空间(最好还剩余100GB以上) Git 1.8.3.1以上版本 tar 1.28以上版本 Python 3.5.0以上版本 gcc 5.0以上版本 二.安装依赖 $ ...

  5. Yocto Issues | The TMPDIR: /home12/calm.xia/poky/qemuarm/tmp can't be located on nfs.

    文章目录 [背景] [报错] [分析] [解决办法] 总结思考: [背景] 最近工作要学习Yocto,之前没有了解过,想跟着经典书<Embedded Linux Development usin ...

  6. 嵌入式linux之yocto(五)拓展核心镜像

    1. 参考 yocto官网 微信读书: 嵌入式Linxu系统开发:基于Yocto Project. 使用菜谱拓展核心镜像,方便维护项目. 测试平台: qemux86-64 2. 创建层 命令 作用 b ...

  7. 利用Yocto构建嵌入式Linux教程3_1--Yocto构建系统的配置文件

    本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 (LTS),图中所有示例为实际测试截图,有问题请给我留言.微信公众号: 嵌入式Linux那些事儿 1 Yoc ...

  8. Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! ...

  9. 嵌入式linux之yocto(六)devtool往返开发

    1. 参考 yocto官方文档-devtool 微信读书:嵌入式Linux系统开发:基于Yocot Project 书中对于devtool讲解较少,官方文档对devtool的工作流和使用方法较为详细. ...

  10. yocto编译linux,好实用!用 Yocto 在 Ubuntu 上创建最小化 Linux 发行版

    导读 本文主要聚焦在如何使用 Yocto 在 Ubuntu 上创建一个最小化的 Linux 发行版.Yocto 项目在嵌入式 Linux 的世界非常著名,这是因为它用起来非常灵活.方便.Yocto 的 ...

最新文章

  1. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
  2. sphinx+coreseek创建中文分词索引
  3. 全民app使用率排行榜统计全了,微信再次位居榜首!
  4. 阿里员工 1 天有 26 个小时,怎么回事?
  5. mysql中模糊查询的四种用法
  6. 在java中使用关键字导入包_java中import关键字的使用方法
  7. python查询字符串是否包含某字符串_python 判断检测字符串中是否包含指定字符或字符串(比如:?)...
  8. Dynamics版本历史演进及Dynamics 365重要功能介绍
  9. mysql 管理instance_对于多instance安装的MYSQL来说,起停的过程相对复杂,可以定义一些简单的脚本来简化日常的管理。1# 环境变量脚本[mysql@mysql01 scri...
  10. LintCode 69---二叉树的层次遍历
  11. 骁龙8性能巅峰旗舰!黑鲨5系列获3C认证:配备120W快充
  12. python登录验证_Python第一天-----简单登录验证
  13. Dell台式机重装win 10系统之后开机报错
  14. funcode seafish
  15. dll侧加载_Win7系统开机弹出模块xxx.dll已加载但找不到接入口DLLRegisterServer的原因及解决方法...
  16. 阿里云盘来了,百度网盘VS阿里云盘,你更看好谁!
  17. 华为中国生态伙伴大会2019盛大开幕:智能进化 共赢生态未来
  18. BigDecimal非负数判断
  19. 再谈Qt实现Rasdial拨号问题(说说项目中遇到的问题和解决方案)
  20. html文字多余部分三个点,解决特殊符号和字母换行问题

热门文章

  1. java 面向对象三大特性之封装 万字详解(超详细)
  2. Linux 灾难恢复
  3. Havel-Hakimi定理(判断一个度序列是否可图)
  4. 黑盒、白盒、灰盒测试
  5. 从罗永浩进军AR聊开
  6. 真无线蓝牙耳机盘点,2020新款游戏低延迟高续航蓝牙耳机
  7. 大麦票夹:从工具到服务的技术演进之路
  8. 原生拨号盘 语音搜索按钮隐藏,点击搜索框退出后语音搜索按钮出现但点击无反应
  9. ElasticSearch ingest-geoip插件
  10. Python提取多张excel表上的数据,合并汇总到一张新表