Next: , Previous: Build, Up: gcc Directory


6.3.4 Makefile工作目标

这些工作目标可以从‘gcc’目录下获得:

all
这是缺省工作目标。它会根据你对build/host/target的配置, 来协调构建所有需要的事物。
doc
生成info格式的文档和man页。实质上它是调用了‘make man’和‘make info’。
dvi
生成DVI格式的文档。
pdf
生成PDF格式的文档。
html
生成HTML格式的文档。
man
生成man页。
info
生成info格式的页。
mostlyclean
删除构建编译器中创建的文件。
clean
由‘make all’创建的所有其它文件。
distclean
configure创建的所有文件。
maintainer-clean
Distclean,以及任何由其它文件生成的文件。 注意可能会需要,除了构建gcc所需的,额外的工具。
srcextra
在源目录生成不在CVS中存在的,但是属于发行tar包的文件。 由CVS源文件gcc/java/parse.y生成的gcc/java/parse.c是一个例子。
srcinfo
srcman
将info格式的和manpage文档复制到源目录,用于生成发行tar包。
install
安装gcc。
uninstall
删除安装的文件。
check
运行测试包。这将创建一个testsuite子目录, 其中具有各种包含测试结果的.sum.log文件。 可以使用,例如‘make check-gcc’的方式,来运行一个测试子集。 可以通过设定RUNTESTFLAGS为.exp文件名, (对于某些测试)后面可选的一个等号和一个文件通配符,来指定特定的测试。如:
          make check-gcc RUNTESTFLAGS="execute.exp=19980413-*"

注意可能需要安装额外的工具,像TCL或dejagnu,来运行测试包。

开始编译GCC的顶层树不是GCC目录,而是使用一个复杂的Makefile来协调构建的各个步骤,包括自举(bootstrap)编译器,以及使用新的编译器来构建目标库。

当GCC被配置为本地配置时,make的缺省动作是执行完整的三阶段自举。 这意味着GCC将被构建三次,一次是使用本地编译器, 一次是使用刚由本地编译器构建的编译器,一次是使用第二次构建的编译器。 理论上,最后两次应该产生相同的结果,这可以使用‘make compare’来检验。 每个阶段都被单独的配置和编译到独立的目录里, 以尽可能减少由于本地编译器和GCC之间的ABI不兼容所带来的问题。

如果做了改动,重建工作将还会从第一阶段开始,并且将改动贯穿三个阶段。 每个阶段都在它的构建目录下开始(如果先前曾被构建过), 重建,并且复制到它的子目录。这将允许你,在修订了引起第二阶段构建崩溃的bug之后, 可以继续进行自举。这虽然对编译器没有提供像从头进行自举那样好的覆盖效果, 但却能保证新的代码在语法上是正确的(例如,没有错误使用GCC的扩展功能), 并避免了不合逻辑的自举比较失败 1

其它由顶层可以获得的目标包括:

bootstrap-lean
类似bootstrap,除了各个阶段当不再需要的时候,将被移除。 这可以节省磁盘空间。
bootstrap2
bootstrap2-lean
只执行前两个阶段的自举。不像三阶段自举,这将不执行测试编译器运行正常的比较。 注意使用“lean”的自举所需要的磁盘空间几乎是与阶段数目无关的。
stageN-bubble (N = 1...4)
使用适当的标记,来重建所有的阶段,只到N,并将按照上面描述的来传播改动。
all-stageN (N = 1...4)
假设阶段N已经被构建,使用适当的标记来重建它。这个很少用到。
cleanstrap
移除所有(‘make clean’)并重建(‘make bootstrap’)。
compare
比较阶段2和3的结果。这用于确保编译器运行正常,因为不管它本身是如何被编译的,都应该产生相同的目标文件。
profiledbootstrap
构建带有profile反馈信息的编译器。更多信息,参见 Building with profile feedback
restrap
重新启动自举,使得任何没有使用系统编译器构建的将被重建。
stageN-start (N = 1...4)
对于被自举的每个package,重命名目录,使得例如, 当使用N-1阶段的(stageN-1)GCC编译时,gcc指向N阶段的(stageN)GCC。

如果需要测试或调试N阶段的GCC时,你将使用该目标。 如果只需要执行GCC(但不需要运行‘make’,也不需要重建或运行测试包), 你应该能够在stageN-gcc目录下工作。 这使得很容易进行并行的调试多个阶段。 2

stage
对于被自举的每个package,重定位它的构建目录来指示它的阶段。 例如,如果gcc目录指向阶段2的GCC,则执行该目标之后, 将被重命名为stage2-gcc

如果在编译阶段2和阶段3的编译器时,想使用非缺省的GCC标记, 则在执行‘make’时,在命令行上设置BOOT_CFLAGS

通常,第一阶段只构建编写编译器的语言:通常是C,以及可能会有Ada。 如果你在调试一个其它的阶段2前端的错误编译(例如,Fortran前端), 你可能想要在第一阶段也有其它语言的前端。如果这样, 在执行‘make’时在命令行中设置STAGE1_LANGUAGES

例如,在前述情况中,要调试由阶段1编译器造成的Fortran前端的错误编译, 可能需要一个命令如

     make stage2-bubble STAGE1_LANGUAGES=c,fortran

另外,可以使用每个语言的目标,来构建和测试没有在阶段1启用的语言。 例如,make f951将在stage1构建目录下构建一个Fortran编译器。


Footnotes

[1] 除非编译器有bug,以及一些没有被修改的文件被错误编译了。 在这种情况下,最好使用make restrap

[2] 习惯上,系统编译器也被称为0阶段(stage0)GCC。