Linaro ABE(高级构建环境)构建GNU交叉工具链
Posted chocolate2018
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linaro ABE(高级构建环境)构建GNU交叉工具链相关的知识,希望对你有一定的参考价值。
Linaro ABE(高级构建环境)构建GNU交叉工具链
Abe是Linaro使用的现有Cbuildv1系统的一个bourne shell重写。当Abe以Linaro的方式做事时,其他人只需重新配置Abe就可以使用它。
配置Abe:
虽然可以从Abe的源代码树运行它,但不推荐这样做。最佳实践是创建一个新的构建目录,并在该目录中配置Abe。这使得更改分支甚至删除子目录变得很容易。所有路径都有def默认值,即在运行配置的相同目录下创建它们。
Abe需要几个目录。这些是:
- local snapshots - 这是所有下载的资源存储。默认为快照下的当前目录。
- local build - 这是所有可执行文件构建的地方。默认情况下,构建文件将放在顶层目录中,该目录是构建机器的完整主机名。在此目录下,将为目标体系结构创建一个目录。
- remote snapshot - 这是存储远程tarball的地方。当前默认为abe.validation.linaro.org,一般公众可以通过HTTP访问它。
如果不带任何参数执行configure。使用默认值。在配置时也可以更改这些值。例如:
$ABE-PATH/configure
--with-local-snapshots=$ABE_PATH/snapshots
--with-local-builds=$ABE-PATH/destdir
--with-remote-snapshots=abe@toolchain64.lab:/home/abe/var/snapshots/
这将更改3个主要路径,包括将远程主机更改为使用rsync或ssh来下载tarball,而不是HTTP。您可以执行./configure——help来获取配置时间参数的完整列表。
configure进程生成一个带有默认设置的host.conf文件。abe在运行时读取这个文件,因此可以更改这些值并重新运行abe.sh来使用新的值。每个工具链组件也有一个配置文件。默认版本会在构建时复制到构建树中。也可以编辑这个文件(通常称为gcc.conf之类的文件)来更改配置组件时使用的工具链组件特定值。
通过查看配置时生成的config.log文件的顶部,您可以看到用于配置每个组件的值。例如:
head ${hostname}/${target}/${component}/config.log
默认的行为:
有一些行为可能不太明显,因此这里对它们进行了记录。一个与GCC构建有关。当本机构建时,GCC只构建自己一次,并且功能齐全。交叉编译时,工作方式不同。没有sysroot就无法构建功能完整的GCC,因此构建了一个最小的编译器来构建C库。这叫做阶段1。然后将其用于编译C库。安装了这个库后,就可以构建GCC的第2阶段了。
当使用“all”选项——build构建整个工具链时,所有组件都是按照正确的顺序构建的,包括两个GCC阶段。可以指定只构建GCC,在这种情况下,如果没有安装C库,则使用stage1配置标志。如果安装了C库,则使用stage2标志。会显示一条消息来记录自动配置决策。
指定源是这样的:
可以指定一个完整的tarball名称,减去压缩部分,这将是动态找到的。如果提供的名称中出现了单词“tar”,则只在远程目录中查找它。如果该ame是bzr、sv、http或git的URL,则将使用适当的源代码控制系统从远程存储库签出源代码。
$ABE-PATH/configure
--with-local-snapshots=$ABE_PATH/snapshots
--with-local-builds=$ABE-PATH/destdir
--with-remote-snapshots=abe@toolchain64.lab:/home/abe/var/snapshots/
这将更改3个主要路径,包括将远程主机更改为使用rsync或ssh来下载tarball,而不是HTTP。您可以执行./configure——help来获取配置时间参数的完整列表
也可以指定一个“别名”,例如…“gcc - 4.8”。在这种情况下,首先检查远端快照目录。如果名称不是唯一的,但找到了匹配项,并生成错误。如果根本没有找到该名称,那么将从sources.conf文件中提取源存储库的URL,并检出代码。
有几种方法可以列出可用的文件。有两个可以下载的文件的主远程目录。这些都是“快照”或“基础设施”。基础架构通常只在每个主机上安装一次,并且包含构建GCC所需的其他包,比如gmp。快照是所有源tarball的主要位置。要列出所有可用的快照,可以执行
"abe.sh --list snapshots"。
要构建特定组件,请使用——build选项来abe。target选项也用于交叉构建。例如:
"abe.sh --target arm-linux-gnueabihf gcc-linaro-4.8.2013.07-1"
这将获取此发行版的源代码tarball,构建需要编译的任何东西,例如binutils,然后构建这些源代码。也可以指定到源存储库的URL。例如:
"abe.sh --target arm-linux-gnueabihf git://git.linaro.org/toolchain/eglibc.git"
要构建一个完整的交叉工具链,最简单的方法是让abe控制所有步骤。虽然也可以单独执行每一步。要构建完整的工具链,可以这样做:
"abe.sh --target arm-linux-gnueabihf --build all"
Older NOTES
x86_64-linux-gnu
arm-linux-gnueabi
arm-linux-gnueabihf
armeb-linux-gnueabihf
aarch64-linux-gnu
aarch64-none-elf
aarch64_be-none-elf
aarch64_be-linux-gnu
工具链组件
* gcc (gcc, g++, objc, fortran)
* gas
* ld (gold)
* libc (newlib,eglibc,glibc)
* dependant libs (gmp, mpc, mpfr)
使用现成的Ubuntu工具链构建
* Linaro GCC Maintenance (currently Linaro GCC 4.7)
* FSF GCC Previous (currently FSF GCC 4.7)
* FSF GCC Current (currently FSF GCC 4.8)
构建trunk/master
* Linaro GCC Development (currently Linaro GCC 4.8)
* FSF GCC Trunk (currently FSF GCC 4.9)
变量
*构建所有组件的主机工具链版本(gcc、gas、ld、libc)
*配置选项
特征:
*使用下载的二进制文件构建或在本地构建它们
*具有所有组件的默认配置
*所有记录到SQL数据库的信息
*能够混合和匹配所有工具链组件
*本地或远程测试
*为LAVA排队工作
*列出可能的版本和组件构建
Abe命令行参数:
- –build (构建机器的架构,默认为本机)
- –target (目标机器的体系结构,默认为本机)
- –snapshots XXX (远程主机或本地目录的URL)
- –libc {newlib,eglibc,glibc} (C库使用)
- –list {gcc,binutils,libc} (列出组件版本的可能值)
- –set {gcc,binutils,libc,latest}=XXX (更改配置文件设置)
- –binutils (使用的binutils版本,默认$PATH)
- –gcc (使用的gcc版本,默认$PATH)
- –config XXX (备用配置文件)
- –clean (清除之前的构建,默认是从它离开的地方开始)
- –dispatch (运行在LAVA建造农场,可能是远程)
- –sysroot XXX (指定替代sysroot的路径)
总体思路
使用shell脚本作为配置文件ala *.conf,设置全局变量或自定义函数。避免冲突的良好命名约定很重要。它应该能够从远程主机下载。
它应该使用bourne shell脚本来实现更多的功能,而不是Makefiles。android和Chromium都使用这种技术。
每个需要构建的项目都应该有一个列出主要构建时依赖项的文件。所有目标都应该有默认值,但是值可以用本地配置文件覆盖。配置数据也可能存在于数据库中。每个构建和测试运行的配置数据都被记录到数据库中。
交叉编译G++非常复杂,编译器有一个第一阶段的编译,它只用于编译C库。然后编译C库。之后就可以构建G++了。
分析
主要目标是获得适当的数据,以支持以各种方式绘制图表,以帮助更好地理解每个工具链组件的质量。这将帮助开发人员确定他们的更改是提高了还是降低了组件的质量。这也将允许其他人获得每个组件质量的概述,这将支持产品发布和管理计划。
*在所有支持的平台上绘制组件特定版本的测试运行
*在所有支持的平台上绘制组件的测试用例
*在版本列表中绘制组件的测试用例
*在所有支持的平台上绘制组件的通过百分比
*在所有支持的平台和多个版本中绘制组件的通过百分比。
*在所有支持的平台上绘制组件的失败百分比
*在所有支持的平台和多个版本中绘制组件的失败百分比。
*以总测试结果的百分比绘制所有测试状态
*绘制每个测试的实际总计的所有测试状态
CoreMark
* Compiler and version
* Operating Speed in Mhz
* CoreMark/Mhz
* CoreMark
* CoreMark/Core
* Parallel Execution
* EEMBC
EEMBC
* TODO
Spec CPU 2000
* CINT
* Benchmark
* Reference Time
* Base Runtime
* Base Ratio
* Runtime
* Ratio
* CFP
* Benchmark
* Reference Time
* Base Runtime
* Base Ratio
* Runtime
* Ratio
Spec CPU 2006
* Benchmark
* Base Seconds
* Base Ratio
* Peak Seconds
* Peak Ratio
关于Bourne Shell脚本的注意事项
这些脚本在许多与shell函数相关的地方使用了一些技术。一个是大量使用bourne shell函数来减少重复,并使代码更好地组织。函数返回的任何字符串都成为它的返回值。Bourne shell支持2种类型的
返回值。一个是函数返回的字符串。当被调用的函数返回数据时,将使用这个函数。这是由普通shell命令捕获的:values=" ’ call_function
1
′
"
。
另
一
种
类
型
的
返
回
值
是
单
个
整
数
。
就
像
系
统
调
用
时
,
这
些
脚
本
都
返
回
0
表
示
成
功
,
返
回
1
表
示
错
误
。
这
使
调
用
函
数
能
够
捕
获
错
误
,
并
以
干
净
的
方
式
处
理
它
们
。
要
提
到
的
几
个
好
习
惯
是
,
总
是
将
子
s
h
e
l
l
执
行
括
在
双
引
号
中
。
如
果
返
回
的
字
符
串
包
含
空
格
,
将
保
存
数
据
,
否
则
将
被
截
断
。
另
一
个
好
习
惯
是
在
进
行
字
符
串
比
较
时
总
是
添
加
一
个
字
符
。
如
果
两
个
字
符
串
中
的
一
个
未
定
义
,
脚
本
将
中
止
。
所
以
总
是
使
用
"
t
e
s
t
x
1 ' "。另一种类型的返回值是单个整数。就像系统 调用时,这些脚本都返回0表示成功,返回1表示错误。这使调用函数能够捕获错误,并以干净的方式处理它们。 要提到的几个好习惯是,总是将子shell执行括在双引号中。如果返回的字符串包含空格,将保存数据,否则将被截断。 另一个好习惯是在进行字符串比较时总是添加一个字符。如果两个字符串中的一个未定义,脚本将中止。所以总是使用"test x
1′"。另一种类型的返回值是单个整数。就像系统调用时,这些脚本都返回0表示成功,返回1表示错误。这使调用函数能够捕获错误,并以干净的方式处理它们。要提到的几个好习惯是,总是将子shell执行括在双引号中。如果返回的字符串包含空格,将保存数据,否则将被截断。另一个好习惯是在进行字符串比较时总是添加一个字符。如果两个字符串中的一个未定义,脚本将中止。所以总是使用"testx{foo} = xbar"可以防止这种情况。
添加对新目标的支持
为了增加对缺失目标的支持,我们必须告诉ABE关于目标的一些特殊的事情:
-选择哪个libc:在abe.sh中查找"powerpc"并添加类似的处理代码
-选择构建语言:在config/gcc.conf中,再次查找“powerpc”作为示例
-安装Linux内核头文件时,将目标名称转换为Linux名称:在lib/make.sh中,再次查找powerpc
以上是关于Linaro ABE(高级构建环境)构建GNU交叉工具链的主要内容,如果未能解决你的问题,请参考以下文章