.. index:: single: fpc.cfg配置文件 fpc.cfg配置文件 ---------------------- .. note:: 早些版本使用 ppc386.cfg 作为配置文件。即使是最新的1.0.x版本也支持fpc.cfg。之后的时间 ppc386.cfg 将被删除,因此请使用 fpc.cfg。 一个正确的配置文件应该至少做以下事情: 1. (最重要的)提供找到当前所选操作系统和体系结构的预编译单元位置。在IDE 中,此选项通常称为UNITPATH选项:-Fu #. 如果需要使用其它 binutils 作为默认平台(如在交叉编译时),那么 fpc.cfg应该允许编译器找到它们。我不知道IDE通常使用什么名称,但 BINUTILS PATH 或 GNU UTILS PATH 将适用选项:-FD #. 附加搜索静态和共享库的路径。通常称为库路径选项:-Fl #. (次要)默认情况下,编译器仅显示非常少的错误,警告和提示信息。向 fpc.cfg添加一些参数将便于调试。选项-vihw -l [#FPCCONFIGURATIONFILE1]_ #. (交叉编译)用于交叉编译的 Binutils 通常是带有 cpu-operatingsystem 的前缀(例如i686-ming32),这个前缀可以使用-XP <前缀>参数指定,或者 makefile 使用 BINUTILSPREFIX 指定。选项-XP fpc.cfg 还有其它有趣的配置(比如国际化的错误消息,默认情况下将编译器设置为不同的模式,总是尝试使用智能链接等),这些是正常开发的重要因素。 .. note:: 在使用 FPC 源代码提供的 makefile 时,不会读取 fpc.cfg。这是为了避免在引导系统时出现两个RTL(旧的和新的)的问题。 单元路径 -Fu ^^^^^^^^^^^^^^^^^ -Fu 的情况与目录结构段落中的描述非常相似,其中有两种情况 -Fu 编译器选项与前面描述的不同。 如果我在路径上附加星号(\*\),这意味着它要搜索该目录下的所有目录,这在交叉编译单元时将不会这样。 我们可以使用 FPC_CROSSCOMPILING 指令来检测交叉编译。FPC 手册中列出了可以测试的其它组件。 Unix:如果我们假设编译器已安装到 PREFIX /usr/local,并且操作系统为 FreeBSD/i386,则: .. code-block:: bash :linenos: # 对\*nix\文件系统操作系统通用 -Fu/usr/local/lib/fpc/$FPCVERSION/units/$FPCtarget/* #....或适用于交叉编译。请注意,/cross/ 目录不是必须的 # 仅做为示例添加 #ifdef FPC_CROSSCOMPILING # 系统 不是默认 -> 交叉 -Fu/usr/local/lib/fpc/$FPCversion/cross/$fpctarget/units/* #else #ifndef cpu86 # 处理器不是默认 -> 交叉 -Fu/usr/local/lib/fpc/$FPCversion/cross/$fpctarget/units/* #else -Fu/usr/local/lib/fpc/$FPCVERSION/units/$FPCtarget/* #endif #endif Win32 和 Dos 安装在 c:\fpc\2.4.0: .. code-block:: bash :linenos: -Fuc:\fpc\2.4.0\units\$FPCtarget\* # 或适用于交叉编译 # 系统不是默认 -> 交叉 -Fuc:\fpc\2.4.0\units\$fpctarget\* # win32 binutils 路径 #ifndef win32 # 设置crossutils的路径。 假设在一个目录。 -FDc:\fpc\2.4.0\bin\cross # 这不是100%安全。GNU 和 FPC 目标命名不同 -XP$FPCTARGET- #endif 请记住,可以添加额外的路径(例如,自定义的包)。 在 win32 的情况下没有理由不使用$FPCVERSION。这只是一个例子。 Binutils路径 -FD ^^^^^^^^^^^^^^^^^^^^^^^ **binutils 的问题** 1. 进行交叉编译时,只需要设置 -FD。在交叉编译到不同的处理器或不同的操作系统时。我们必须以某种方式确定操作系统和 CPU。 #. 在 Unix 下,通常有针对 crossutils 的特定目录,可以确定位置和名称。Win32 根本没有这些。对于 win32,我提出了如上所述的目录结构。 #. FPC 和 GNU 平台命名方法。 Unix:作为例子,我在PC上使用FreeBSD。下面的位置 (/usr/local/processor-operationsystem) 是在 FreeBSD 下默认情况下安装交叉编译的实用程序的位置。然而,有时 fpc 命名操作系统与 binutils 命名不同。在这种情况下,你必须更加详细,这是我为 Windows 交叉编译所做的 [#FPCCONFIGURATIONFILE2]_。 所以我们的配置文件为: .. code-block:: bash :linenos: #ifdef FPC_CROSSCOMPILING # 其它binutils,如果操作系统不同 #ifdef win32 # win32是一个例外 # FPC 操作系统名称: win32,Binutils OS 操作系统名称 : mingw32 # FPC 处理器: i386, Binutils 处理器: i686 -FD/usr/local/i686-unknown-mingw32/bin #else # 我们希望 fpc 和 binutils 名称匹配:-) -FD/usr/local/$FPCTARGET/cross #endif #else #ifndef cpu86 # 其它 binutils,如果处理器不同 -FD/usr/local/$FPCTARGET/cross #endif #endif Win32 和 Dos:几乎一样。然而,与 Unix 相反,我没有真正测试过这个。假设 FPC安装在 c:\fpc\2.4.0 中。binutils 在 d:\binutils 中,则\*BSD\命名如下: .. code-block:: bash :linenos: #ifndef win32 # 其它 binutils,如果操作系统不同 -FDd:\binutils\$FPCTARGET\bin #else #ifndef cpu86 # 其它 binutils,如果处理器不同 -FDd:\binutils\$FPCTARGET\bin #endif #endif **使用makefile** 使用 makefile 时,可以通过传递 CROSSBINDIR=<路径> 来设置 -FD 参数。这可确保参数从 makefile 正确传递给makefile(在嵌套目录结构中)。 Binutils 前缀,所有 binutils 都在一个目录中 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 一个较新的补充是 -XP 参数,它为所有 binutils 设置一个前缀,因此,如果将-XPbla-die-bla- 添加到 fpc 命令行,则所有对 as 和 ld 的调用都将使用 bla-die-bla- 进行预处理。主要原因是默认情况下,交叉编译的 binutils 命名为--,而不只是。 在进行交叉快照(或cycle)时,设置 make 变量 BINUTILSPREFIX 将确保在正确的时刻传递 -XP。 我们假设交叉编译的 binutils 都在一个目录中,那么上面的代码将变成: .. code-block:: bash :linenos: #ifdef FPC_CROSSCOMPILING # 如果处理器或目标操作系统不同,则使用其它binutils目录 -FD/usr/local/cross/bin # 设置前缀,从该目录中选择正确的前缀: -XP$FPCTARGET- #endif 假设平台的 binutils 命名与 FPC 相同。也有例外: ==================== ==================== ======================== ======================== 常用名称 FPC 名称 Binutils 名称 ppc 名称 (32-bit windows) win32 cygwin 或 mingw32 (OS 非 CPU) i386 或 x86 i386 i386,i486,i586,i686 386 Sunos/Solaris sunos solaris PowerPC powerpc powerpc ppc ==================== ==================== ======================== ======================== 因此对于这些目标,我们需要特殊处理。(示例:参见 fpcbuild/install 仓库中的脚本代码,像 samplecfg 和 install.sh) Library 路径 -Fl ^^^^^^^^^^^^^^^^^^^^^^^^^ 库路径是找到静态库(以及 unix 下的共享库)的地方。虽然这对 Unix 平台非常重要,但 Windows 和 dos 上的 FPC 编译器也可以链接到 GCC(和变体)库,因此 FPC 必须能够找到它们。 库路径依赖于目标系统和处理器。无法将 FreeBSD/x86 库链接到 Linux/Powerpc 的可执行文件上。因此,本质上我们正在做的与单元路径相同。如果使用默认位置,则在 unix 上将其设置为默认目录,否则将其设置为用户安装交叉编译库的位置。 Unix:作为一个例子,我在普通 PC 上使用 FreeBSD,因为大多数 BSD,特别是在普通 PC 上都有一个兼容 Linux 库来运行没有 FreeBSD 版本的专有 Linux 程序。此模式称为 Linuxator [#FPCCONFIGURATIONFILE3]_。Linuxator lib 通常基于 SUSE,在 /compat/linux/。NetBSD 拥有大量这样的模拟。无论如何,这里是片段,它假定用户在 /usr/local/crosslibs 下构建交叉库。 .. code-block:: bash :linenos: #undef specialoscpu #ifndef FPC_CROSSCOMPILING #define specialoscpu # DEFAULT # 基础之外的库安装 PREFIX=/usr/local -Fl/usr/local/lib # X安装了 PREFIX=/usr/X11R6 -Fl/usr/X11R6/lib #endif #ifdef linux #ifdef cpu86 # CROSS,非 SPECIAL,FreeBSD 可选择在 Linux 上使用 Linux 用户空间。通常它是一些 SUSE 版本。 #define specialoscpu -Fl/compat/linux/lib -Fl/compat/linux/usr/lib -Fl/compat/linux/usr/X11R6/lib #endif #endif # 默认情况下,库不存在于目标系统上。将 # 恢复为特殊的交叉目录 #ifndef specialoscpu -Fl/usr/local/crosslibs/$FPCTARGET/lib -Fl/usr/local/crosslibs/$FPCTARGET/usr/lib -Fl/usr/local/crosslibs/$FPCTARGET/usr/local/lib -Fl/usr/local/crosslibs/$FPCTARGET/usr/X11R6/lib #endif Win32和Dos:类似。目录(d:\crosslibs 当前),没有默认值。如果你有一个合适的 gcc(djgpp 用于 dos,cygwin 和 mingw 用于 win32),你可以将它添加到默认空间。 .. code-block:: bash :linenos: #ifndef win32 # 其它binutils,如果操作系统不同 -Fld:\crosslibs\$FPCTARGET\lib -Fld:\crosslibs\$FPCTARGET\usr\lib # 等等 #else #ifndef cpu86 # 其它binutils,如果处理器不同 # 也许有人做了一个 win32/Sparc 接口 -Fld:\crosslibs\$FPCTARGET\lib -Fld:\crosslibs\$FPCTARGET\usr\lib #else # DEFAULT #endif #endif 详细配置 ^^^^^^^^^^^^^^^^ 没什么好说的。使用默认值就行,我从未更改过它(为了保险起见,我将其写在了下面),有关更多信息,请参见手册。请注意,fpc.cfg 中的任何配置都可以在命令行上覆盖(如,对于调试,通常在命令行上使用 -va) .. code-block:: bash :linenos: # FPC LOGO -l # 显示信息,警告,注释和提示 -viwn .. [#FPCCONFIGURATIONFILE1] 告警系统目前正在扩展,以提供更大的灵活性。 .. [#FPCCONFIGURATIONFILE2] 懒人会为建立一个符号链接,从 fpc 到 binutils。对于教程作者来说,这是不允许的。 .. [#FPCCONFIGURATIONFILE3] linuxator 严格来说是一个模拟器。仿真层非常薄(10 kbs左右),没有性能上的损失。由于所有的 lib 都双份存储在内存中(Linux + FreeBSD),它会占用一些额外的内存。