分页: 1 / 1

build.sh:交叉编译NetBSD

发表于 : 2010-09-22 19:26
lionux
来源http://bbs.chinaunix.net/viewthread.php?tid=1094556
这是这篇文章http://www.mewburn.net/luke/papers/build.sh.pdf的翻译,附件文全文的pdf版
Luke Mewburn, Matthew Green

NetBSD基金会

[email][email protected],[email protected][/email]

译者:不开花

概述
NetBSD有个基础框架,它可以交叉编译包含可引导的分发媒介的整个NetBSD套件。编译过程不需要root权限或是可写的源码目录。编译过程可在多数POSIX兼容的操作系统上进行。本文解释了为了进行这个过程而对NetBSD所做的修改,列举了这项工作的优势,并介绍了未来为NetBSD交叉编译任何软件的工作。
1.介绍
NetBSD[1]是移植性最好的通用Unix操作系统。它可自由使用和再发行,并可广泛的运行在从现代桌面系统到可在不到一小时内编译整个发行套件的高端服务器,再到嵌入式系统和需要几天才能编译整个发行套件的旧机器。
在2001年下半年,开始了改进NetBSD能力以使可以交叉编译NetBSD的工作,特别是交叉编译整个套件。这个系统称为“build.sh”,因为这是所用脚本的名字,它是这个框架的可视前端。
NetBSD1.6是第一个由build.sh制作的版本,NetBSD项目的版本引擎组利用它在NetBSD1.6的发行周期内为39个平台交叉编译发行套件。以前的版本发行要求发行工程师访问每个平台,或是和某个硬件上的开发者配合。然而那种方法对于适度数量的平台(NetBSD1.5发布了20种平台的二进制版本)还行,并不具有扩展性,特别是随着NetBSD支持的平台数增长时(2003年6月为54个)。
2.背景

* 1 NetBSD


自从NetBSD项目于1993年开始以来,就有可移植到众多目标平台的目标。在设计,实现和改进方面做了一些有效的努力以使NetBSD容易“移植”到新的平台[4]。设备驱动程序以一种允许在各平台间简单共享而不需代码重组[5]的方式写成。

当在与目标平台不同的主机上,确切的说是本地系统上,编译系统时,NetBSD源代码的可移植性并不意味着“放心使用”。

在build.sh之前,某个平台的NetBSD发行版本是由某个和目标版本号“接近”版本的操作系统上“本地”编译的。这会有异常,这个交替过程不易于使用,也不易于自动化,并且带来各种build.sh已处理了的限制条件。
build.sh提供了在没有处理过的其它开源操作系统上编译NetBSD的通用性。

* 2 交叉编译Unix
Unix最初是交叉编译而来,直到当本地主系统可用时,那变为主要的开发方法并持续至今。


交叉编译是在“host”系统上运行程序来为不同的“target”系统产生目标代码。对于系统制作者来说这不是个简单任务并且通常不能整合进由开源操作系统所使用的操作系统编译过程(译者注:我鸟语太烂,没理解这一句,大概是说你所用操作系统并没默认安装交叉编译器,需要自己制作)。


可自由使用的软件项目,例如GCC[6]支持交叉编译很长时间了,并且GCC是NetBSD所用的GNU工具链的一部分,并且主要依赖于交叉编译。

* 2.1 交叉编译的介绍[译者注1]
一个完整的交叉编译器环境有好几个部分。除了编译器本身外,还需要许多别的工具和文件来创建功能程序。通常编译器所需要的的所有东西都要有。对于GNU工具链,这包括:


编译器-gcc

汇编器-as

链接器-ld
“binutils”;size,nm,strip,ar,等等。

头文件(由NetBSD提供)

库(由NetBSD和GNU工具链提供)。

如下是个这些都如何工作的快速预览。这对于任何编译器都是一样的;这个示例里的详细信息来自于GCC。
1.在源码文件上,通常是“.c”文件,C编译器前端gcc调用C预处理器cpp,产生“.i”文件。这仍是有效的C代码,但是将没有C预处理器指示(实际上,在现代GCC,cpp这一遍包含在cc1这一遍里来加快这个过程同时提供更快的错误报告。这个过程对于用户是不可视的)。
2.对于cpp的输出,gcc调用后端cc1,产生“.s”文件。这是相应于输入的C源文件的汇编源码文件。
3.对于cc1的输出,gcc调用汇编器as,产生“.o”文件。这是相应于汇编文件的目标文件。
4.对于as的输出,gcc调用链接器ld,加上其它文件(有时共同称为“crt材料”),产生可执行文件。除了可执行文件,文档和共享库也被编译。文档库通常由ar从目标文件创建。共享库是由gcc使用-shared选项来创建的,这会调用ld使用各种参数来创建共享库。