Next: Top Level, Up: Source Tree
配置和构建过程有着悠久灿烂的历史,如果不清楚其缘由,很容易使人迷惑不解。 虽然有另外的文献详细描述了配置过程,这里还是给出了一些从事GCC工作都应该 了解的内容。
构建程序要知道三个系统名称:构建时所使用的机器(build),构建完成 后将使用的机器(host),以及GCC未来生成代码所要运行的机器(target)。 在配置GCC时,通过 --build=, --host=, --target= 来指定这些系统名称。
要避免只指定host而不指定build,因为 configure 程序可能会认为 你所指定的host和build相同(曾经发生过),而实际上可能并非如此。
我们把build, host和target都相同的情况叫做 native(本地的)。如果 build和host相同,但target不同,就叫做 cross(交叉的)。 build, host和target都不同的情况则被称为 canadian (加拿大的——用来暗指加 拿大政党状况与当时从事构建工作的人的背景类似)。如果host和 target相同, 但build不同,则表明你在使用交叉编译器来为一个不同的系统构建本地编译器。 有些人把这称为 host-x-host,crossed native(交叉的本地的), 或 cross-built native(交叉构建的本地的)。如果build和target相同, 但host不同,则表明你在使用交叉编译器来构建一个产生构建时所在机器代码的 交叉编译器。这种情况很少见,所以没有通用的方式来描述它。有人建议称之为 crossback。
如果build和host相同,则正要构建的GCC还会被用于构建目标库(比如
libstdc++
)。如果build和host不同,那么必须事先构建和安装一个交叉
编译器,用于构建目标库(如果使用的配置为 --target=foo-bar,这个
编译器就叫做 foo-bar-gcc)。
对于目标库的情况,你所构建的目标机器就是通过 --target 指定的
机器。所以,build就是在上面进行构建的机器(这没有什么不同),host就是
为其构建的机器(目标库是为target构建的,所以host也就是所指定的target),
同时无需使用target(因为不是在构建编译器,而是在构建库)。configure/make
过程会在必要时调整这些变量。它还会把 $with_cross_host
设置成
--host 的初始值,以供不时之需。
支持库 libiberty
最多会被构建三次:一次针对host,一次针对target
(即使二者相同),如果build和host不同,还会针对build再构建一次。这样支
持库libiberty就可以被构建过程中生成的所有程序使用了。