oe-init-build-env脚本详解#!/bin/sh# OE Build Environment Setup Script## Copyright (C) 2006-2011 Linux Foundation## SPDX-License-Identifier: GPL-2.0-or-later### Normally this is called as . ./oe-init-build-env builddir## This works in most shells (not dash), but not all of them pass the arguments# when being sourced. To workaround the shell limitation use set builddir# prior to sourcing this script.## # OpenEmbedded 构建环境初始化脚本# 此脚本必须通过 source 命令执行否则环境设置会失效# 正确用法: . ./oe-init-build-env [builddir]# 或: source oe-init-build-env [builddir]# # 在BASH和ZSH两种环境中获取脚本路径如果获取到将值赋予THIS_SCRIPT否则THIS_SCRIPT为pwd路径加# 上oe-init-build-env此处强制文件名必须为oe-init-build-envif[-n$BASH_SOURCE];thenTHIS_SCRIPT$BASH_SOURCEelif[-n$ZSH_NAME];thenTHIS_SCRIPT$0elseTHIS_SCRIPT$(pwd)/oe-init-build-envif[!-e$THIS_SCRIPT];thenechoError:$THIS_SCRIPTdoesnt exist!2echoPlease run this script in oe-init-build-envs directory.2exit1fifi# # 清除之前存在的 BBSERVER 变量# BBSERVER 是 BitBake 服务器的环境变量清除它确保使用本地构建# 避免与远程构建服务器冲突# # 检查BBSERVER环境变量是否已设置如果已设置非空则将其删除if[-n$BBSERVER];thenunsetBBSERVERfi# 检测环境是否为ZSH,并且检测执行方式是否为source,在非 Zsh 环境中如果脚本被直接执行而非 source则报错# 检测的目的是脚本必须要source执行 不能直接./***.sh执行如果直接执行例如 ./script.sh脚本会在子进程中运行所有环境修改在脚本退出后丢失if[-z$ZSH_NAME][$0$THIS_SCRIPT];thenechoError: This script needs to be sourced. Please run as .$THIS_SCRIPT2exit1fi# 检查OEROOT是否已设置如果已设置则使用现有值否则设置OEROOT为脚本当前所在路径获取OEROOT的绝对路径完成后 清理临时变量THIS_SCRIPTif[-z$OEROOT];thenOEROOT$(dirname$THIS_SCRIPT)OEROOT$(readlink-f$OEROOT)fiunsetTHIS_SCRIPT# 将OEROOT设置为环境变量使子进程可以访问exportOEROOT# # 执行顺序# 1. oe-buildenv-internal: 设置基础环境变量和函数# 2. oe-setup-builddir: 设置构建目录配置# TEMPLATECONF 允许用户指定自定义配置模板# 如果未设置会使用默认的 meta-poky/conf/templates/default/# # 使用. $OEROOT/scripts/oe-buildenv-internal命令执行该脚本如果成功执行设置命令传递TEMPLATECONF变量如果失败执行错误处理最后清理OEROOT临时变量.$OEROOT/scripts/oe-buildenv-internalTEMPLATECONF$TEMPLATECONF$OEROOT/scripts/oe-setup-builddir||{unsetOEROOTreturn1}unsetOEROOT# 判断BUILDDIR是否为空如果不为空 切换到BUILD目录下[-z$BUILDDIR]||cd$BUILDDIR这个oe-init-build-env脚本是poky的构建脚本 如果用户需要构建自己的层 需要设置TEMPLATECONF变量OEROOT变量为oe-init-build-env构建脚本所在路径oe-buildenv-internal脚本详解#!/bin/sh# OE-Core Build Environment Setup Script## Copyright (C) 2006-2011 Linux Foundation## SPDX-License-Identifier: GPL-2.0-or-later## 这段代码更严格的检测了脚本是否被source执行return命令只在函数或 source的脚本中有效在普通脚本中return会返回错误非零退出码在 source 环境中return是有效的会返回成功0如果 return失败 → 条件为真 → 执行 if 块报错# oe-buildenv-internal脚本必须被 source执行因为需要修改当前 shell 环境如果直接执行脚本在子进程中运行所有 export命令只影响子进程脚本退出后所有环境变更丢失用户无法使用设置的构建环境if!$(return/dev/null21);thenechooe-buildenv-internal: error: this script must be sourcedechoechoUsage: . $OEROOT/scripts/oe-buildenv-internal echoechoOpenEmbedded oe-buildenv-internal - an internal script that isechoused in oe-init-build-env to initialize oe build environmentechoexit2fi# It is assumed OEROOT is already defined when this is called# 检查 OEROOT环境变量是否已正确定义脚本依赖 OEROOToe-buildenv-internal脚本需要知道 OpenEmbedded 核心层的根目录位置if[-z$OEROOT];thenecho2Error: OEROOT is not defined!return1fi# 这段代码是 检测当前 shell 是否已经处于 OE SDK/ADT 环境中的验证。这是为了防止嵌套或污染构建环境# OE_SKIP_SDK_CHECK这个变量是设置是否进行嵌套构建环境检测 OE_SKIP_SDK_CHECK值为空时检测OECORE_SDK_VERSION是否为空如果是非空的则报错如果OE_SKIP_SDK_CHECK设置为非空则跳过这段检测代码if[-z$OE_SKIP_SDK_CHECK][-n$OECORE_SDK_VERSION];thenecho2Error: The OE SDK/ADT was detected as already being present in this shell environment. Please use a clean shell when sourcing this environment script.return1fi# We potentially have code that doesnt 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.# 检查 Python 3 版本是否满足要求需要python版本大于或等于3.5.0py_v35_check$(python3-cimport sys;print(sys.version_info(3,5,0)))if[$py_v35_check!True];thenecho2BitBake requires Python 3.5.0 or later as python3 (scripts/install-buildtools can be used if needed)return1fiunsetpy_v35_check# 判断BDIR是否已被配置如果已配置使用原有值否则使用参数1若参数1不存在 使用build 设置BDIR为build的绝对路径if[-z$BDIR];thenif[-z$1];thenBDIRbuildelseBDIR$1if[$BDIR/];thenecho2Error: / is not supported as a build directory.return1fi# Remove any possible trailing slashes. This is used to work around# buggy readlink in Ubuntu 10.04 that doesnt ignore trailing slashes# and hence readlink -f new_dir_to_be_created/ returns empty.BDIR$(echo$BDIR|sed-res|/$||)BDIR$(readlink-f$BDIR)if[-z$BDIR];thenPARENTDIR$(dirname$1)echo2Error: the directory$PARENTDIRdoes not exist?return1fifi# 处理第二个参数第二个参数用于指定 BitBake 的安装目录if[-n$2];thenBITBAKEDIR$2fifi# 将BDIR转化为绝对路径赋值给BUILDDIR清理临时变量BDIR值保留BUILDDIR作为构建目录变量if[${BDIR#/}!$BDIR];thenBUILDDIR$BDIRelseBUILDDIR$(pwd)/$BDIRfiunsetBDIR# 确定 BitBake 工具目录路径# 检查是否已设置 BITBAKEDIRif[-z$BITBAKEDIR];thenBITBAKEDIR$OEROOT/bitbake$BBEXTRAtest-d$BITBAKEDIR||BITBAKEDIR$OEROOT/../bitbake$BBEXTRAfiBITBAKEDIR$(readlink-f$BITBAKEDIR)BUILDDIR$(readlink-f$BUILDDIR)BBPATH$BUILDDIRexportBBPATHif[!-d$BITBAKEDIR];thenecho2Error: 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 linereturn1fi# Add BitBakes library to PYTHONPATHPYTHONPATH$BITBAKEDIR/lib:$PYTHONPATHexportPYTHONPATH# Make sure our paths are at the beginning of $PATHfornewpathin$BITBAKEDIR/bin$OEROOT/scripts;do# Remove any existences of $newpath from $PATHPATH$(echo$PATH|sed-res#(^|:)$newpath(:|$)#\2#g;s#^:##)# Add $newpath to $PATHPATH$newpath:$PATHdoneunsetBITBAKEDIR newpath# Used by the runqemu scriptexportBUILDDIRexportPATHBB_ENV_PASSTHROUGH_ADDITIONS_OEMACHINE 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_LOGCONFIGBB_ENV_PASSTHROUGH_ADDITIONS$(echo$BB_ENV_PASSTHROUGH_ADDITIONS $BB_ENV_PASSTHROUGH_ADDITIONS_OE|tr \n|LC_ALLCsort--unique|tr\n )exportBB_ENV_PASSTHROUGH_ADDITIONSoe-setup-builddir 脚本详解#!/bin/sh# OE Build Environment Setup Script## Copyright (C) 2006-2011 Linux Foundation## SPDX-License-Identifier: GPL-2.0-or-later## 检查 BUILDDIR 是否已设置if[-z$BUILDDIR];thenecho2Error: The build directory (BUILDDIR) must be set!exit1fi# 处理帮助参数if[$1--help-o$1-h];thenechoUsage: oe-setup-builddirechoechoOpenEmbedded setup-builddir - setup build directory$BUILDDIRechoexit2fi# 确保构建目录存在#验证目录创建成功mkdir-p$BUILDDIR/confif[!-d$BUILDDIR];thenecho2Error: The builddir ($BUILDDIR) does not exist!exit1fi# 检查写权限确保当前用户有写权限if[!-w$BUILDDIR];thenecho2Error: Cannot write to$BUILDDIR, perhaps try sourcing with a writable path? i.e. . oe-init-build-env ~/my-buildexit1fi# Attempting removal of sticky,setuid bits from BUILDDIR, BUILDDIR/conf# 尝试移除特殊权限位chmod-st$BUILDDIR2/dev/null||echoWARNING: unable to chmod$BUILDDIRchmod-st$BUILDDIR/conf2/dev/null||echoWARNING: unable to chmod$BUILDDIR/conf# 切换到构建目录cd$BUILDDIR# 读取已保存的模板配置if[-f$BUILDDIR/conf/templateconf.cfg];thenTEMPLATECONF$(cat$BUILDDIR/conf/templateconf.cfg)fi# 执行全局模板配置.$OEROOT/.templateconf# 保存模板配置if[!-f$BUILDDIR/conf/templateconf.cfg];thenecho$TEMPLATECONF$BUILDDIR/conf/templateconf.cfgfi## $TEMPLATECONF can point to a directory for the template local.conf bblayers.conf## 验证和设置模板路径if[-n$TEMPLATECONF];thenif[!-d$TEMPLATECONF];then# Allow TEMPLATECONFmeta-xyz/conf as a shortcutif[-d$OEROOT/$TEMPLATECONF];thenTEMPLATECONF$OEROOT/$TEMPLATECONFfiif[!-d$TEMPLATECONF];thenecho2Error: TEMPLATECONF value points to nonexistent directory $TEMPLATECONFexit1fifiOECORELAYERCONF$TEMPLATECONF/bblayers.conf.sampleOECORELOCALCONF$TEMPLATECONF/local.conf.sampleOECORENOTESCONF$TEMPLATECONF/conf-notes.txtfi# 初始化 SHOWYPDOC 变量如果没有自定义模板使用默认的 local.conf.sampleunsetSHOWYPDOCif[-z$OECORELOCALCONF];thenOECORELOCALCONF$OEROOT/meta/conf/local.conf.samplefi# 检查并创建 local.conf如果 local.conf不存在显示帮助信息从模板复制创建设置 SHOWYPDOC标志稍后显示文档链接if[!-r$BUILDDIR/conf/local.conf];thencatEOM You had no conf/local.conf file. This configuration file has therefore been created for you from$OECORELOCALCONFYou 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.confSHOWYPDOCyesfi# 设置默认的层配置模板if[-z$OECORELAYERCONF];thenOECORELAYERCONF$OEROOT/meta/conf/bblayers.conf.samplefi# 检查并创建 bblayers.confif[!-r$BUILDDIR/conf/bblayers.conf];thencatEOM You had no conf/bblayers.conf file. This configuration file has therefore been created for you from$OECORELAYERCONFTo add additional metadata layers into your configuration please add entries to conf/bblayers.conf. EOM# Put the absolute path to the layers in bblayers.conf so we can run# bitbake without the init script after the first run.# ##COREBASE## is deprecated as its meaning was inconsistent, but continue# to replace it for compatibility.sed-es|##OEROOT##|$OEROOT|g\-es|##COREBASE##|$OEROOT|g\$OECORELAYERCONF$BUILDDIR/conf/bblayers.confSHOWYPDOCyesfi# Prevent disturbing a new GIT clone in same console# 清理临时变量unsetOECORELOCALCONFunsetOECORELAYERCONF# Ending the first-time run message. Show the YP Documentation banner.# 显示首次运行的文档信息if[!-z$SHOWYPDOC];thencatEOM The Yocto Project has extensive documentation about OE including a reference manual which can be found at: https://docs.yoctoproject.org For more information about OpenEmbedded see the website: https://www.openembedded.org/ EOM# unset SHOWYPDOCfi# 显示配置说明if[-z$OECORENOTESCONF];thenOECORENOTESCONF$OEROOT/meta/conf/conf-notes.txtfi[!-r$OECORENOTESCONF]||cat$OECORENOTESCONFunsetOECORENOTESCONF总结通过这三个脚本yocto完成了最开始的环境变量设置配置模板生成和构建环境检测