5.2.命名

port 的 Makefile 的第一部分命名了 port ,描述了其版本号,并将其列在正确的类别中。

5.2.1. PORTNAME

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

软件包名称在整个 ports 中必须是唯一的。确保 PORTNAME 尚未被现有 port 使用,并且没有其他 port 已经具有相同的 PKGBASE。如果名称已被使用,则添加 PKGNAMEPREFIXPKGNAMESUFFIX

5.2.2. 版本,DISTVERSION 或 PORTVERSION

DISTVERSION 设置为软件的版本号。

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

PORTVERSIONDISTVERSION 只能同时设置一个。

有时,某些软件将使用与 DISTVERSIONPORTVERSION 中的转换不兼容的版本方案。

在更新 port 时,可以使用 pkg-version(8)-t 参数来检查新版本是大于还是小于以前的版本。请参阅使用 pkg-version(8) 进行版本比较。

示例 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" 或“预发布”和“patch level”的意思,但它们只是字母,按字母顺序排列,因此可以使用任何字母,它们将被适当地排序。

表 1. DISTVERSION 和派生 PORTVERSION 的示例

DISTVERSIONPORTVERSION

0.7.1d

0.7.1.d

10Alpha3

10.a3

3Beta7-pre2

3.b7.p2

8:f_17

8f.17

示例 2. 使用 DISTVERSION

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

PORTNAME=   nekoto
DISTVERSION= 1.2-4

这将生成一个 PORTVERSION 为 1.2.4。

示例 3. 在版本以字母或前缀开头时使用 DISTVERSION

当版本以字母开头或结尾,或者以不是版本的一部分的前缀或后缀开头时,请使用 DISTVERSIONPREFIXDISTVERSIONDISTVERSIONSUFFIX

如果版本是 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

DISTVERSIONPREFIXDISTVERSIONSUFFIX 在构建 PORTVERSION 时不会被使用,只在构建 DISTNAME 时使用。

所有这些示例都将生成 PORTVERSION 为 1.2.4。

示例 4. 在版本中包含“alpha”、“beta”或“pre-release”时使用 DISTVERSION

当版本包含由点、破折号或下划线分隔的数字,并且使用字母表示“alpha”、“beta”或“pre-release”时,即在不带字母的版本之前,请使用 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. 在版本中包含“Patch Level”字母时不使用 DISTVERSION

当版本中包含不表示“alpha”、“beta”或“pre”,而更多地表示“patch level”的字母,并且在不带字母的版本之后时,请使用 PORTVERSION

PORTNAME=   nekoto
PORTVERSION= 1.2p4

在这种情况下,使用 DISTVERSION 是不可能的,因为它将生成一个版本为 1.2.p4,该版本会位于 1.2 之前,而不是之后。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 之前,这正是所需的。

对于一些更高级的 PORTVERSION 设置示例,当软件的版本控制与 FreeBSD 不兼容时,或者在发行文件中不包含版本本身时,请参阅 DISTNAME

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 进行相应更改,在旧版本和新版本之间进行 diff -ru 将显示代码的非平凡变化。

  • 对 MAINTAINER 的更改。

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

  • 对 port 框架进行样式更改,对生成的软件包中的内容没有功能上的更改。

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

不重要到用户需要进行升级的程度的 distfile 的微不足道的修补程序,例如拼写错误的更正。

使软件包变得可编译,在以前编译失败的情况下。只要更改不会在之前构建 port 的其他平台上引入任何功能上的更改。由于 PORTREVISION 反映了软件包的内容,如果软件包以前无法构建,则无需增加 PORTREVISION 来标记更改。

一个经验法则是决定提交到 port 的更改是否有一些人会受益。无论是因为增强、修复,还是由于新软件包实际上将能够正常工作。然后权衡一下,这将迫使定期更新其 ports 的每个人都必须更新。如果是,就必须增加 PORTREVISION

如果不增加 PORTREVISION,使用二进制软件包的用户将永远看不到更新。如果不增加 PORTREVISION,软件包构建者将无法检测到更改,因此不会重新构建软件包。

5.2.3.2. PORTEPOCH

不时地,软件供应商或 FreeBSD 的开发人员会做一些愚蠢的事情,发布的软件版本实际上比先前的版本小。例如,一个 port 从 foo-20000801 到 foo-1.0(前者将被错误地视为新版本,因为 20000801 比 1 大)。

版本号比较的结果并不总是明显的。pkg version(参见 pkg-version(8))可以用于测试两个版本号字符串的比较。例如:

% pkg version -t 0.031 0.29
>

> 的输出表示版本 0.031 被认为比版本 0.29 更大,这对于开发人员可能不是很明显。

在这种情况下,必须增加 PORTEPOCH。如果 PORTEPOCH 不为零,它将被追加到软件包名称中,如上文所述。PORTEPOCH 永远不能减少或重置为零,因为这会导致与先前时代的软件包进行比较失败。例如,软件包将无法检测是否过时。上述示例中的新版本号 1.0,1 在数值上仍然小于先前的版本号 20000801,但是自动化工具会特殊处理后缀 ,1,并发现它比先前软件包的暗示后缀 ,0 更大。

错误地删除或重置 PORTEPOCH 会导致各种麻烦。如果上面的讨论不够清楚,请咨询 FreeBSD port 邮件列表。

预计 PORTEPOCH 不会用于大多数 port ,合理使用 DISTVERSION,或者仔细使用 PORTVERSION,通常可以在软件未来的发布更改版本结构时避免它变得必要。但是,当供应商发布没有官方版本号的版本(例如代码“快照”发布)时,FreeBSD 的开发人员需要格外小心。诱惑是用发布日期标记发布,但当进行新的 "官方" 发布时,这将会导致问题。

例如,如果在日期 20000917 上进行了快照发布,而软件的先前版本是版本 1.2,则不要使用 20000917 作为 DISTVERSION。正确的方式是将 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。

如果在此升级中将 PORTEPOCH 重置为 0,那么安装了 gtkmumble-0.10_1 软件包的用户将无法将 gtkmumble-0.3 软件包检测为更新,因为 3 在数值上仍然小于 10。记住,这正是 PORTEPOCH 的目的。

5.2.4. PKGNAMEPREFIX 和 PKGNAMESUFFIX

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

5.2.5. 软件包命名规则

下面是命名软件包时要遵循的约定。这是为了使软件包目录易于扫描,因为已经有成千上万个软件包,如果让用户感到眼花缭乱,他们可能会转身离开!

软件包名称采用语言_地区-名称-编译.具体信息-版本.数字 的形式。

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

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

如果 port 特定于语言区域内的某个特定地区,则还要添加两个字母的国家代码。例如,en_US 表示美国英语,fr_CH 表示瑞士法语。

语言_部分在 PKGNAMEPREFIX 中设置。

名称 确保 port 的名称和版本清晰分离,并分别放在 PORTNAME 和 DISTVERSION 中。PORTNAME 之所以包含版本部分,唯一的原因是如果上游发行版实际上是以这种方式命名的,就像 textproc/libxml2 或 japanese/kinput2-freewnn port 一样。否则,PORTNAME 不能包含任何版本特定信息。很正常地,几个 port 可能有相同的 PORTNAME,就像 www/apache* port 一样;在这种情况下,不同的版本(和不同的索引条目)通过 PKGNAMEPREFIX 和 PKGNAMESUFFIX 值进行区分。

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

-编译.具体信息 如果 port 可以使用不同的硬编码默认值构建(通常是一组 port 的目录名的一部分),则-编译.具体信息部分指定了编译默认值。连字符是可选的。示例是纸张大小和字体单位。

-编译.具体信息部分在 PKGNAMESUFFIX 中设置。

-版本.数字 版本字符串在连字符(-)之后,是由整数和小写字母组成的以句点分隔的列表。特别地,版本字符串内部不允许有另一个连字符。唯一的例外是字符串 pl(表示“补丁级别”),仅当软件中没有主版本和次版本号时才可以使用。如果软件版本包含像 "alpha"、"beta"、"rc" 或 "pre" 这样的字符串,请取第一个字母,并将其紧接在句点后。如果版本字符串在这些名称之后继续,数字将在单个字母之后,它们之间没有额外的句点(例如,1.0b2)。

这样做的目的是通过查看版本字符串更容易对 port 进行排序。特别地,确保版本号组件始终由句点分隔,并且如果日期是字符串的一部分,则使用 dyyyy.mm.dd 格式,而不是 dd.mm.yyyy 或不符合 Y2K 的 yy.mm.dd 格式。重要的是要在版本之前加上一个字母,这里是 d(表示日期),以防实际版本号的发布小于 yyyy。

软件包名称在整个 ports 中必须是唯一的,检查是否已经存在具有相同 PORTNAME 的 port ,如果存在,则添加 PKGNAMEPREFIX 或 PKGNAMESUFFIX 中的其中之一。

以下是一些(真实的)示例,说明如何将软件作者所称的名称转换为适合的软件包名称。对于每一行,根据将在 port 的 Makefile 中使用的变量设置了 DISTVERSION 或 PORTVERSION 之一:

表 2. 软件包命名示例

分发名称PKGNAMEPREFIXPORTNAMEPKGNAMESUFFIXDISTVERSIONPORTVERSION原因或注释

mule-2.2.2

(空)

mule

(空)

2.2.2

2.2.2

无需更改

mule-1.0.1

(空)

mule

1

1.0.1

1.0.1

这是 mule 的版本 1,版本 2 已存在

EmiClock-1.0.2

(空)

emiclock

(空)

1.0.2

1.0.2

单个程序不使用大写名称

rdist-1.3alpha

(空)

rdist

(空)

1.3alpha

1.3alpha

版本将为 1.3.a

es-0.9-beta1

(空)

es

(空)

0.9-beta1

0.9-beta1

版本将为 0.9.b1

mailman-2.0rc3

(空)

mailman

(空)

2.0rc3

2.0rc3

版本将为 2.0.r3

v3.3beta021.src

(空)

tiff

(空)

3.3

3.3

到底是什么玩意?

tvtwm

(空)

tvtwm

(空)

p11

p11

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

piewm

(空)

piewm

(空)

1.0

1.0

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

xvgr-2.10pl1

(空)

xvgr

(空)

2.10.pl1

2.10.pl1

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

gawk-2.15.6

ja-

gawk

(空)

2.15.6

2.15.6

日语语言版本

psutils-1.13

(空)

psutils

-letter

1.13

1.13

纸张大小在构建时硬编码

pkfonts

(空)

pkfonts

300

1.0

1.0

用于 300dpi 字体的软件包

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

使用任何字母。在这里,d 代表日期,如果源是 Git 存储库,则通常使用 g,后面跟随提交日期,使用 s 表示快照也很常见。

最后更新于

FreeBSD 中文社区