.. index:: single: 手动编译 手动编译 ================= 手工编译既困难又乏味,但它可以完成。编译 RTL 和编译编译器将单独介绍。 编译 RTL -------------------- 要重新编译 RTL,可以构建一个新的编译器,需要按照指定的顺序构建以下单元: 1. 程序存根,即每个 Pascal 程序的启动代码。这些文件的扩展名为 .as,因为它们是用汇编程序编写的。它们必须以 GNU 作为汇编程序进行组装。这些存根位于依赖于操作系统的目录中,除了 Linux,它们位于 Linux 目录(i386 或 m68k)的处理器相关子目录中。 #. system 单元,此单元在 RTL 依赖于操作系统的子目录中。 #. strings 单元,在 RTL 下 inc 子目录中。 #. dos 单元,此单元在 RTL 依赖于操作系统的子目录中。在尝试编译这个单元时,会编译其它单元(如,在 Linux 上,linux 单元将会被编译,go32 上,go32 单元将被编译)。 #. objects 单元,在 RTL 下 inc 子目录中。 要在 i386 上编译这些单元,使用以下语句进行操作: .. code-block:: bash 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 中: .. code-block:: bash del *.ppu del *.o 在此之后,使用以下命令,编译编译器: ``ppc386 -Tlinux -Fusystems -Fii386/ -Fui386 -Fu../rtl/units/i386-linux -di386 -dGDB pp.pas`` 以上选项必须在一行上,如果有多行,需要使用反斜线。 因此,最低选项是: 1. 目标操作系统。在目标操作系统与编译器当前操作系统相同时可以跳过。 #. RTL 路径,如果系统上有正确的 fpc.cfg 配置,则可以跳过。如果编译器使用已编译的 RTL 进行编译时,则应该 ../rtl/OS(将 OS 替换为 RTL 中相关操作系统的子目录)。 #. 用于定义编译编译器的处理器。需要。 #. -dGDB 需要。 #. -Sg 是必须的,编译器的某些部分使用 goto 语句(具体来说是:扫描器) #. 添加当前编译的处理器单元目录和要包含文件的目录。 #. 添加系统定义的目录。 所以绝对最少选项的命令行是: ``ppc386 -Fusystems -Fii386 -Fui386 -di386 -dGDB -Sg pp.pas`` 以上是最少的,其它命令行选项,可以在表(:doc:`F.1 `)中找到选项列表。