|
|
|
| GCC安装手册(二) |
|
新闻出处: 发布时间:2007-11-01
|
6. 确定 Bison 剖析器产生机 (parser generator) 已经安装。(如果 Bison 所产生出来的 `c-parse.c\" 跟 `cexp.c\" 这两个档案比 `c-parse.y\" 跟`cexp.y\" 还新,而且你不打算改这些 `.y\" 档的话,这步就不用做。在 1988 年 9 月 8 号之前的 Bison 版本会产生不正确的 `c-parse.c\"。
7. 如果你选择了一个需要其他 GNU 工具(像是 GAS 或 GNU 连结器) 而不是标准系统工具的组态来做 GNU CC 的话,记得在建立 GNU CC 的目录底下安装所需的工具,并命名为 `as\", \"ld\" 或其他相关名称。这样会使得编译器会在编译 `enquire\" 时去找这些适当的工具。
或者是,你可以在做後来的编译工作时把 `PATH\" 环境变数值设成 GNU 工具在标准系统工具之前。
8. 建立这个编译器。只要在编译器目录□打入 `make LANGUAGES=c\" 就好了。
`LANGUAGES=c\" 指明了只会编译 C 编译器。makefile 正常下会去编译所有它支援的语言,目前是 C, C++ 和 Objective C。然而,只有 C 是你用其他非 GNU C 编译器所编出来的会动的一个。再说,在这个阶段编译 C 以外的东西是在浪费时间。
通常,你可以打入这个参数 `LANGUAGES=\"LIST\"\" 指明你要的语言,其中\"LIST\" 是 `c\", `c++\" 和 `objective-c\" 之一或多个。如果你在 GNU CC 原始码目碌下有其他附加的 GNU 编译器,你会可以加到 `LIST\" □面。
忽略掉在编 `insn-emit.c\" 时所有 \"statement not reached\" 的警告讯息,那是正常的。还有,警告讯息 \"unknown escape sequence\" 在编 `genopinit.c\" 或是其他档案是也是正常的。同理,你也可以不理那些在 `insn-emit.c\" 和 `insn-recog.c\" 的 \"constant is so large that it is unsigned\" 和 `enquire.o\" □的关於 \"comparison always being zero\" 。其他编译错误可能表示了移植到你的机器或作业系统时的错误,你应该仔细检查并提出报告 (附注:虫)。
有些要钱的编译器因为它们本身的虫或是限制,在编 GNU CC 时会失败。例如Microsoft 的编译器说会用光所有巨集空间。有的 Ultrix 的编译器会用完表示式空间,你必需分开问题发生处的叙述。
9. 如果你在做交互编译器,就此打住。 *附注:交互编译器
10. 用底下这个命令把第一阶段目的档案和可执行档案放到一个目录: make stage1
这些档案会放到一个叫 `stage1\" 的副目录□。当安装完成以後,你或许会用 `rm -r stage` 把这些档案杀掉。
11. 如果你选择了一个需要其他 GNU 工具(像是 GAS 或 GNU 连结器) 而不是标准系统工具的组态来做 GNU CC 的话,把这些要用的工具放在 `stage1\" 子目录下,并命名为 `as\", `ld\" 或相关档名。这样会使得在做下一阶段时第一阶段编译器会在这□找适合的工具。
或者是,你可以在做後续的编译工作时把 `PATH\" 环境变数值设成 GNU 工具在标准系统工具之前。
12. 用底下这个命令叫这个编译器自己再重新编译一次:
make CC=\"stage1/xgcc -Bstage1/\" CFLAGS=\"-g -O2\"
这叫做建造第二阶段编译器。
上面这个命令会造出所有支援语言的编译器。如果你不要全部都做,你可以用 `LANGUAGES=\"LIST\"\" 注明你要做的语言。 LIST 可以包含 `c\", `c++\", `objective-c\" 和 `proto\" 之一或多个,以空白分开。`proto\" 是指`protoize\" 和 `unprotoize\" 这两个程式,它们不是一个独立的语言,但是你是用 `LANGUAGES\" 决定要不要安装它们。
如果你还要继续做第三阶段编译器,那你只要在第二阶段做出 C 语言就好了。
当你做完第二阶段编译器以後,如果磁碟空间快没了,你可以砍掉 `stage1\" 这个子目录。
在没有浮点运算硬体的 68000 或 68020 系统上,除非你已经选了一个预设没有浮点运算器的 `tm.h\" 档,不然就用底下这个:
make CC=\"stage1/xgcc -Bstage1/\" CFLAGS=\"-g -O2 -msoft-float\"
13. 如果你想以叫这个编译器再编译它自己一次来测试它的话,把其他需要的GNU 工具 (像是 GAS 或 GNU linker) 放在 `stage2\" 子目录□,就像在你之前在 `stage1\" 子目录□做的一样,然後:
make stage2 make CC=\"stage2/xgcc -Bstage2/\" CFLAGS=\"-g -O2\"
这叫做建造第三阶段编译器。 除了 `-B\" 选项,编译选项都跟你在做第二阶段编译器时一样。但是 `LANGUAGES\" 这个选项不一定要一样。上面这个命令会做出所有支援的编译器。如果你不要全部都做,你可以用如前所述的 `LANGUAGES=\"LIST\"\" 选项指定你要的语言。
如果你不需要安装任何附加的 GNU 工具,你可能要用底下这个命令
make bootstrap LANGUAGES=LANGUAGE-LIST BOOT_CFLAGS=OPTION-LIST
而不是做 `stage1\", `stage2\",并执行它们做出来的东西。
14. 然後是比较第二阶段目的档跟最後的目的档 -- 除了时间戳记 (time stamp) 之外,它们应该要一样才对。
在某些系统上,有意义的比较目的档是不可能的;它们总是显示 \"不同\"。目前在 Solaris 和一些使用 ELF 目的档格式的系统上都会发生。在某些版本的 SGI 机器上的 Irix 和 Alpha 系统上的 DEC Unix (OSF/1),你不可能不指定 `-save-temps\" 而比较这些档案。如果你在比较上出了错,去看看上述个别系统的说明。你在其他系统上也可能发生类似问题。
用这个命令来比较档案:
make compare
它会提到所有第二阶段和第三阶段的目的档的不同。有任何不同的话,不管是多麽无害,都显示 GNU CC 在第二阶段把编译器做错了,所以有可能有严重的错误。你应该检查并提出报告。(*附注:虫)
如果你的系统不会在目的档上放时间戳记,有一个比较快的方法来比较它们 (用 Bourne shell):
for file in *.o; do cmp $file stage2/$file done
如果你是在 MIPS 的机器上用了 `-mno-mips-tfile\" 选项,你将没办法去比较这些档案。
15. 打 `make install\" 安装编译器驱动程式,这□面包括了编译器的各个阶段 (pass) 和执行时期支援。在 `CC\", `CFLAG\", `LANGUAGES\" □用跟你在做编译时用一样的值。这样做有个必需的理由是因为某些版本的make □面有虫,会莫名其妙地重新编译档案。假如你指定了一样的变数值,那些档案会适当地被重编译。
举例来说,假如你已经建立好第二阶段编译器,你可以用底下的命令:
make install CC=\"stage2/xgcc -Bstage2/\" CFLAGS=\"-g -O\" LANGUAGES=\"LIST\"
这样做会把 `cc1\",`cpp\" 跟 `libgcc.a\" 拷贝到`/usr/local/lib/gcc-lib/TARGET/VERSION\" 这个目录□,这个目录是编译器驱动程式用来找这些档案的地方。TARGET 是你在执行 `configure\" 时所指定的目标机器型态,而 VERSION 是 GNU CC 的版本号码。这种命名方法是为了要使得不同版本及/或交互编译器可以同时存在。
这样做也会把驱动程式 `xgcc\" 放在 `/usr/local/bin/gcc\" □面,使得它在典型的执行搜寻路径□出现。
在某些系统上,这个命令会使得某些档案被重新编译。这通常是 `make\" 的错。你可以忽略掉这个问题,或是使用 GNU Make。
*警告* Sun 的函式库中的 `alloca\" 是有错的。要避免掉这个错误,确定你安装了用 GNU CC 所编译出来的 GNU CC 可执行档。(就是说,第二阶段或第三阶段的可执行档,而不是第一阶段的) 它们会把 `alloca\" 当成是内建函数,而不会用到函数库中的那一个。
(通常最好是使用第二阶段或第三阶段所产生的 GNU CC 可执行档,因为一般来说它们在执行上会比其他的编译器快)
16. 如果你要用 C++,你大概也要安装 libg++ 这套东西。它应该在你取得 GNU C 的同一个地方。由於 GNU C 没有另外的 C 执行时期函式库,所以它也不包含C++ 执行程式库。所有的 I/O 函数、特殊类别函式库等等都包含在 libg++ □面。 |
| 【关闭】【打印】 |
|
|