目录结构

基本上 FPC 布局非常灵活。可执行文件(ppc386,ppc68k 或 ppcppc)必须能够找到一个配置文件,并且文件可以指定其它内容。因此,这个结构是发行版默认安装的结构。或根据计划将在未来版本中使用。(后者主要是为了多处理器设计)

FPC 的基础安装主要有以下几类:

binaries 基础可执行文件(fpc,ppc68k 和 ppcppc,ppcsparc,ppcx64)必须位于系统的搜索路径中。如果你执行 fpc,fpc 必须能够在 PATH 中找到(ppcppc,ppc386等)。

fpc.cfg 可执行文件必须能够在操作系统的默认位置中找到配置文件。(参见平台相关部分)

units 配置必须设定具体平台和 cpu 编译的 RTL 和其它包路径。这通常是树型。交叉编译单元也属于树型结构。

(binutils) binutils (LD,AS,AR)必须在路径中,或在 fpc.cfg 文件中指定,或者在命令行中使用 -FD 参数指定。默认情况下不安装 binutils 到操作系统上,通常安装在与主可执行文件相同的目录中,所以不进行交叉编译或混合两个 FPC 安装,这通常不是问题(例如,在一台机器上安装 DOS 和 Windows)。请注意,在 fpc.cfg 文件中指定的仅在手动编译程序时有效。编译新编译器时,make文件会忽略 fpc.cfg 文件。

除了这些还有源代码目录、文档、编译器本地化(语言)和示例目录。然而,这些仅对实际发布工程有意义,它不是影响编译器工作。这是因为编译器的源代码目录中的.o,.a和.ppu文件中已经有编译形式的源代码。这是因为编译器在单元目录中的. o、.a 和.ppu 文件已经有已编译形式的源代码。来源并不重要。唯一需要源目录进行自动处理的是 Lazarus,并且可以在 Lazarus 的 FPC 源对话中输入任何路径。

在 fpc.cfg 中写入路径时,会自动进行一些替换,例如:

名称

说明

$FPCTARGET

将替换为当前处理器和操作系统名。(例如 i386-linux)

$FPCVERSION

将替换为当前 FPC 编译器版本。

$FPCCPU

将替换为编译的处理器名。

$FPCOS

将替换为当前操作系统。

$FPCFULLVERSION

将被额外的补丁级别编译器版本所取代。(2.4.x)

$FPCDATE

将替换为当前日期。

由于系统结构与操作系统相关,我将在下面介绍一些操作系统的特定信息。

Unix(如Linux)

在Unix下,大多数目录都是相对于前缀。前缀是一种用于包安装的根目录。 常见的前缀是/usr,/usr/local,/usr/exp 和 /usr/pkg(最后一个在 NetBSD 上很常见)。

通常情况下,随发行版的程序在 /usr,手工编译或手工安装的软件在 /usr/local。然而,随着分发思想和操作系统的不同而变化。主要目的是让 root(管理员)可信用户能够在 /usr/local 中安装和管理不重要的包,同时使用基础系统以便管理员(组)操作。通常情况下,Linux 发行版将软件包安装到 /usr 而不是/usr/local,但不是每个发行版都这样做。man hier 可以查看当前Unix版本上使用的一些约定。

如果目录相对于前缀,则它们被记为 $PREFIX/the/rest/of/the 路径。请注意,这与 fpc.cfg 中的 $FPC <x> 替换无关。$PREFIX 是获取环境变量 PREFIX 内容的标记。编译单元将进入 $PREFIX/fpc/$FPCVERSION/units/$FPCTARGET。交叉编译的单元将进入,$PREFIX/fpc/$FPCVERSION/units/$FPCTARGET。

可执行文件进入目录 $PREFIX/bin,然而,有时这些只是指向$PREFIX/lib/fpc/$FPCVE 目录中实际文件符号链接,以便轻松切换版本。可执行文件在正确设置后可以使用 fpc.cfg 中的版本化信息找到自己的单元文件,通常,默认的可执行文件是唯一需要交换的。

在 unix 上搜索配置文件的位置是:/etc/fpc.cfg、~/.fpc.cfg。 搜索 $PREFIX/etc/fpc.cfg 1.9.8起。(~表示Unix上的用户目录)

所以我们以 $PREFIX=/usr/local,$VERSION=2.4.0,$FPCCPU=i386,$FPCOS=freebsd 和 $FPCTARGET=i386-freebsd为例,看看文件在哪里:

文件

位置

备注

fpc

/usr/local/bin

ppc386

/usr/local/bin

符号链接到 /usr/local/lib/fpc/2.4.0/ppc386

ppcppc

/usr/local/bin

符号链接到 /usr/local/lib/fpc/2.4.0/ppcppc

i386-freebsd rtl

/usr/local/lib/fpc/2.4.0/units/i386-freebsd/rtl

i386-linux rtl

/usr/local/lib/fpc/2.4.0/units/i386-linux/rtl

(跨操作系统编译)

powerpc-netbsd rtl

/usr/local/lib/fpc/2.4.0/units/powerpc-netbsd/rtl

(跨架构和OS编译,字节顺序)

x86_64-win64 rtl

/usr/local/lib/fpc/2.4.0/units/x86_64-win64/rtl

(cross arch,OS,wordsize)

注: 用于交叉编译 1.9-1.9.4 的库,在 $PREFIX/lib/fpc/$FPCVERSION/cross/$cpu/$target。现在所有平台都完全符合架构标准,不再需要单独的 CPU 目录,FPC 1.9.5 及以上的文件将存储在 $PREFIX/lib/fpc/$FPCVERSION/units。

Windows 和 Dos

Windows 和 DOS 情况几乎相同。除了 Windows 的$FPCTARGET=i386-win32,DOS 的 $FPCTARGET=i386 go32v2。建议避免在目录名中使用空格。虽然(win32)fpc 可以处理它,某些版本的 binutils 和其它工具不能很好的处理空格,需要额外的引号来标记。

这两个操作系统都有一个特定目录,包含所有与 FPC 相关的文件(包括文档等),默认在 c:pp,但自2.0以来已更改为c:fpc2.4.0。这个路径可以称为 $INSTALLDIR,通常情况下,$INSTALLDIR 中没有其它版本。不同的版本意味着不同的 $INSTALLDIR。

所有可执行文件都在 $INSTALLDIRbin$FPCTARGET。这个目录应该在 PATH中。这个目录中有很多文件,它包含了安装的其它工具和实用程序。但是,如果目标为标记为 8.3兼容命名(Go32v2,OS/2),二进制路径将不是 $FPCTARGET(像 bin/i386-go32v2),而是$FPCOS(像bin/go32v2)。

至少在2.0+以下,编译单元在 $INSTALLDIRunits$FPCTARGET,并且更深。

在可执行文件所在的目录($INSTALLDIRbin$FPCTARGET)中搜索配置文件,但是如果 HOME 环境变量也存在配置文件(%HOME%/.fpc.cfg)。

我们假设 $INSTALLDIR=c:fpc2.4.0,默认 $FPCTARGET=win32:

文件

位置

说明

fpc

c:fpc2.4.0bini386-win32

ppc386

c:fpc2.4.0bini386-win32

ppcppc

c:fpc2.4.0bini386-win32

i386-win32 rtl

c:fpc2.4.0unitsi386-win32rtl

(跨架构和OS编译)

i386-linux rtl

c:fpc2.4.0unitsi386-linuxrtl

(跨操作系统编译)

powerpc-netbsd rtl

c:fpc2.4.0unitspowerpc-netbsdrtl

x86_64-win64rtl

c:fpc2.4.0unitsx86_64-win64rtl

Cross binutils

c:fpc2.4.0cross

(默认情况下未安装)

i386-win32 libs

c:fpc2.4.0libsi386-win32

(默认情况下未安装)

i386-linux libs

c:fpc2.4.0libsi386-linux

(默认情况下未安装)

我的units在哪

从更高版本的 FPC 1.9.5开始,fpc makefile 创建一个目录来存储创建的单元。造成这种情况的主要原因是为多个目标构建而不需要进行清理。

所以当刚刚构建(未安装)时,rtl 单元为 fpc/rtl/freebsd/units/$FPCTARGET。这显然不是个好例子,因为 RTL 是平台专用的,这种变化是系统性的,所以对于 RTL 也是如此。