译器会在编译 `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"
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




