5.2.命名

port 的 Makefile 的第一部分将命名 port、描述其版本号并将其列入正确的类别。

5.2.1. PORTNAME

将 PORTNAME 设置为软件的基本名称。它用作 FreeBSD 包的基础,以及 DISTNAME 。

5.2.2。版本, DISTVERSION 或 PORTVERSION

将 DISTVERSION 设置为软件的版本号。

PORTVERSION 是用于 FreeBSD 软件包的版本号。它将自动从 DISTVERSION 派生,以兼容 FreeBSD 的软件包版本方案。如果版本包含字母,可能需要设置 PORTVERSION 而不是 DISTVERSION 。

有时候,一些软件将使用与 DISTVERSION 在 PORTVERSION 中翻译方式不兼容的版本方案。

示例 1. 使用 pkg-version(8) 比较版本

pkg version -t 接受两个版本作为参数,如果第一个版本小于、等于或大于第二个版本,它将分别返回 < 、 = 或 > 。

% pkg version -t 1.2 1.3
< 
% pkg version -t 1.2 1.2
= 
% pkg version -t 1.2 1.2.0
= 
% pkg version -t 1.2 1.2.p1
> 
% pkg version -t 1.2.a1 1.2.b1
< 
% pkg version -t 1.2 1.2p1
< 
1.2 在 1.3 之前。

1.2 和 1.2 相等,因为它们的版本相同。

1.2 和 1.2.0 相等,因为零等于零。

1.2 在 1.2.p1 之后,如 .p1 ,想象“预发布 1”。

1.2.a1 在 1.2.b1 之前,如“alpha”和“beta”,而 a 在 b 之前。

1.2 是在 1.2p1 之前的 2p1 ,可以理解为“2,补丁级别 1”,这是在任何 2.X 之后但在 3 之前的版本。

在这里, a , b 和 p 被用作类似于“alpha”,“beta”或“预发布”和“补丁级别”的含义,但它们只是字母,并按字母顺序排序,因此可以使用任何字母,它们将被适当排序。

表 1. DISTVERSION 的示例和衍生 PORTVERSION

DISTVERSIONPORTVERSION

0.7.1d

0.7.1.d

10Alpha3

10。a3

3Beta7-pre2

3.b7.p2

8:f_17

8f.17

Example 2. 使用 DISTVERSION

当版本仅包含由点、破折号或下划线分隔的数字时,请使用 DISTVERSION 。

PORTNAME=   nekoto
DISTVERSION=	1.2-4

它将生成 1.2.4 的 PORTVERSION 。

例 3。 使用 DISTVERSION 当版本以字母或前缀开头时

当版本以字母开头或结尾,或前缀或后缀不是版本的一部分时,请使用 DISTVERSIONPREFIX 、 DISTVERSION 和 DISTVERSIONSUFFIX 。

如果版本是 v1.2-4 :

PORTNAME=   nekoto
DISTVERSIONPREFIX=  v
DISTVERSION=	1_2_4

有时,使用 GitHub 的项目会在其版本中使用他们的名称。例如,版本可能是 nekoto-1.2-4 :

PORTNAME=   nekoto
DISTVERSIONPREFIX=  nekoto-
DISTVERSION=	1.2_4

这些项目有时候在版本末尾也会使用一些字符串,例如, 1.2-4_RELEASE :

PORTNAME=   nekoto
DISTVERSION=	1.2-4
DISTVERSIONSUFFIX=  _RELEASE

或者它们两者都会,例如, nekoto-1.2-4_RELEASE :

PORTNAME=   nekoto
DISTVERSIONPREFIX=  nekoto-
DISTVERSION=	1.2-4
DISTVERSIONSUFFIX=  _RELEASE

DISTVERSIONPREFIX 和 DISTVERSIONSUFFIX 在构建 PORTVERSION 时不会被使用,而只在 DISTNAME 中使用。

所有都会生成 PORTVERSION 的 1.2.4 。

例 4. 使用 DISTVERSION 意味着版本包含字母"alpha"、"beta"或"预发布"

当版本包含以点、破折号或下划线分隔的数字,并且使用字母表示"alpha"、"beta"或"预发布",即在不带字母的版本之前,使用 DISTVERSION 。

PORTNAME=   nekoto
DISTVERSION=	1.2-pre4
PORTNAME=   nekoto
DISTVERSION=	1.2p4

两者都会生成 PORTVERSION 的 1.2.p4 ,这比 1.2 更早。pkg-version(8) 可以用来检查这个事实:

% pkg version -t 1.2.p4 1.2
<

例 5. 当版本包含字母时,意味着 “补丁级别” 时不使用 DISTVERSION 。

当版本包含不是指“alpha”、“beta”或“pre”而是更多地表示“补丁级别”的字母,且表示该字母之后的版本,使用 PORTVERSION 。

PORTNAME=   nekoto
PORTVERSION=	1.2p4

在这种情况下,使用 DISTVERSION 是不可能的,因为它会生成一个在 1.2 之前而不是之后的 1.2.p4 版本。pkg-version(8)会验证这一点:

% pkg version -t 1.2 1.2.p4
> 
% pkg version -t 1.2 1.2p4
< 
1.2 在 1.2.p4 之后,这在这种情况下是错误的。

1.2 在 1.2p4 之前,这正是所需的。

对于一些更高级的示例,当软件的版本与 FreeBSD 的确不兼容时,或者当发行文件不包含版本本身时,请参见。

5.2.3。 PORTREVISION 和 PORTEPOCH

5.2.3.1. PORTREVISION

PORTREVISION 是一个单调递增的值,每次增加 DISTVERSION 时都会重置为 0,通常在每次有新的官方供应商发布时。如果 PORTREVISION 非零,则该值将附加到软件包名称上。对 PORTREVISION 的更改由像 pkg-version(8)这样的自动化工具使用,以确定是否有新的软件包可用。

每次对影响生成软件包的port的更改必须增加 PORTREVISION 。这包括仅影响使用非默认选项构建的软件包的更改。

PORTREVISION 必须提升的示例情况:

  • 添加补丁以修复安全漏洞、错误或向port添加新功能的情况。

  • 更改 port 的 Makefile,以启用或禁用软件包的编译时选项。

  • 更改软件包的打包列表或安装时行为。例如,更改生成软件包初始数据的脚本,如 ssh(1) 主机密钥的脚本。

  • 提升 port 的共享库依赖版本(在这种情况下,安装旧软件包后尝试安装更新版本的依赖库将失败,因为它将寻找旧的 libfoo.x 而不是 libfoo.(x+1))。

  • 具有重大功能差异的port distfile 的静默更改。例如,对 distfile 的更改需要对 distinfo 进行更正,但旧版本和新版本的 DISTVERSION 没有相应的更改,显示代码的重大更改。

  • 对 MAINTAINER 的更改。

不需要 PORTREVISION 增量的示例更改:

  • 对 port 骨架的样式更改,对生成的软件包没有功能上的影响。

  • 对 MASTER_SITES 或其他对 port 有功能影响但不影响生成软件包的更改。

  • 对 distfile 的琐碎补丁,如拼写错误的更正,这些不重要到用户必须费力升级的程度。

  • 修复构建问题,使软件包在先前无法通过编译的情况下能够通过编译。只要更改不会在软件先前已构建的任何其他平台上引入任何功能更改。由于 PORTREVISION 反映了软件包的内容,如果软件包先前无法构建,则无需增加 PORTREVISION 来标记更改。

一个经验法则是决定提交给port的更改是否会使一些人受益。不管是因为增强、修复,还是由于新的软件包实际上是否会起作用。然后将其与那个事实权衡是否会导致每个定期更新其ports树的人都被迫进行更新。如果是的话,必须增加 PORTREVISION 。

5.2.3.2. PORTEPOCH

有时,软件供应商或 FreeBSD porter 会做一些愚蠢的事情,发布的新版软件实际上比以前的版本数值上更小。例如,这是一个 port 的例子,从 foo-20000801 变为 foo-1.0(前者将被错误地视为更新版本,因为 20000801 在数值上大于 1)。

% pkg version -t 0.031 0.29
>

的输出表明版本 0.031 被认为大于版本 0.29,这对于 porter 来说可能并不明显。

在这种情况下, PORTEPOCH 必须增加。如果 PORTEPOCH 非零,它会如上节第 0 节所述附加到软件包名称后面。 PORTEPOCH 永远不能减少或重置为零,因为这会导致与更早时期的软件包比较失败。例如,软件包将不会被检测为过时。新版本号,在上例中的 1.0,1 ,数值上仍然小于之前的版本 20000801,但自动工具会特别对待 ,1 后缀,并发现其大于之前软件包的隐含后缀 ,0 。

PORTEPOCH 重置错误地导致了无尽的痛苦。如果上述讨论不够清晰,请参阅 FreeBSD ports 邮件列表。

预期 PORTEPOCH 将不会用于 ports 的大部分情况下,明智地使用 DISTVERSION ,或者小心地使用 PORTVERSION ,往往可以在软件的未来版本结构变化时预防必要的情况。然而,FreeBSD porter 在供应商发布没有官方版本号的情况下(例如代码“快照”发布)需要小心。诱因是用发布日期标记发布,这会在新的“官方”版本发布时造成问题,如上例所示。

例如,如果在 20000917 发布了一个快照版本,并且软件的上一个版本是版本 1.2 ,不要为 DISTVERSION 使用 20000917 。正确的方式是 DISTVERSION 的 1.2.20000917 ,或类似方式,使得后续发布,如 1.3 ,仍然是一个数字上更大的值。

5.2.3.3. PORTREVISION 和 PORTEPOCH 用法示例

gtkmumble port中,版本 0.10 ,致力于ports收藏品:

PORTNAME=	gtkmumble
DISTVERSION=	0.10

PKGNAME 变成 gtkmumble-0.10 。

发现一个安全漏洞,需要本地 FreeBSD 补丁。 PORTREVISION 相应地升级。

PORTNAME=	gtkmumble
DISTVERSION=	0.10
PORTREVISION=	1

PKGNAME 变为 gtkmumble-0.10_1

供应商发布了一个新版本,编号为 0.2 (事实证明作者实际上意图将 0.10 实际意味着 0.1.0 ,而不是“0.9 之后的内容” - 哎呀,现在为时已晚)。由于新的次要版本 2 数字上小于之前的版本 10 ,必须手动将 PORTEPOCH 提升,以强制检测新软件包为“更新”。由于这是代码的新供应商发布, PORTREVISION 被重置为 0(或从 Makefile 中删除)。

PORTNAME=	gtkmumble
DISTVERSION=	0.2
PORTEPOCH=	1

PKGNAME 变成 gtkmumble-0.2,1

下一个版本是 0.3. 因为 PORTEPOCH 从未减少,版本变量现在是:

PORTNAME=	gtkmumble
DISTVERSION=	0.3
PORTEPOCH=	1

PKGNAME 变成 gtkmumble-0.3,1

5.2.4. PKGNAMEPREFIX 和 PKGNAMESUFFIX

两个可选变量, PKGNAMEPREFIX 和 PKGNAMESUFFIX ,与 PORTNAME 和 PORTVERSION 结合形成 PKGNAME ,如 ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} 。请确保这符合我们的良好软件包命名准则。特别是,在 PORTVERSION 中使用连字符( - )是不允许的。另外,如果软件包名称具有语言或编译特定部分(请查看下文),请使用 PKGNAMEPREFIX 和 PKGNAMESUFFIX ,分别。不要将它们作为 PORTNAME 的一部分。

5.2.5。包命名约定

这些是命名包时要遵循的约定。这是为了使包目录易于扫描,因为已经有成千上万个包,如果他们伤害他们的眼睛,用户将会离开!

包名称采用语言_区域-名称-已编译.具体-版本.数字 的形式。

包名被定义为 ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} 。确保设置变量符合该格式。

语言_地区-

FreeBSD 致力于支持其用户的母语。当port特定于某种语言时,“语言_”部分是由 ISO-639 定义的自然语言的两字母缩写。例如, ja 代表日语, ru 代表俄语, vi 代表越南语, zh 代表中文, ko 代表韩语, de 代表德语。

如果 port 特定于语言区域内的某个区域,请添加两位国家代码。例如, en_US 代表美式英语, fr_CH 代表瑞士法语。

语言部分设置在 PKGNAMEPREFIX 。

名字

确保 port 的名称和版本明确定义并放置在 PORTNAME 和 DISTVERSION 处。 PORTNAME 的唯一原因包含版本部分是如果上游分发真的是以这种方式命名,如 textproc/libxml2 或 japanese/kinput2-freewnn ports。否则, PORTNAME 不能包含任何特定版本信息。几个 ports 具有相同 PORTNAME 是相当正常的,就像 www/apache* ports 一样;在这种情况下,通过 PKGNAMEPREFIX 和 PKGNAMESUFFIX 值来区分不同版本(和不同的索引条目)是很自然的。

有一个传统,即通过在前面加上 p5- 并将双冒号分隔符转换为连字符来对 Perl 5 模块进行命名。例如, Data::Dumper 模块变成为 p5-Data-Dumper 。

-compiled.specifics

如果port可以用不同的硬编码默认值构建(通常是ports系列中的目录名称的一部分),则-compiled.specifics 部分表示编译默认值。连字符是可选的。示例包括纸张尺寸和字体单位。

-compiled.specifics 部分设置为 PKGNAMESUFFIX 。

-版本.号

版本字符串遵循短横线( - )并且是由整数和单个小写字母组成的以句点分隔的列表。特别是,版本字符串内部不允许有另一个短横线。唯一的例外是字符串 pl (表示“补丁级”),只能在软件中没有主版本号和次版本号时使用。如果软件版本中包含“alpha”、“beta”、“rc”或“pre”之类的字符串,取第一个字母并立即放在句点之后。如果在这些名称之后还有版本字符串,则数字跟在单个字母后面,而它们之间不需要额外的句点(例如, 1.0b2 )。

这个想法是通过查看版本字符串使ports更容易排序。特别是,请确保版本号组件始终由句点分隔,并且如果日期是字符串的一部分,请使用 dyyyy.mm.dd 格式,而不是 dd.mm.yyyy 或非 Y2K 兼容的 yy.mm.dd 格式。很重要的是用一个字母(这里 d )作为版本的前缀,以防发布具有实际版本号的版本,这个版本号在数字上小于 yyyy

这里有一些(真实的)示例,说明如何将软件作者称之为的名称转换为适当的软件包名称,对于每行,仅在 DISTVERSION 或 PORTVERSION 中的一个设置,取决于在port的 Makefile 中将使用哪个:

表 2。软件包命名示例

软件包名称PKGNAMEPREFIXPORTNAMEPKGNAMESUFFIXDISTVERSIONPORTVERSION原因或评论

mule-2.2.2

(空)

mule

(空)

2.2.2

无需更改

mule-1.0.1

(空)

mule

1

1.0.1

这是 mule 的第一个版本,第二个版本已经存在

EmiClock-1.0.2

(空)

emiclock

(空)

1.0.2

单个程序不使用大写名称

rdist-1.3alpha

(空)

rdist

(空白)

1.3alpha

版本将会是 1.3.a

es-0.9-beta1

(empty)

es

(空)

0.9-beta1

版本将是 0.9.b1

mailman-2.0rc3

(空白)

mailman

(空)

2.0rc3

版本将是 2.0.r3

v3.3beta021.src

(空白)

tiff

(空白)

3.3

到底是什么意思?

tvtwm

(空白)

tvtwm

(空白)

p11

文件名中没有版本号,请使用上游指定的版本号

piewm

(空)

piewm

(空)

1.0

文件名中没有版本,使用上游所说的版本

xvgr-2.10pl1

(空)

xvgr

(空)

2.10.pl1

在这种情况下, pl1 表示补丁级别,因此不能使用 DISTVERSION。

gawk-2.15.6

ja-

gawk

(空)

2.15.6

日文版

psutils-1.13

(empty)

psutils

-letter

1.13

软件包构建时硬编码的纸张大小

pkfonts

(空白)

pkfonts

300

1.0

300dpi 字体包

如果原始来源中绝对没有版本信息的痕迹,并且原作者不太可能发布另一个版本,则只需将版本字符串设置为 1.0 (如上面的 piewm 示例)。否则,请询问原作者或使用源文件发布的日期字符串( dyyyy.mm.dd ,或 dyyyymmdd )作为版本。

最后更新于

FreeBSD 中文社区 2024