FreeBSD Port 开发者手册
FreeBSD 中文社区
  • FreeBSD Port 开发者手册翻译项目
  • 编辑日志
  • 译者说明
  • FreeBSD Port 开发者手册
    • FreeBSD Port 开发者手册
  • 第1章 简介
    • 1.1.简介
  • 第2章 制作新的 port
    • 2.1.制作新的 port
  • 第3章 简单的 port
    • 3.1.编写 Makefile
    • 3.2.编写描述文件
    • 3.3.创建校验和文件
    • 3.4.测试 port
    • 3.5.用 portlint 来检查 port
    • 3.6.提交新的 port
  • 第4章 复杂的 Port
    • 4.1 Port 工作原理
    • 4.2.获取源代码
    • 4.3.修改 port
    • 4.4.打补丁
    • 4.5.配置
    • 4.6.处理用户输入
  • 第5章 配置 Makefile
    • 5.1.原始来源
    • 5.2.命名
    • 5.3.归类
    • 5.4.源代码包文件
    • 5.5.维护者(MAINTAINER)
    • 5.6.一句话说明(COMMENT)
    • 5.7.项目网站
    • 5.8.许可证
    • 5.9.PORTSCOUT
    • 5.10.依赖
    • 5.11.从属 port 和 MASTERDIR
    • 5.12.man 手册
    • 5.13.info 文件
    • 5.14.Makefile 参数
    • 5.15.特殊的工作目录
    • 5.16.解决冲突
    • 5.17.安装文件
    • 5.18. 使用 BINARY_ALIAS 来重命名命令,而不是在编译中打补丁
  • 第6章 特殊情况
    • 第6章 特殊情况
  • 第7章 Flavors
    • 7.1.Flavors 简介
    • 7.2.使用 FLAVORS
    • 7.3.USES=php 和 Flavors
    • 7.4.USES=python 和 Flavors
    • 7.5.USES=lua 和 Flavors
  • 第8章 高级 pkg-plist 实践
    • 8.1.根据 make 变量对 pkg-plist 进行修改
    • 8.2.空目录
    • 8.3.配置文件
    • 8.4.动态与静态软件包列表
    • 8.5.自动创建软件包列表
    • 8.6.用关键词扩展软件包列表
  • 第9章 pkg-*
    • 9.1.pkg-message(安装二进制包时显示的消息文件)
    • 9.2.pkg-install、pkg-pre-install 和 pkg-post-install(安装二进制包时执行的脚本文件)
    • 9.3.pkg-deinstall、pkg-pre-deinstall 和 pkg-post-deinstall(卸载时执行的脚本文件)
    • 9.4.修改 pkg-* 文件的名字
    • 9.5.使用 SUB_FILES 和 SUB_LIST
  • 第10章 测试 port
    • 10.1.运行 make describe
    • 10.2.运行 make test
    • 10.3.Portclippy / Portfmt
    • 10.4.Portlint
    • 10.5.Port 工具
    • 10.6.PREFIX 和 DESTDIR
    • 10.7.Poudriere
    • 10.8.调试 port
  • 第11章 升级 port
    • 11.1.使用 Git 制作补丁
    • 11.2.UPDATING 和 MOVED
  • 第12章 安全
    • 12.1.安全为何如此重要
    • 12.2.修复安全漏洞
    • 12.3.向社区通报情况
  • 第13章 该做什么和不该做什么
    • 第13章 该做什么和不该做什么
  • 第14章 一个简单的 port
    • 第14章 一个简单的 port
  • 第15章 在 Port Makefile 中变量的顺序
    • 第15章 在 Port Makefile 中变量的顺序
  • 第16章 保持更新
    • 第16章 保持更新
  • 第17章 使用 USES 宏
    • 第17章 使用 USES 宏
  • 第18章 __FreeBSD_version 的值
    • 第18章 __FreeBSD_version 的值
由 GitBook 提供支持

FreeBSD 中文社区

在本页
  • 5.2.1. PORTNAME
  • 5.2.2. 版本,DISTVERSION 或 PORTVERSION
  • 5.2.3. PORTREVISION 和 PORTEPOCH
  • # 5.2.3.1. PORTREVISION
  • # 5.2.3.2. PORTEPOCH
  • # 5.2.3.3. PORTREVISION 和 PORTEPOCH 使用示例
  • 5.2.4. PKGNAMEPREFIX 和 PKGNAMESUFFIX
  • 5.2.5. 包命名规范
  • 5.3. 分类
  • 5.3.1. CATEGORIES
  • 5.3.2. 当前分类列表
  • 5.3.3. 选择正确的分类
  • 5.3.4. 提议新分类
  • 5.3.5. 提议重新组织所有分类

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 第5章 配置 Makefile

5.2.命名

最后更新于2天前

这有帮助吗?

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

5.2.1. PORTNAME

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

重要

包名称必须在整个 Ports 树中唯一。确保 PORTNAME 不被现有的 Port 使用,并且没有其他 Port 使用相同的 PKGBASE。如果该名称已被使用,可以添加 。

5.2.2. 版本,DISTVERSION 或 PORTVERSION

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

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

重要

一次只能设置 PORTVERSION 和 DISTVERSION 其中一个。

有时,某些软件使用的版本方案与 DISTVERSION 在 PORTVERSION 中的转换方式不兼容。

技巧

在更新 Port 时,可以使用 的 -t 参数检查新版本是否大于或小于之前的版本。请参阅 。

示例 1. 使用 比较版本

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 之前,可以理解为“2,修补级别 1”,它是任何 2.X 后但在 3 之前的版本。

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

表 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。

PORTNAME=   nekoto
DISTVERSION=	1.2-4

这将生成 PORTVERSION 为 1.2.4。

示例 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" 或 "pre-release"

当版本包含由点、破折号或下划线分隔的数字,且字母表示“alpha”、"beta" 或 "pre-release"(即,在没有字母的版本之前),使用 DISTVERSION。

PORTNAME=   nekoto
DISTVERSION=	1.2-pre4
PORTNAME=   nekoto
DISTVERSION=	1.2p4
% pkg version -t 1.2.p4 1.2
< 

示例 5. 不使用 DISTVERSION 当版本包含字母表示 "Patch Level"

当版本包含字母,但这些字母不是表示“alpha”、"beta" 或 "pre"(而是表示“修补级别”),且表示的是在没有字母的版本之后,使用 PORTVERSION。

PORTNAME=   nekoto
PORTVERSION=	1.2p4
% pkg version -t 1.2 1.2.p4
> ①
% pkg version -t 1.2 1.2p4
< ②
  • ① 1.2 在 1.2.p4 之后,这在这种情况下是 错误的。

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

5.2.3. PORTREVISION 和 PORTEPOCH

# 5.2.3.1. PORTREVISION

以下是需要增加 PORTREVISION 的示例:

  • 添加补丁以修复安全漏洞、错误或为 Ports 添加新功能。

  • 更改 Ports Makefile 以启用或禁用包中的编译时选项。

  • Ports 的共享库依赖项版本更新(在这种情况下,用户在安装依赖项的新版本后尝试安装旧包将失败,因为它会查找旧的 libfoo.x 而不是 libfoo.(x+1))。

  • 对 Ports 分发文件进行的无声更改,且这些更改具有重要的功能差异。例如,对 distinfo 进行的更改,未更改 DISTVERSION,但通过 diff -ru 命令对旧版和新版进行比较,代码中存在非平凡的差异。

  • 更改 MAINTAINER。

以下是一些不需要增加 PORTREVISION 的更改示例:

  • 对 Ports 骨架的样式更改,没有影响最终包的功能。

  • 更改 MASTER_SITES 或其他 Ports 的功能性更改,不会影响生成的包。

  • 对分发文件进行微小的补丁,如拼写错误修正,这些不重要到需要用户进行升级。

  • 构建修复,使得原本无法编译的包变得可编译。只要这些更改不会在以前能够构建的其他平台上引入功能性变化。由于 PORTREVISION 反映了包的内容,如果包之前无法构建,则不需要增加 PORTREVISION 来标记更改。

一个经验法则是决定是否提交到 Ports 的更改是某些人会受益的。不管是增强功能、修复问题,还是因为新包实际上会正常工作。然后,权衡这一点与这样一个事实,即这会导致所有定期更新 Ports 树的人被迫进行更新。如果是这样,就必须增加 PORTREVISION。

注意

如果没有增加 PORTREVISION,使用二进制包的人 永远 看不到更新。没有增加 PORTREVISION,包构建器无法检测到更改,因此无法重建包。

# 5.2.3.2. PORTEPOCH

有时,软件供应商或 FreeBSD Ports 维护者会做出一些不合逻辑的决定,发布一个实际上在数字上小于之前版本的版本。例如, Ports 可能从 foo-20000801 更新为 foo-1.0(前者会被错误地视为更新版本,因为 20000801 在数字上大于 1)。

技巧

% pkg version -t 0.031 0.29
>

> 输出表示版本 0.031 被认为大于版本 0.29,这一点可能对 Ports 维护者来说并不显而易见。

在这种情况下,必须增加 PORTEPOCH。如果 PORTEPOCH 非零,它会像前述章节中描述的那样附加到包名中。PORTEPOCH 绝不能减少或重置为零,因为这样会导致与先前 epoch 的包比较时出现问题。例如,这个包将无法被检测为过时。尽管新版本号 1.0,1 在数字上仍小于之前的版本 20000801,但是 ,1 后缀会被自动化工具特殊处理并被视为大于先前包中的 ,0 后缀。

预计大多数 Ports 不会使用 PORTEPOCH,通过合理使用 DISTVERSION 或谨慎使用 PORTVERSION,通常可以避免在软件的未来版本更改版本结构时需要使用 PORTEPOCH。然而,当供应商发布没有官方版本号的版本时(例如代码“快照”版本),FreeBSD Ports 维护者需要特别小心。由于有时会将版本标记为发布日期,这会在新“官方”版本发布时引起问题,正如上面的例子所示。

例如,如果在 20000917 发布了一个快照版本,而该软件的先前版本是 1.2,则不应将 20000917 用作 DISTVERSION。正确的做法是使用 1.2.20000917 作为 DISTVERSION,或者类似的格式,这样后续版本(如 1.3)仍然是数字上更大的版本。

# 5.2.3.3. PORTREVISION 和 PORTEPOCH 使用示例

gtkmumble Ports ,版本 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

5.2.5. 包命名规范

这些是命名包时要遵循的规范。目的是使包目录便于扫描,因为目前已经有成千上万个包,如果名称不规范,用户会因此离开!

包名的格式为 语言_地区-名称-编译特性.版本号

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

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

如果 Ports 专用于某个特定地区的语言(例如,某种方言),则还应添加两位字母的国家代码。例如,en_US 表示美式英语,fr_CH 表示瑞士法语。

语言- 部分由 PKGNAMEPREFIX 设置。

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

-编译特性 部分由 PKGNAMESUFFIX 设置。

-.版本号 版本字符串跟随一个连字符(-),并且是由整数和小写字母组成的由句点分隔的列表。特别地,版本字符串中不允许再有其他的连字符。唯一的例外是字符串 pl(表示“补丁级别”),只能在软件没有主版本号和次版本号时使用。如果软件版本中包含类似“alpha”,“beta”,“rc”或“pre”之类的字符串,则取其首字母并直接放在句点后。如果版本字符串在这些名称后继续,则数字紧跟在单个字母后,不会有额外的句点(例如,1.0b2)。

这样做的目的是为了便于通过版本字符串对 Ports 进行排序。特别地,确保版本号的各个部分始终由句点分隔,如果日期是版本字符串的一部分,则使用 dyyyy.mm.dd 格式,而不是 dd.mm.yyyy 或不符合 Y2K 的 yy.mm.dd 格式。如果版本前缀是字母,尤其是 d(表示日期),这样可以防止版本号低于 yyyy 的发布。

重要

以下是一些(真实的)示例,展示了如何将软件作者指定的名称转换为合适的包名。每行只设置了 DISTVERSION 或 PORTVERSION 其中一个,取决于在 Ports 的 Makefile 中使用的是哪一个:

表 2. 包命名示例

发行版名称
PKGNAMEPREFIX
PORTNAME
PKGNAMESUFFIX
DISTVERSION
PORTVERSION
原因或备注

mule-2.2.2

(空)

mule

(空)

2.2.2

无需更改

mule-1.0.1

(空)

mule

1

1.0.1

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

EmiClock-1.0.2

(空)

emiclock

(空)

1.0.2

单个程序名不能使用大写字母

rdist-1.3alpha

(空)

rdist

(空)

1.3alpha

版本将是 1.3.a

es-0.9-beta1

(空)

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

(空)

psutils

-letter

1.13

在包构建时硬编码了纸张大小

pkfonts

(空)

pkfonts

300

1.0

300dpi 字体包

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

技巧

可以使用任何字母。这里的 d 代表日期,如果源是 Git 仓库,通常使用 g 后跟提交日期,使用 s 表示快照也是常见的。

5.3. 分类

5.3.1. CATEGORIES

5.3.2. 当前分类列表

以下是当前的 Port 分类列表。带有星号(*)标记的是 虚拟 分类——这些分类在 Ports 树中没有对应的子目录,仅作为次要分类使用,并且仅用于搜索目的。

注意

对于非虚拟分类,每个子目录的 Makefile 中会有一行描述,描述该分类的作用。

分类
说明
备注

accessibility

帮助残障用户的 Port。

afterstep*

arabic

阿拉伯语语言支持。

archivers

压缩工具。

astro

天文学相关的 Port。

audio

音频支持。

benchmarks

基准测试工具。

biology

生物学相关的软件。

cad

计算机辅助设计工具。

chinese

中文语言支持。

comms

通信软件。

主要是用于与串口通信的软件。

converters

字符编码转换工具。

databases

数据库相关的软件。

deskutils

曾经在计算机发明之前属于桌面上的工具。

devel

开发工具。

不要仅仅因为是库文件就把它们放在这个分类下。除非它们真正不属于其他分类,否则不应放在此分类。

dns

与 DNS 相关的软件。

docs*

FreeBSD 文档的元 Port。

editors

一般文本编辑器。

专用编辑器应放在特定工具的分类中。例如,数学公式编辑器应放在 math 分类中,并将 editors 作为第二分类。

education*

与教育相关的软件。

包括主要或大部分设计用于帮助用户学习特定主题或进行一般学习的应用程序、工具或游戏。还包括课程编写应用程序、课程交付应用程序以及课堂或学校管理应用程序。

elisp*

Emacs-lisp 的 Port。

emulators

其他操作系统的模拟器。

终端模拟器不应放在此分类中。基于 X 的模拟器应放入 x11 分类,基于文本的模拟器应放入 comms 或 misc,具体取决于功能。

enlightenment*

与 Enlightenment 窗口管理器相关的 Port。

finance

与货币、金融相关的应用程序。

french

法语语言支持。

ftp

FTP 客户端和服务器工具。

如果 Port 同时支持 FTP 和 HTTP,应将其放入 ftp 分类,并加上 www 作为第二分类。

games

游戏。

geography*

与地理相关的软件。

german

德语语言支持。

gnome*

gnustep*

与 GNUstep 桌面环境相关的软件。

graphics

图形工具。

hamradio*

无线电爱好者软件。

haskell*

与 Haskell 语言相关的软件。

hebrew

希伯来语语言支持。

hungarian

匈牙利语语言支持。

irc

互联网中继聊天工具。

japanese

日语语言支持。

java

与 Java™ 语言相关的软件。

java 分类不应是 Port 唯一的分类。除非是直接与 Java 语言相关的 Port,否则不鼓励使用 java 作为 Port 的主要分类。

kde*

kde-applications*

kde-frameworks*

kde-plasma*

kld*

可加载的内核模块。

korean

韩语语言支持。

lang

编程语言。

linux*

Linux 应用程序和支持工具。

lisp*

与 Lisp 语言相关的软件。

mail

邮件软件。

mate*

与 MATE 桌面环境相关的 Port,GNOME 2 的一个分支。

math

数值计算软件及其他数学相关工具。

mbone*

MBone 应用程序。

misc

杂项工具。

不属于其他分类的工具。如果可能,尽量为 Port 找到更合适的分类,而不是放在 misc 中,因为该分类中的 Port 往往容易被忽视。

multimedia

多媒体软件。

net

各种网络软件。

net-im

即时通讯软件。

net-mgmt

网络管理软件。

net-p2p

点对点网络应用。

net-vpn*

虚拟私人网络应用。

news

USENET 新闻软件。

parallel*

处理计算中的并行性的应用程序。

pear*

与 Pear PHP 框架相关的 Port。

perl5*

需要 Perl 5 版本运行的 Port。

plan9*

polish

波兰语语言支持。

ports-mgmt

用于管理、安装和开发 FreeBSD Ports 和包的工具。

portuguese

葡萄牙语语言支持。

print

打印软件。

包括桌面出版工具(如预览器等)。

python*

ruby*

rubygems*

russian

俄语语言支持。

scheme*

与 Scheme 语言相关的软件。

science

不适合其他分类的科学相关 Ports,如 astro、biology 和 math。

security

安全工具。

shells

命令行 Shell。

spanish*

西班牙语语言支持。

sysutils

系统工具。

tcl*

使用 Tcl 运行的 Port。

textproc

文本处理工具。

不包括桌面出版工具,这些应放入 print 分类。

tk*

使用 Tk 运行的 Port。

ukrainian

乌克兰语语言支持。

vietnamese

越南语语言支持。

wayland*

支持 Wayland 显示服务器的 Port。

windowmaker*

支持 Window Maker 窗口管理器的 Port。

www

与万维网相关的软件。

HTML 语言支持也应归入此分类。

x11

X 窗口系统及其相关工具。

该分类仅适用于直接支持窗口系统的软件。不要将常规 X 应用程序放入此分类。大多数应放入其他 x11-* 子分类(见下文)。

x11-clocks

X11 时钟工具。

x11-drivers

X11 驱动程序。

x11-fm

X11 文件管理器。

x11-fonts

X11 字体和字体工具。

x11-servers

X11 服务器。

x11-themes

X11 主题。

x11-toolkits

X11 工具包。

x11-wm

X11 窗口管理器。

xfce*

zope*

5.3.3. 选择正确的分类

由于许多分类有重叠,选择哪一个分类作为 Port 的主要分类可能会很繁琐。对此有几个规则。以下是按优先顺序递减的规则:

  • 语言特定的分类总是优先。例如,如果该 Port 安装的是日语 X11 字体,则 CATEGORIES 行应写为 japanese x11-fonts。

  • 特定的分类应列在不太具体的分类之前。例如,一个 HTML 编辑器应该列为 www editors,而不是反过来。并且,如果 Port 属于 irc、mail、news、security 或 www 中的任何一个分类时,不要列出 net,因为 net 已经隐含包含在内。

  • x11 仅在主要分类为自然语言时作为二级分类使用。特别是,不要将 x11 放在 X 应用程序的分类行中。

  • Emacs 模式应放置在与其支持的应用程序相同的 Ports 分类中,而不是放在 editors 中。例如,用于编辑某编程语言源文件的 Emacs 模式应放在 lang 分类下。

  • 安装可加载内核模块的 Ports 也应在 CATEGORIES 行中包含虚拟分类 kld。这可以通过添加 USES=kmod 自动处理。

  • misc 不应与任何其他非虚拟分类一起使用。如果 CATEGORIES 中出现了 misc 和其他分类,那就意味着可以安全地删除 misc,并将 Port 只放在另一个子目录下。

  • 如果该 Port 确实不属于任何其他分类,则将其放入 misc。

5.3.4. 提议新分类

随着 Ports 的不断发展,已经引入了多个新分类。新分类可以是 虚拟 分类——即在 Ports 树中没有对应的子目录的分类——或者是 物理 分类——即有对应子目录的分类。本节讨论了创建新物理分类时涉及的问题。在提议新分类之前,请仔细阅读以下内容。

我们现有的做法是,除非有大量的 Port 明显属于该分类,或者这些 Port 是逻辑上独立的且属于一般兴趣有限的群体(例如与口语人类语言相关的分类),否则避免创建新的物理分类,最好是两者都满足。

以下是提出新物理分类的程序:

  1. 参与讨论。

  2. 如果看起来有支持这一想法的声音,请提交一个 PR,包含新分类的理由和需要迁移的现有 Ports 列表。理想情况下,PR 还应包括以下补丁:

    • 新 Ports 的 Makefile,在它们被复制到新位置后

    • 新分类的 Makefile

    • 旧分类的 Makefile

    • 依赖旧 Ports 的 Makefile

    • (额外的奖励,提供根据提交者指南中程序要求需要更改的其他文件)

提议新虚拟分类与上述类似,但要简单得多,因为实际上不需要迁移任何 Port。在这种情况下,PR 中仅需包含那些将新分类添加到受影响 Port 的 CATEGORIES 的补丁。

5.3.5. 提议重新组织所有分类

偶尔有人提议以 2 层结构或其他某种关键字结构重新组织分类。到目前为止,这些提议没有取得任何进展,因为虽然提出这些提议很容易,但将整个现有 Ports 进行任何形式的重组工作非常庞大,可以说是非常艰巨的任务。在发布此类想法之前,请阅读邮件列表档案中的这些提议的历史记录。此外,准备好接受挑战,提供一个有效的原型。

这两者都会生成 PORTVERSION 为 1.2.p4,它在 1.2 之前。 可用于验证这一点:

在这种情况下,使用 DISTVERSION 是不可行的,因为它会生成 1.2.p4 的版本,这将排在 1.2 之前,而不是之后。 将验证这一点:

对于一些更高级的设置 PORTVERSION 示例,当软件的版本管理方式与 FreeBSD 的版本方案不兼容,或者当分发文件本身不包含版本时,参见 。

PORTREVISION 是一个单调递增的值,每次 DISTVERSION 增加时都会重置为 0,通常是在有新的官方供应商发布版本时。如果 PORTREVISION 非零,则该值会附加到包名中。PORTREVISION 的更改会被自动化工具(如 )用于确定新包是否可用。

每次对 Ports 进行更改,且该更改以某种方式影响生成的包时,都必须增加 PORTREVISION。这包括仅影响具有非默认 的包的更改。

更改包的打包清单或安装时的行为。例如,修改生成初始数据的脚本,如 主机密钥。

版本号比较的结果并不总是显而易见的。可以使用 pkg version(请参见 )来测试两个版本号字符串的比较。例如:

错误地丢弃或重置 PORTEPOCH 会导致不断的麻烦。如果上述讨论不够清晰,请参考 。

两个可选变量,PKGNAMEPREFIX 和 PKGNAMESUFFIX,与 PORTNAME 和 PORTVERSION 结合,形成 PKGNAME,其格式为 ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}。确保它符合我们的。特别地,PORTVERSION 中不允许使用连字符(-)。此外,如果包名中有 language- 或 -compiled.specifics 部分(见下文),则分别使用 PKGNAMEPREFIX 和 PKGNAMESUFFIX,不要将它们作为 PORTNAME 的一部分。

名称 确保 Ports 的名称和版本清晰地分开并放入 PORTNAME 和 DISTVERSION 中。PORTNAME 中包含版本部分的唯一原因是如果上游发行版确实是按该方式命名的,例如 或 Ports 。否则,PORTNAME 中不能包含任何版本特定的信息。多个 Ports 使用相同的 PORTNAME 是很常见的,就像 Ports 那样;在这种情况下,使用 PKGNAMEPREFIX 和 PKGNAMESUFFIX 值来区分不同的版本(以及不同的索引条目)。

-编译特性 如果 Ports 可以通过不同的 来构建(通常是某个 Ports 家族的目录名称的一部分),那么 -compiled.specifics 部分表示已编译的默认值。连字符是可选的。示例包括纸张大小和字体单位。

包名必须在整个 Ports 树中唯一,检查是否已经存在相同的 PORTNAME,如果存在,则添加 之一。

当创建一个包时,它会被放置在 /usr/ports/packages/All 目录下,并且会从 /usr/ports/packages 的一个或多个子目录中创建链接。这些子目录的名称由变量 CATEGORIES 指定。这样做是为了方便用户在 FTP 站点或 CDROM 上浏览成千上万的包时更轻松。请查看 ,选择适合该 Port 的分类。

该列表还决定了 Port 在 Ports 树中的导入位置。如果有多个分类,Port 文件必须放在第一个分类名称的子目录中。更多关于如何选择正确分类的讨论,请参见 。

支持 窗口管理器的 Port。

来自 项目的 Port。

来自 项目的 Port(通用)。

来自 项目的应用程序。

项目的 Qt 编程附加库。

来自 项目的桌面环境。

来自 的各种程序。

与 语言相关的软件。

与 语言相关的软件。

包的 Port。

与 桌面环境相关的 Port。

支持。

第一个分类必须是物理分类(见)。这是为了使打包工作正常进行。虚拟分类和物理分类可以在之后混合使用。

如果分类不明确,请在在 bug 数据库中加入评论,供我们讨论在导入前进行讨论。作为提交者,请向 发送通知,以便我们先进行讨论。很多时候,新的 Ports 被导入到错误的分类中,之后又立即被移动。

这样做的原因是,这样的变更会给 带来相当大的工作量,特别是那些追踪 Ports 变化的用户。此外,提议的分类更改往往会引发争议。(也许这是因为对于分类何时“过大”以及分类是否应便于浏览(因此理想的分类数量是多少)等问题,缺乏明确的共识,等等。)

在 上提议新分类。提供详细的理由,说明现有分类不足之处,并列出拟迁移到该分类的现有 Ports。(如果有在 Bugzilla 中待处理的符合该分类的新 Ports,也请列出。)如果你是维护者和/或提交者,请提及这一点,因为这可能有助于你的提议。

由于它影响 Ports 基础设施,并涉及迁移和补丁许多 Ports,可能还需要在构建集群上运行回归测试,因此请将 PR 分配给 Ports 管理团队 。

如果该 PR 获得批准,提交者将需要按照 中概述的其余程序进行操作。

DISTNAME
PKGNAMEPREFIX 或 PKGNAMESUFFIX
pkg-version(8)
使用
pkg-version(8) 比较版本
pkg-version(8)
pkg-version(8)
pkg-version(8)
DISTNAME
pkg-version(8)
选项
ssh(1)
pkg-version(8)
FreeBSD ports 邮件列表
良好包名指南
textproc/libxml2
japanese/kinput2-freewnn
www/apache*
硬编码默认值
PKGNAMEPREFIX 或 PKGNAMESUFFIX
当前的分类列表
下文
上文
提交 Port 时
FreeBSD Ports 邮件列表
提交者和用户
FreeBSD Ports 邮件列表
portmgr@FreeBSD.org
提交者指南
AfterStep
GNOME
KDE
KDE
KDE
KDE
Plan9
Python
Ruby
RubyGems
Xfce
Zope