fpc.cfg配置文件¶
注解
早些版本使用 ppc386.cfg 作为配置文件。即使是最新的1.0.x版本也支持fpc.cfg。之后的时间 ppc386.cfg 将被删除,因此请使用 fpc.cfg。
一个正确的配置文件应该至少做以下事情:
(最重要的)提供找到当前所选操作系统和体系结构的预编译单元位置。在IDE 中,此选项通常称为UNITPATH选项:-Fu
如果需要使用其它 binutils 作为默认平台(如在交叉编译时),那么 fpc.cfg应该允许编译器找到它们。我不知道IDE通常使用什么名称,但 BINUTILS PATH 或 GNU UTILS PATH 将适用选项:-FD
附加搜索静态和共享库的路径。通常称为库路径选项:-Fl
(次要)默认情况下,编译器仅显示非常少的错误,警告和提示信息。向 fpc.cfg添加一些参数将便于调试。选项-vihw -l 1
(交叉编译)用于交叉编译的 Binutils 通常是带有 cpu-operatingsystem 的前缀(例如i686-ming32),这个前缀可以使用-XP <前缀>参数指定,或者 makefile 使用 BINUTILSPREFIX 指定。选项-XP
fpc.cfg 还有其它有趣的配置(比如国际化的错误消息,默认情况下将编译器设置为不同的模式,总是尝试使用智能链接等),这些是正常开发的重要因素。
注解
在使用 FPC 源代码提供的 makefile 时,不会读取 fpc.cfg。这是为了避免在引导系统时出现两个RTL(旧的和新的)的问题。
单元路径 -Fu¶
-Fu 的情况与目录结构段落中的描述非常相似,其中有两种情况 -Fu 编译器选项与前面描述的不同。
如果我在路径上附加星号(*),这意味着它要搜索该目录下的所有目录,这在交叉编译单元时将不会这样。
我们可以使用 FPC_CROSSCOMPILING 指令来检测交叉编译。FPC 手册中列出了可以测试的其它组件。
Unix:如果我们假设编译器已安装到 PREFIX /usr/local,并且操作系统为 FreeBSD/i386,则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 对\*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:fpc2.4.0:
1 2 3 4 5 6 7 8 9 10 11 | -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 的问题
进行交叉编译时,只需要设置 -FD。在交叉编译到不同的处理器或不同的操作系统时。我们必须以某种方式确定操作系统和 CPU。
在 Unix 下,通常有针对 crossutils 的特定目录,可以确定位置和名称。Win32 根本没有这些。对于 win32,我提出了如上所述的目录结构。
FPC 和 GNU 平台命名方法。
Unix:作为例子,我在PC上使用FreeBSD。下面的位置 (/usr/local/processor-operationsystem) 是在 FreeBSD 下默认情况下安装交叉编译的实用程序的位置。然而,有时 fpc 命名操作系统与 binutils 命名不同。在这种情况下,你必须更加详细,这是我为 Windows 交叉编译所做的 2。
所以我们的配置文件为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #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:fpc2.4.0 中。binutils 在 d:binutils 中,则*BSD命名如下:
1 2 3 4 5 6 7 8 9 | #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 命名为<cpu>-<target>-<filenmae>,而不只是<filenmae>。
在进行交叉快照(或cycle)时,设置 make 变量 BINUTILSPREFIX 将确保在正确的时刻传递 -XP。
我们假设交叉编译的 binutils 都在一个目录中,那么上面的代码将变成:
1 2 3 4 5 6 | #ifdef FPC_CROSSCOMPILING
# 如果处理器或目标操作系统不同,则使用其它binutils目录
-FD/usr/local/cross/bin
# 设置前缀,从该目录中选择正确的前缀:
-XP$FPCTARGET-
#endif
|
假设平台的 binutils 命名与 FPC 相同。也有例外:
常用名称 |
FPC 名称 |
Binutils 名称 |
ppc<x> 名称 |
(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 3。Linuxator lib 通常基于 SUSE,在 /compat/linux/。NetBSD 拥有大量这样的模拟。无论如何,这里是片段,它假定用户在 /usr/local/crosslibs 下构建交叉库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #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),你可以将它添加到默认空间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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)
1 2 3 4 | # FPC LOGO
-l
# 显示信息,警告,注释和提示
-viwn
|