Fink

打包 - 2. 软件包描述文件

2.1 文件树结构

软件包描述文件保存在 /sw/fink/dists 目录树内的 finkinfo 目录中。 /sw/etc/fink.conf 中的 "Trees" 设置控制会控制应该读取那个目录。 软件包描述文件的名字必须要软件包全名加上 ".info" 扩展名组成。 从 fink 0.13.0 开始,为了简化软件包的升级,也可以允许简单地使用软件包加 ".info" 来组成。 As of fink 0.26.0, there are several different ways to specify the filename: it is recommended to use the shortest version which is consistent with other needed package files. The filename takes the form: the invariant packagename, optionally followed by the architecture, optionally followed by the distribution, optionally followed by either version or version-revision, each delimited by hyphens, concluding with ".info". The "architecture" and "distribution" components are only allowed if the corresponding field is present in the package, and if it specifies exactly one value.

到软件包描述文件的目录树由几层目录组成。 自上而下顺序为:

2.2 文件格式

描述文件只是键-值对的简单列表,一个键-值对有时也称为一个“字段”。 每一行由一个以冒号(:)为结束的键开始,然后跟着是相对应的值,就象这样:

Key: Value

当你需要把一个分成几行书写的时候,可以有两种标记办法。

推荐的方式是通常用于在 shell 脚本 here-document 语法。这种方法第一行是键,然后跟着以 << 为它的取值。 在这之后,在下一个 << 之前的所有行会被视作实际的取值。 下面是一个例子:

InstallScript: <<
mkdir -p %i/share/man
make install prefix=%i mandir=%i/share/man
mkdir -p %i/share/doc/%n
install -m 644 COPYING %i/share/doc/%n
<<

在这种格式下,缩进是可选的,但它可以改进可阅读性。

这种 here-document 语法格式可以嵌套使用。这通常使用于 SplitOffSplitOffN 字段。 这些字段包含其它字段(多行),因此通过这种语法可以使得子字段也可以具有多行。在子的 here-document 块中同样使用的 << 作为终结符。 下面是一个例子:

SplitOff: <<
  Package: %N-shlibs
  InstallScript: <<
    ln -s %p/lib/libfoo.2.dylib %i/lib/libfoo.%v.dylib
  <<
<<

另外一种旧的,已经过时的标记方法是参照 RFC 822 数据包头的分行方式。 以空白字符开始的行会被当作上一行的继续。 例子:

InstallScript: mkdir -p %i/share/man
 make install prefix=%i mandir=%i/share/man
 mkdir -p %i/share/doc/%n
 install -m 644 COPYING %i/share/doc/%n

注意上面续行中强制要求的缩进格式。

在两种格式中,空行或以井号(#)打头的行都会被忽略。 键(字段名)在 Fink 中是区分大小写的,你可以随便使用 InstallScriptinstallscriptINSTALLSCRIPT。 不过,建议使用首字母大写的方式以方便阅读。 对于那些使用布尔值的字段-"true","yes","on","1"(不区分大小写),都会被认为是真值,而其它的值则会被认为是假值。

2.3 百分号展开

为了简化一些书写,Fink 在一些字段中支持一套展开(替换)规则。 为了避免含混,你可以使用大括号来指明确切是那些字母需要作为百分号展开。 例如,%{n}%n 的含义是一样的。 目前支持的展开包括:

%n

当前软件包的名字(name)

%N

父软件包的名字(Name),除非在 SplitOff 中,否则应该和 %n 相同

注意:如果父 Package 字段包含 %type_*[],那些百分号扩展的值被包括在 SplitOff 块的 %N 中(因为它们被包括在父字段的 %n 中)。

%e

软件包的额外版本标识(epoch)。它主要用于强行替代版本号的顺序,比方说你现在已经有一个 2.0Beta1 版,然后现在 2.0 版出来了,显然 2.0 版应该是一个更新的版本。但是 字符串比较的结果却是 2.0Beta1 < 2.0。所以,要么你只能把 2.0 命名为 2.0Final,要么你使用 epoch 来强行制定版本的先后顺序。比方说:epcho 1, version 1.0 是一个比 epcho 0, version 2.0 更新的版本。

%v

软件包的版本号(version)

%V

the full package Version, which automatically includes the Epoch if present. Note that this percent expansion is only available for packages whose InfoN level is at least 4.

%r

软件包的修订版号(revision)

%f

完整的(full)软件包名,即 %n-%v-%r. Note that the Epoch is not part of %f.

%p, %P

the prefix where Fink is installed, e.g. /sw. You must not assume all users have Fink installed in /sw; use %p to ge the correct path.

%d

要打包的全套文件将被构建于的目标(destination)目录,例如: /sw/src/fink.build/root-gimp-1.2.1-1。 这个临时目录在编译过程的安装阶段将作为根目录位置。 你不应该假设 root-%f 会在 %p/src 中,因为用户可以通过 /sw/etc/fink.conf 文件中的 Buildpath 字段来改变它的位置。

%D

父文件包的目标(Destination)目录(除非是在 SplitOff 中,否则和 %d 相同)

%i

安装态(install-phase)的完整路径前缀,等于 %d%p。安装态是指从源代码编译安装到临时位置后的状态,然后我们需要把它封装成 .deb 包。

%I

父软件包的安装(Install)态路径前缀,等于 %D%P(除非是 SplitOff 中,否则应该和 %i 相等)

%a

补丁(patches)程序所在的路径

%b

构建(build)过程所在的目录,例如:/sw/src/fink.build/gimp-1.2.1-1/gimp-1.2.1。 你不应该假设 %f 一定在 %p/src 中,因为用户可以通过 /sw/etc/fink.conf 文件中的 Buildpath 字段来改变它。 最内部的目录根据 Source 文件名来命名,或是 SourceDirectory 字段(如果存在的话)的值,或在 NoSourceDirectorytrue 的时候不使用它。

注意:仅在没有其它选择的情况下才使用它。构建目录是脚本运行的当前目录;在命令中你应该使用相对路径。

%c

configure 命令将使用的参数:--prefix=%p 加上 ConfigureParams 指定的其它参数。 (The behavior is different when the package has Type: perl; in that case, the default flags for building a perl package are used instead of --prefix=%p in the definition of %c.)

%m

机器(machine)体系架构类型字符串,这和 uname -p 的输出一致。目前 'powerpc' 代表 ppc 类的计算机,'i386' 代表 x86 类(在 0.12.1 之后的一个 CVS 版本开始引入)

%%

百分号字符(它部分展开后面跟着它的东西)。展开严格按照从左到右的顺序进行,所以 %%n 和软件包名没有关系,而只是字符串 %n。(从 fink-0.18.0 开始引入)

%type_raw[类型], %type_pkg[类型], %type_num[类型]

对给定类型返回的代表子类型的伪哈希值。 查阅本文档后面关于 Type 字段的内容。 _raw 形式表明使用子类型字符串的精确形式, _pkg 形式表明使用去除句点之后的形式(就好象 Fink 的语言版本软件包的命名约定一样)。(在 fink 的 CVS 0.19.2 后版本中引入)。 The _num form was introduced in fink-0.26.0 and removes all non-digits from the Type field.

%{ni}, %{Ni}

软件包的固定名称(name invariant)部分。 它们和 %n 和 %N 类似,除了所有 %type_pkg[] 和 %type_raw[] 被去掉。 (在 fink 的 CVS 0.19.2 后版本中引入)。 你应该使用 %{ni} 和 %{Ni} 以避免与 %n 和 %N 扩展相混淆。

%{default_script}

Valid only in PatchScript, CompileScript, and InstallScript fields, the default contents of that type of field. The value is often dependent on the Type field, and is always defined (though it may be blank). When used in the InstallScript of a SplitOff (or SplitOffN), this expansion will yield the parent's default, even though the default for InstallScript in a SplitOff package is blank. (Introduced in fink-0.20.6)

%{PatchFile}

The full path to the file given in the PatchFile field. (Introduced in fink-0.24.12)

%lib

If Type: -64bit is defined to be -64bit, this expands to lib/ppc64 on powerpc machines, and to lib/x86_64 on intel machines (the proper storage locations for 64-bit libraries); otherwise, this expands to lib. (Introduced in fink-0.26.0)

Note that %lib is not permitted in the ConfigureParams field unless the InfoN level is at least 4.

Next: 3. 打包相关规则