.. index:: single: 目录结构 目录结构 --------------- 基本上 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 替换无关。$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:\fpc\2.4.0。这个路径可以称为 $INSTALLDIR,通常情况下,$INSTALLDIR 中没有其它版本。不同的版本意味着不同的 $INSTALLDIR。 所有可执行文件都在 $INSTALLDIR\bin\$FPCTARGET。这个目录应该在 PATH中。这个目录中有很多文件,它包含了安装的其它工具和实用程序。但是,如果目标为标记为 8.3兼容命名(Go32v2,OS/2),二进制路径将不是 $FPCTARGET(像 bin/i386-go32v2),而是$FPCOS(像bin/go32v2)。 至少在2.0+以下,编译单元在 $INSTALLDIR\units\$FPCTARGET,并且更深。 在可执行文件所在的目录($INSTALLDIR\bin\$FPCTARGET)中搜索配置文件,但是如果 HOME 环境变量也存在配置文件(%HOME%/.fpc.cfg)。 我们假设 $INSTALLDIR=c:\fpc\2.4.0,默认 $FPCTARGET=win32: ======================== ======================================== ============================ 文件 位置 说明 fpc c:\fpc\2.4.0\bin\i386-win32 ppc386 c:\fpc\2.4.0\bin\i386-win32 ppcppc c:\fpc\2.4.0\bin\i386-win32 i386-win32 rtl c:\fpc\2.4.0\units\i386-win32\rtl (跨架构和OS编译) i386-linux rtl c:\fpc\2.4.0\units\i386-linux\rtl (跨操作系统编译) powerpc-netbsd rtl c:\fpc\2.4.0\units\powerpc-netbsd\rtl x86_64-win64rtl c:\fpc\2.4.0\units\x86_64-win64\rtl Cross binutils c:\fpc\2.4.0\cross (默认情况下未安装) i386-win32 libs c:\fpc\2.4.0\libs\i386-win32 (默认情况下未安装) i386-linux libs c:\fpc\2.4.0\libs\i386-linux (默认情况下未安装) ======================== ======================================== ============================ 我的units在哪 ^^^^^^^^^^^^^^^^^^^^ 从更高版本的 FPC 1.9.5开始,fpc makefile 创建一个目录来存储创建的单元。造成这种情况的主要原因是为多个目标构建而不需要进行清理。 所以当刚刚构建(未安装)时,rtl 单元为 fpc/rtl/freebsd/units/$FPCTARGET。这显然不是个好例子,因为 RTL 是平台专用的,这种变化是系统性的,所以对于 RTL 也是如此。