fpc.cfg配置文件

注解

早些版本使用 ppc386.cfg 作为配置文件。即使是最新的1.0.x版本也支持fpc.cfg。之后的时间 ppc386.cfg 将被删除,因此请使用 fpc.cfg。

一个正确的配置文件应该至少做以下事情:

  1. (最重要的)提供找到当前所选操作系统和体系结构的预编译单元位置。在IDE 中,此选项通常称为UNITPATH选项:-Fu

  2. 如果需要使用其它 binutils 作为默认平台(如在交叉编译时),那么 fpc.cfg应该允许编译器找到它们。我不知道IDE通常使用什么名称,但 BINUTILS PATH 或 GNU UTILS PATH 将适用选项:-FD

  3. 附加搜索静态和共享库的路径。通常称为库路径选项:-Fl

  4. (次要)默认情况下,编译器仅显示非常少的错误,警告和提示信息。向 fpc.cfg添加一些参数将便于调试。选项-vihw -l 1

  5. (交叉编译)用于交叉编译的 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 的问题

  1. 进行交叉编译时,只需要设置 -FD。在交叉编译到不同的处理器或不同的操作系统时。我们必须以某种方式确定操作系统和 CPU。

  2. 在 Unix 下,通常有针对 crossutils 的特定目录,可以确定位置和名称。Win32 根本没有这些。对于 win32,我提出了如上所述的目录结构。

  3. 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
1

告警系统目前正在扩展,以提供更大的灵活性。

2

懒人会为建立一个符号链接,从 fpc 到 binutils。对于教程作者来说,这是不允许的。

3

linuxator 严格来说是一个模拟器。仿真层非常薄(10 kbs左右),没有性能上的损失。由于所有的 lib 都双份存储在内存中(Linux + FreeBSD),它会占用一些额外的内存。