5.2.命名
port 的 Makefile 的第一部分命名了 port ,描述了其版本号,并将其列在正确的类别中。
5.2.1. PORTNAME
将 PORTNAME
设置为软件的基本名称。它用作 FreeBSD 软件包的基础名称,并用于 DISTNAME
。
软件包名称在整个 ports 中必须是唯一的。确保 PORTNAME
尚未被现有 port 使用,并且没有其他 port 已经具有相同的 PKGBASE
。如果名称已被使用,则添加 PKGNAMEPREFIX
或 PKGNAMESUFFIX
。
5.2.2. 版本,DISTVERSION 或 PORTVERSION
将 DISTVERSION
设置为软件的版本号。
PORTVERSION
是用于 FreeBSD 软件包的版本。它将从 DISTVERSION
自动派生,以与 FreeBSD 的软件包版本方案兼容。如果版本中包含字母,可能需要设置 PORTVERSION
而不是 DISTVERSION
。
PORTVERSION
和 DISTVERSION
只能同时设置一个。
有时,某些软件将使用与 DISTVERSION
在 PORTVERSION
中的转换不兼容的版本方案。
在更新 port 时,可以使用 pkg-version(8)
的 -t
参数来检查新版本是大于还是小于以前的版本。请参阅使用 pkg-version(8)
进行版本比较。
示例 1. 使用 pkg-version(8)
进行版本比较
pkg version -t
接受两个版本作为参数,如果第一个版本小于、等于或大于第二个版本,它将分别返回 <
、=
或 >
。
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 的示例
DISTVERSION | PORTVERSION |
---|---|
0.7.1d | 0.7.1.d |
10Alpha3 | 10.a3 |
3Beta7-pre2 | 3.b7.p2 |
8:f_17 | 8f.17 |
示例 2. 使用 DISTVERSION
当版本仅包含由点、破折号或下划线分隔的数字时,请使用 DISTVERSION
。
这将生成一个 PORTVERSION
为 1.2.4。
示例 3. 在版本以字母或前缀开头时使用 DISTVERSION
当版本以字母开头或结尾,或者以不是版本的一部分的前缀或后缀开头时,请使用 DISTVERSIONPREFIX
、DISTVERSION
和 DISTVERSIONSUFFIX
。
如果版本是 v1.2-4:
有时,使用 GitHub 的项目会在版本中使用它们的名称。例如,版本可能是 nekoto-1.2-4:
这些项目有时也会在版本末尾使用一些字符串,例如 1.2-4_RELEASE:
或者两者都使用,例如 nekoto-1.2-4_RELEASE:
DISTVERSIONPREFIX
和 DISTVERSIONSUFFIX
在构建 PORTVERSION
时不会被使用,只在构建 DISTNAME
时使用。
所有这些示例都将生成 PORTVERSION
为 1.2.4。
示例 4. 在版本中包含“alpha”、“beta”或“pre-release”时使用 DISTVERSION
当版本包含由点、破折号或下划线分隔的数字,并且使用字母表示“alpha”、“beta”或“pre-release”时,即在不带字母的版本之前,请使用 DISTVERSION
。
两者都将生成一个 PORTVERSION
为 1.2.p4,位于 1.2 之前。pkg-version(8)
可以用于验证这一点:
示例 5. 在版本中包含“Patch Level”字母时不使用 DISTVERSION
当版本中包含不表示“alpha”、“beta”或“pre”,而更多地表示“patch level”的字母,并且在不带字母的版本之后时,请使用 PORTVERSION
。
在这种情况下,使用 DISTVERSION
是不可能的,因为它将生成一个版本为 1.2.p4,该版本会位于 1.2 之前,而不是之后。pkg-version(8)
将验证这一点:
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)
)可以用于测试两个版本号字符串的比较。例如:
>
的输出表示版本 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 中:
PKGNAME 变为 gtkmumble-0.10。
随后发现一个需要在本地 FreeBSD 中修补的安全漏洞。因此,增加了 PORTREVISION
:
PKGNAME 变为 gtkmumble-0.10_1。
供应商发布了一个新版本,版本号为 0.2(事实证明,作者实际上是打算让 0.10 真正意味着 0.1.0,而不是“大于 0.9”——哎呀,现在太晚了)。由于新的小版本 2 在数值上小于先前的版本 10,必须增加 PORTEPOCH
以手动强制将新软件包检测为 "更新"。由于这是代码的新供应商发布,PORTREVISION
被重置为 0(或从 Makefile 中移除):
PKGNAME 变为 gtkmumble-0.2,1。
下一个版本是 0.3。由于 PORTEPOCH
永不减少,版本变量现在为:
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. 软件包命名示例
分发名称 | PKGNAMEPREFIX | PORTNAME | PKGNAMESUFFIX | DISTVERSION | PORTVERSION | 原因或注释 |
---|---|---|---|---|---|---|
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 表示快照也很常见。
最后更新于