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=[email protected]:/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=[email protected]:/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"01使shell使"testx{foo} = xbar"可以防止这种情况。
添加对新目标的支持

为了增加对缺失目标的支持,我们必须告诉ABE关于目标的一些特殊的事情:
-选择哪个libc:在abe.sh中查找"powerpc"并添加类似的处理代码
-选择构建语言:在config/gcc.conf中,再次查找“powerpc”作为示例
-安装Linux内核头文件时,将目标名称转换为Linux名称:在lib/make.sh中,再次查找powerpc

你可能感兴趣的:(编译器,ARM,compiler)