1 首先,脚本先对运行方式进行了检测:

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

这个目的,就是强制OEROOT/scripts/oe-buildenv-internal以“. $OEROOT/scripts/oe-buildenv-internal”的方式运行,避免以直接执行$OEROOT/scripts/oe-buildenv-internal的方式运行,也就是希望脚本执行过程中对于环境的一些改变能够在当前shell保存下来。

2 接下来需要检测OEROOT环境变量,从本系列分享的第一章,可以得知,OEROOT即为poky-sumo-19.0.0目录:

if [ -z "$OEROOT" ]; then
echo >&2 "Error: OEROOT is not defined!"
return 1
fi

3 检测当前shell是否已经包含OE SDK/ADT环境变量:

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

在缺省情况下,OE_SKIP_SDK_CHECK为空,OECORE_SDK_VERSION为空,在这里条件是不满足的,脚本将继续后面的动作。

4 检测python2版本是否为2.7以上,但不能是3.x:

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

5 继续检测python2版本,必须是2.7.3以上,这次是在语言级别上检测:

y_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

6 继续检测python3版本,bitbake需要python3.4以上版本:

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

7 设置BUILDDIR以及BITBAKEDIR,参数1为空时BUILDDIR为“build”,否则BUILDDIR为参数1,参数2不为空时,BITBAKEDIR设置为参数2,参数2为空时BITBAKE指向"$OEROOT/bitbake$BBEXTRA"或者"$OEROOT/../bitbake$BBEXTRA":

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")
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

8 设置PATH,BB_ENV_EXTRAWHITE环境变量:

# 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

那么参照本系列分享第一章中对该脚本的调用:

export OEROOT
. $OEROOT/scripts/oe-buildenv-internal &&
TEMPLATECONF="$TEMPLATECONF" $OEROOT/scripts/oe-setup-builddir || {
unset OEROOT
return 1
}

脚本最后的几个重要环境变量变更为:

  BUILDDIR: poky-sumo-19.0.0/build-arm64

  BITBAKEDIR:

  PATH:poky-sumo-19.0.0/scripts:poky-sumo-19.0.0/bitbake/bin:/home/totem/bin:/home/totem/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

其中$1为build-arm64,为第一章中". oe-init-build-env build-arm64"中的$1,因为$2为空,另外两个目录亦不存在,故BITBAKEDIR为空。

yocto-sumo源码解析(二): oe-buildenv-internal的更多相关文章

  1. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  2. RxJava2源码解析(二)

    title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...

  3. Sentinel源码解析二(Slot总览)

    写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...

  4. iOS即时通讯之CocoaAsyncSocket源码解析二

    原文 前言 本文承接上文:iOS即时通讯之CocoaAsyncSocket源码解析一 上文我们提到了GCDAsyncSocket的初始化,以及最终connect之前的准备工作,包括一些错误检查:本机地 ...

  5. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  6. Common.Logging源码解析二

    Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...

  7. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  8. element-ui 源码解析 二

    Carousel 走马灯源码解析 1. 基本原理:页面切换 页面切换使用的是 transform 2D 转换和 transition 过渡 可以看出是采用内联样式来实现的 举个栗子 <div : ...

  9. ArrayList源码解析(二)

    欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 自己学习ArrayList源码的一些心得记录. 继续上一篇,Arra ...

  10. React的Component,PureComponent源码解析(二)

    1.什么是Component,PureComponent? 都是class方式定义的基类,两者没有什么大的区别,只是PureComponent内部使用shouldComponentUpdate(nex ...

随机推荐

  1. 【爬坑】运行 Hadoop 的 MapReduce 示例卡住了

    1. 问题说明 在以伪分布式模式运行 Hadoop 自带的 MapReduce 示例,卡在了 Running job ,如图所示 2. 解决过程 查看日志没得到有用的信息 再次确认配置信息没有错误信息 ...

  2. 读高性能JavaScript编程 第三章

    第三章  DOM Scripting  最小化 DOM 访问,在 JavaScript 端做尽可能多的事情. 在反复访问的地方使用局部变量存放 DOM 引用. 小心地处理 HTML 集合,因为他们表现 ...

  3. 复杂json的解析:jsonobject与jsonArray的使用

    String parameter = { success : 0, errorMsg : "错误消息", data : { total : "总记录数", ro ...

  4. 用ASP.NET Web API技术开发HTTP接口

    开发工具 Visual Studio 2013 SQL Server 2008 R2 准备工作 启动Visual Studio 2013,新建一个ASP.NET Web应用程序,命名为SimpleAP ...

  5. 微信发红包 PHP 实现

    最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https ...

  6. MetaMask/metamask-extension-provider

    用来探测你的浏览器中有没有安装metamask插件 https://github.com/MetaMask/metamask-extension-provider MetaMask Extension ...

  7. Pyspider抓取静态页面

    近期,我想爬一批新闻资讯的内容.新闻类型的网址很多,我想看看有没有一个网页上能包罗尽可能多的新闻网站呢,于是就发现了下面这个网页 http://news.hao123.com/wangzhi 这个页面 ...

  8. ping和telnet

    ping命令 验证IP的可达性 本地ping虚拟机中的ip地址: telnet命令 验证服务的可用性,某个端口是否打开 连接到服务器的端口上: 几种场景: (1)ping通,telnet不行 ip地址 ...

  9. Block abstraction view(Create & Reference)

    在hierarchical design 中,一般需要调用 hard macro,top调用 macro 的方法有多种: 1. 调用macro对应的db 2. 调用 macro 的 ilm 模型(20 ...

  10. Python2.7-Queue

    Queue 模块,python3中为queue,一般和threading模块同时使用,用于处理多任务队列,模块定义了3种队列类,先进先出(FIFO),后进先出(LIFO),优先级队列 Queue.Qu ...