手动编译

手工编译既困难又乏味,但它可以完成。编译 RTL 和编译编译器将单独介绍。

编译 RTL

要重新编译 RTL,可以构建一个新的编译器,需要按照指定的顺序构建以下单元:

  1. 程序存根,即每个 Pascal 程序的启动代码。这些文件的扩展名为 .as,因为它们是用汇编程序编写的。它们必须以 GNU 作为汇编程序进行组装。这些存根位于依赖于操作系统的目录中,除了 Linux,它们位于 Linux 目录(i386 或 m68k)的处理器相关子目录中。

  2. system 单元,此单元在 RTL 依赖于操作系统的子目录中。

  3. strings 单元,在 RTL 下 inc 子目录中。

  4. dos 单元,此单元在 RTL 依赖于操作系统的子目录中。在尝试编译这个单元时,会编译其它单元(如,在 Linux 上,linux 单元将会被编译,go32 上,go32 单元将被编译)。

  5. objects 单元,在 RTL 下 inc 子目录中。

要在 i386 上编译这些单元,使用以下语句进行操作:

ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 -Us -Sg system.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/strings.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 dos.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/objects.pp

这些是编译 RTL 所需的最小命令行选项。

对于另一个处理器,应该将 i386 换成适当的处理器。对于另一个目标 OS,必须设置目标 OS (-T)。

根据目标操作系统,还有其它可编译的单元,但不需要重新编译编译器。以下单元适用于所有平台:

单元名

说明

objpas

需要 Delphi 模式,需要 -Mobjfpc 选项,在 objpas 子目录中。

sysutils

许多实用功能,如 Delphi,在 objpas 目录中,需要 -MObjfpc 选项进行编译。

typinfo

用于访问 RTTI 信息的函数,如 Delphi,在 objpas 目录中。

math

数学函数,就像在 Delphi 中一样,在 objpas 目录中。

mmx

MMX 级 Intel 处理器扩展,在 i386 目录中。

getopts

GNU 兼容的 getopts单元,在 inc 目录中。

heaptrc

调试堆。位于 inc 目录中。

编译编译器

编译编译器可以使用一个语句完成。最好先从编译器目录中删除所有单元,如下所示:

rm *.ppu *.o

在 Linux 和 DOS 中:

del *.ppu
del *.o

在此之后,使用以下命令,编译编译器:

ppc386 -Tlinux  -Fusystems -Fii386/ -Fui386 -Fu../rtl/units/i386-linux -di386 -dGDB pp.pas

以上选项必须在一行上,如果有多行,需要使用反斜线。

因此,最低选项是:

  1. 目标操作系统。在目标操作系统与编译器当前操作系统相同时可以跳过。

  2. RTL 路径,如果系统上有正确的 fpc.cfg 配置,则可以跳过。如果编译器使用已编译的 RTL 进行编译时,则应该 ../rtl/OS(将 OS 替换为 RTL 中相关操作系统的子目录)。

  3. 用于定义编译编译器的处理器。需要。

  4. -dGDB 需要。

  5. -Sg 是必须的,编译器的某些部分使用 goto 语句(具体来说是:扫描器)

  6. 添加当前编译的处理器单元目录和要包含文件的目录。

  7. 添加系统定义的目录。

所以绝对最少选项的命令行是:

ppc386 -Fusystems -Fii386 -Fui386 -di386 -dGDB -Sg pp.pas

以上是最少的,其它命令行选项,可以在表(F.1)中找到选项列表。