LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3212|回复: 2

FreeBSD Porter's Handbook中译本<转贴, 未整理>

[复制链接]
发表于 2003-10-22 23:17:55 | 显示全部楼层 |阅读模式
FreeBSD Porter's Handbook中译本
FreeBSD文档项目
Copyright © 2000, 2001, 2002 by The FreeBSD Documentation Project
译者:cjacker and his girl friend jennifer

译者前言:
一直很遗憾没有太多的中国人参加到自由软件的开发队伍,以至于自由软件在对中文的支持上出现了很多的问题.所以,翻译了这个文档.希望能对使用FreeBSD并且准备在FreeBSD上进行开发的朋友有一点帮助.
我的女朋友帮助我翻译完成这个文档,一直以来,给了我很大的支持和鼓励.
在翻译时,尽可能的保存了原著的排版风格,可能有些地方表达的不是很好(希望你能体谅毕竟,这时我第一次进行这样的翻译工作),请您见谅.
最后,将这个工作成果献给我和jennifer的父母.请您在转载时保留我们的孝心.
email:cjacker@263.net come from esquel.


内容列表
1 自己动手创建port
2 简单的porting工作
2.1 创建Makefile
2.2 创建描述文件
2.2.1 pkg-comment
2.2.2 pkg-descr
2.2.3 pkg-plist
2.3 创建checksum文件
2.4 测试port
2.5 使用portlint检查port
2.6 提交port
3 复杂的porting工作
3.1 原理
3.2 获取源代码
3.3 修改源代码
3.4 打补丁
3.5 Configuring
3.6 处理用户输入
4 详细介绍Makefile
4.1 程序源代码
4.2 PORTNAME和PORTVERSION
4.3 PORTREVISION和PORTEPOCH
4.3.1 PORTREVISION
4.3.2 PORTEPOCH
4.3.3 一个PORTREVISION和PORTEPOCH的例子
4.4 PKGNAMEPREFIX和PKGNAMESUFFIX
4.5 DISTNAME
4.6 CATEGORIES
4.7 MASTER_SITES
4.8 PATCHFILES
4.9 MAINTAINER
4.10 依赖性
4.10.1 LIB_DEPENDS
4.10.2 RUN_DEPENDS
4.10.3 BUILD_DEPENDS
4.10.4 FETCH_DEPENDS
4.10.5 DEPENDS
4.10.6 通用的依赖性变量
4.10.7 依赖性注意事项
4.11 可选的依赖性
4.12 编译机制
5 特殊的情况
5.1 共享库
6 MASTERDIR
7 共享lib的版本
8 Man pages
9 依赖Motif的port
9.1 REQUIRES_MOTIF
9.2 MOTIFLIB
10 X11字体
11 Info文件
12 pkg-*文件 files
12.1 pkg-message
12.2 pkg-install
12.3 pkg-req
12.4 基于make的变量修改pkg-plist
12.5 改变pkg-*文件的名字
13 许可证问题
14 升级
15 应该做的和不该做的
15.1 Strip二进制文件
15.2 INSTALL_*宏定义
15.3 WRKDIR
15.4 WRKDIRPREFIX
15.5 区分操作系统和版本
15.6 在bsd.port.mk之后添加...
15.7 安装额外的文档
15.8 DIST_SUBDIR
15.9 包信息
15.10 RCS字符串
15.11 递归的diff
15.12 PREFIX
15.13 子目录
15.14 清除空目录
15.15 有关UID
15.16 理性的工作
15.17 有关CFLAGS
15.18 配置文件
15.19 Portlint
15.20 反馈
15.21 关于README.html
15.22 其他
15.23 如果你还不能继续...
16 一个简单的Makefile
17 自动创建pkg_plist文件
18 软件包的命名
19 port类别
19.1 现有的port类别列表
19.2 选择正确的port类别
20 关于本文档和port系统的变化
21 就到这里了

第一章.自己动手创建port
现在,你有兴趣创建一个自己的port或者升级一个已有的port?那将是一件很伟大的事情!下文的内容是创建一个新的FreeBSDport的指导,如果你要升级已有的port,你应该在看完这些内容后再读一下第十四章.
因为这个文档不是很详细,你应该参考一下/usr/ports/Mk/bsd.port.mk文件,这个文件在任何一个FreeBSD的port的Makefile中包含.即使你不是每天去摆弄Makefile,你也应该读一读,能够从里面获得很多的知识.顺便提一下,如果你有其他的问题,可以向<freebsd-ports@FreeBSD.org>这个mail list发信.
注意: 本文档中提到的变量大部分在bsd.port.mk文件开头定义,是不可修改的.这个文件使用了特殊的跳格符,EMACS和VIM可以在打开文件时正确的识别,如果使用vi或ex,请运行:set tabstop=4.

第二章.简单的port工作

2.1 创建Makefile
2.2 创建描述文件
2.3 创建checksum文件
2.4 测试port
2.5 使用portlint检查port
2.6 提交port
这一章主要讲述怎样去快速简单的创建一个port,在很多时候,这点内容是不够的.
首先获得源文件的tar包,放在DISTDIR,缺省是/usr/ports/distfiles.
提示: 下面的内容假定你不需要修改源代码就可以编译通过.如果你要修改一些代码,请参看下一章
2.1 创建Makefile
最简单的Makefile看起来像这个样子:

    # New ports collection makefile for:   oneko
    # Date created:        5 December 1994
    # Whom:                asami
    #
    # $FreeBSD$
    #
   
    PORTNAME=      oneko
    PORTVERSION=   1.1b
    CATEGORIES=    games
    MASTER_SITES=  ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
   
    MAINTAINER=    asami@FreeBSD.org
   
    MAN1=          oneko.1
    MANCOMPRESSED= yes
    USE_IMAKE=     yes
   
    .include <bsd.port.mk>
您应该可以看懂.不要担心$FreeBSD$一行, 当这个port被import进我们的主port树时,CVS会自动填写.您可以在Makefile的例子 一章获得更多的内容
2.2 创建描述文件
有三个描述性文件pkg-comment pkg-descr pkg-plist,以pkg开头与其他的文件区分开.
2.2.1 pkg-comment
对port一行的描述.不要包含包的名字或版本.这个文件以大写字母开头不以标点结尾.例子:
    A cat chasing a mouse all over the screen
2.2.2 pkg-descr
这是一个较长的描述文件,使用几段文字详细的描述这个port.
注意: 这并不是如何使用或编译的手册.如果你是从README或man page中拷贝的,一定要注意格式.如果你port的软件源代码有web site,请在这里注明.
建议你在最后留下您的名字,例子:

    This is a port of oneko, in which a cat chases a poor mouse all over
    the screen.
     :
    (etc.)
   
    WWW: http://www.oneko.org/
   
    - Satoshi
    asami@cs.berkeley.edu
2.2.3 pkg-plist
这个文件列出了port安装的所有文件.之所以称之为"packing list"是因为最后的pkg安装包制作就是将所列的文件打包.路径与安装的prefix相关(通常是/usr/local 或/usr/X11R6). 如果你使用的MAN*变量,不要在这里列出MAN page.
这里是一个简单的例子:

    bin/oneko
    lib/X11/app-defaults/Oneko
    lib/X11/oneko/cat1.xpm
    lib/X11/oneko/cat2.xpm
    lib/X11/oneko/mouse.xpm
    @dirrm lib/X11/oneko
参考pkg_create(1)的man page以获得更多的信息.
注意: 你应该列出所有的文件而不仅仅是目录名.如果这个port创建了目录,一定要加入@dirrm一行以便在删除port时,可以将目录清除.
推荐你将本文件中的文件名排序,可以方便你的port升级.
手动创建一个pkg_plist文件可能是一件很困难的事情.如果这个port安装了太多的文件.请参考 自动创建pkg_plist ,可以节省一些时间.
2.3 创建checksum文件
  键入make makesum会自动创建distinfo文件,或者
  md5 port.tar包>distinfo,然后在拷贝这个distinfo文件.

2.4 测试port
你应当确定你的port确实做到了你希望的事情.包括打包.有一些工作你要检查:
pkg-plist 没有包含任何你不想安装的文件
pkg-plist 包含所有应该安装的文件
你的port可以使用reinstall多次安装
你的port可以在deinstall后自动清除
推荐的测试顺序
1.make install
2.make package
3.make deinstall
4.pkg_add package_name
5.make deinstall
6.make reinstall
7.make package
确定在任何package和deinstall段没有警告.第三步要检查所有新创建目录是否自动删除.同时,第四步之后,实际的使用一下软件检查他是否工作.

2.5 使用portlint检查port
请使用portlint测试你的port是否符合规范.portlint程序是ports收集的一部分.一般你应该检查你的Makefile 格式和package的命名是否符合规范.

2.6 提交port
首先请阅读应该做的和不该做的 一节
现在你很满意你的port,剩下的工作是提交port以便其他人也可以使用.我们不需要你的work目录,和打好的pkgname.tgz包.所以你可以删除他们.然后在一个bug报告中包含shar `find port_dir`的结果并使用send-pr(1) 程序提交(参看Bug Reports and General Commentary 以获得
send-pr(1)
HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=send-pr&sektion=1"的更多信息.如果未压缩的port超过20K,你应该压缩为tar包并在包含在bug报告之前使用 HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=uuencode&sektion=1"uuencode(1) (虽然小于20k的bug报告也可以使用uuencoded tar包,但我们并不推荐.). 一定要将这个bug报告归类到ports和
class-request.Be sure to classify the bug report as category ports and class change-request.在PR的Description填写一个简单的描述同时将
shar或unicoded tar包加到Fix一格.
再提一次,不要包含源文件,work目录,和已经打好的package.
注意: 以前我们请您提交到ftp.freebsd.org.因为大量的暂时文件我们已经关闭了incoming的可读权限,所以不推荐你使用这种方式提交.
在你提交port之后,请耐心的等待,可能很快也可能很长时间才能包含在FreeBSD发行中.你可以察看HYPERLINK "http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports" \n _top等待加入FreeBSD的port.一旦我们看到你的port,我们可能会跟您联系.并且你的名字会出现在FreeBSD Handbook中的其他FreeBSD的贡献者:-)
提示: 如果你使用好的报告格式,你可以使我们的工作更加的简单.如对于新的port``New port: <short description of the port>'' 升级port``Update port: <category>/<port> <short description of the update>''.如果你注意到这一点,可能你的port很快会出现在...

第三章.复杂的porting工作
内容列表
3.1 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/c198.html" \l "AEN201"原理
3.2 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x290.html"获取源代码
3.3 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x317.html"修改源代码
3.4 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x326.html"打补丁
3.5 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x343.html"Configuring
3.6 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x351.html"处理用户输入
好了,现在的工作不是那么的简单,port需要一些修改才能在FreeBSD平台运行.在这一章里,我们将一步一步的介绍怎样完成这些工作.
3.1 原理
当使用者在您的port目录输入make命令时,发生了一系列的事情,如果你读一下bsd.port.mk可能有助于你的理解.
也不用担心你不理解这个文件,很多人是不理解的:-)
1.fetch行为将会被执行,首先检查DISTDIR存不存在需要的tar包,如果没有fetch就会到Makefile中定义的参数URL_MASTER_SITES去取回,包括我们的FTPHYPERLINK "ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/" \n _topftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/,在那里我们备份了所有获得认可的port.如果成功的连接并取回需要的tar包,就会把他放在DISTDIR,缺省为/usr/ports/distfiles.
2.extract行为会被执行,他会在DISTDIR中寻找你的tar包,并解开到WRKDIR,缺省为work目录.
3.接下来patch行为会被执行,首先Makefile中定义的PATCHFILES会被patch.然后如果在PATCHDIR(缺声为files目录)中存在patch-*文件,也会被按照文件名的先后应用.
4.configure行为会被执行,这里有几种情况:
a.如果存在scripts/configure,首先执行.
b.如果Makefile中定义了HAS_CONFIGURE或GNU_CONFIGURE,则WRKSRC/configure会被执行
c.如果Makefile中定义了USE_IMAKE,XMKMF(缺省为xmkmf -a)
4.build行为会被执行.进入WRKSRC目录编译.如果Makefile中定义了USE_GMAKE,GNU make会被使用.否则使用make命令.
以上行为是系统缺省的.你可以定义pre-*和post-*或者把以此命名的脚本放在scrpts目录,他会在缺省行为之前或之后执行.
举个例子,如果你在Makefile中定义了post-extract, 还建立了scripts目录, 放入一个脚本pre-build. pre-build.那么,在解开tar包后,post-extract会被调用,同样,pre-build会在编译之前调用.推荐你在Makefile 中定义所有的行为(如果不是很复杂),这样使用者可能更容易知道您作了什么.
缺省的行为由bsd.port.mk定义.举个例子,extract行为由do-extract定义,如果你对缺省的定义不满意,可以自己在Makefile中定义do-something.

注意:几个主要的行为(如,extract,configure等)负责调用相关的脚本,最好不要修改缺省的4个行为
好了,现在你明白port到底是怎么回事了.我们就可以继续深入的学习.

3.2 获取源代码
   取回源代码的tar包(如tar.gz或tar.Z等等)放到DISTDIR.最好使用那种主流的普遍的版本:-)
  如果你不能获得一个很好的ftp/http站点或者格式不兼容.你可以将一份拷贝放在自己的FTP或HTTP服务器,确定Makefile中的MASTER_SITES的参数准确的指向他.
如果你找不到可靠的地方,你可以放在我们的FTP,必须放在某个用户的/public_ditfiles/,所以你必须和这个用户联系,请他帮助你提交,同 时Makefile中的MASTER_SITES,MASTER_SITE_LOCAL,MASTER_SITE_SUBDIR也会指向他的目录.
如果你的port使用了网络上的一些patch,请把他们放在DISTDIR.不要担心他们跟源代码不是来自同一个网站.我们会有办法处理(参看HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-patchfiles.html"补丁文件 一章).

3.3 修改源代码
解开tar包,对源代码做出合理的修改使他在相应版本的FreeBSD系统运行.你一定要记住做出了那些修改,这些修改在你以后的port中都会以patch和脚本的形式出现并且你的修改要求可以通过这些文件自动完成.
如果你的port需要在编译安装的过程中与使用者交互,你可以看一下
Larry Wall的一些经典的Configure 脚本,请牢记port的目的是为了使用最小的用户空间做到软件的即插即用
注意: 除非特殊的声明,否则你提交的脚本 补丁 和任何你创建的文件将被假定为以标准的BSD版权发布.
3.4 打补丁
在你的port中,一些源文件的添加和修改都可以用diff做成补丁.同时按照字母顺序将这些补丁命名
patch-*
在使用时可以按照顺序的将补丁打上.如果你愿意,也可以使用以要patch的文件名为补丁命名,如命名
patch-imakefile
等,这些文件必须保存在PATCHDIR目录,系统可以在这个目录找到他们.所有的patch应当关联于WRKSRC(通常你的源码会解在这里),你应当避免多于一个的patch去修改同一个文件(如,patch-aa和patch-ab都修改WRKSRC/foobar.c)

3.5 Configuring
任何其他的自定义的命令可以放到scripts目录的configure文件(参看以前的configure文件的执行顺序).当然也可以在Makefile中定义和/或使用pre-configure或post-configure
3.6 处理用户输入
如果你的port需要用户输入,可以在Makefile中设置IS_INTERACTIVE.这样使用者在设置BATCH环境变量后在系统负载低的情况下编译"overnight  build"时可以跳过你的port而不是停在那里.如果使用者设置了INTERACTION环境变量,只有那些需要交互的port会被编译.
同时也推荐如果有缺省的可靠选项,你应该检查PACKAGE_BUILD环境变量(如果这个变量被设置,你可以关闭交互的脚本而使用缺省选项)

第4章.详细介绍Makefile
内容列表
4.1 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/c361.html" \l "AEN366"程序源代码
4.2 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x382.html"ORTNAME和PORTVERSION
4.3 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x389.html"ORTREVISION和PORTEPOCH
4.4 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x486.html"KGNAMEPREFIX和PKGNAMESUFFIX
4.5 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x505.html"DISTNAME
4.6 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x533.html"CATEGORIES
4.7 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x545.html"MASTER_SITES
4.8 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-patchfiles.html"ATCHFILES
4.9 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x594.html"MAINTAINER
4.10 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x601.html"依赖性
4.11 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x732.html"可选的依赖
4.12 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x753.html"编译机制
创建Makefile是一件很简单的事请.我们建议你看一下已有的例子和本手册的HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-samplem.html"Makefile例子 ,然后按照本章的内容读下去.
4.1 程序的源代码
放在DISTDIR(缺省为/usr/ports/distfiles目录)里的是标准的gzip包?如果是,请略过这一节,如果不是.你应当按照需要设置Makefile中的这些变量ISTNAME, EXTRACT_CMD EXTRACT_BEFORE_ARGS EXTRACT_AFTER_ARGS EXTRACT_SUFX DISTFILES.(最通常的情况是EXTRACT_SUFX=.tar.Z,使用compress压缩而不是gzip)
最糟糕的情况是,自己重新定义do-extract覆盖掉原来的定义.

4.2 PORTNAME和PORTVERSION
你应该设置PORTNAME为port的基本名,PORTVERSION为port的版本

4.3 PORTREVISION和PORTEPOCH
4.3.1 PORTREVISION
PORTREVISION是一个增加的数字(可以理解为port的次版本号),以下划线连接,当PORTVERSION增加时会被置为0,每一次对同版本的port修改时,PORTREVISION都要增加.
PORTREVISION应当被修改的情况:
添加新的补丁修正bug或添加新的功能.
修改了Makefile的编译时选项.
pkg-plist的修改或安装时行为的修改.(例如,改变ssh的脚本,初始化ssh host key)
一个port的依赖共享库版本改变.(这种情况,在安装了一个新版本后再安装老版本会出错.因为他要依赖老的libfoo.x而不是libfoo.(x+1)).
对port的distfiles的改变.比如,因为port的源代码新版本和旧版本之间存在微不足道的改变,我们只需要修改distinfo而不需要修改PORTVERSION.
不需要修改PORTREVISION的例子:
port结构的风格改变(如文件安装位置的变化)但没有功能的增加.
MASTER_SITES的改变或虽然有port功能的改变但不影响最后打成的包.
微不足道的对distfile的格式的修改,但对使用者而言没有任何升级的麻烦.
使一个port可编译(以前是失败的),而没有新功能的加入.既然PORTREVISION影响包的内容,如果先前没有可编译的包,当然也就不需要修改PORTREVISION来表示变化.
一个原则是:他人持有你修改过的port时受益(如,增强,修改等),如果是,PORTREVISION需要修改以明确表示一个新的port已经诞生.
4.3.2 PORTEPOCH
很长一段时间,软件商或FreeBSD的porter存在表示版本的数字上讲新的port小于旧port的情况,如从foo-20000801更新到foo-1.0.因为20000801大于1,所以会让人产生误解.
在这种情况下,PORTEPOCH应当增加.如果PORTEPOCH不为0,就应当加到包名字的后面(以逗号分割).PORTEPOCH不会降低或重置为0.如上面例子应该是foo-1.0,1 .虽然数字仍然小于20000801,但",1"的后缀表示这是一个比没有后缀的port更新的版本.
希望大家不要使用PORTEPOCH.使用了PORTEPOCH表示以后这个port的源代码可能会改变版本号的结构
举个例子,如果一个snapshot版本的发布日期是20000917,而它的前一个版本是1.2,那么这个版本应当为1.2.20000917,而不是20000917,那么新的版本1.3发布后,仍然保持了版本号的增加.
4.3.3 PORTREVISION和PORTEPOCH使用的例子
gtkmumble port, 版本0.10提交
    PORTNAME=  gtkmumble
    PORTVERSION=    0.10
PKGNAME是gtkmumble-0.10
一个安全漏洞被发现,添加新的patch.修改PORTREVISION.
PORTNAME= gtkmumble
PORTVERSIOn= 0.10
PORTREVISION= 1
PKGNAME变成gtkmumble-0.10_1
一个新的版本发布,为0.2(看来上一个版本应当是0.1.0,而不是来自0.9:-)).因为新版本的0.2小于已有的0.10.这是需要设置一个PORTEPOCH同时PORTREVISION置为0.
    PORTNAME=  gtkmumble
    PORTVERSION=    0.2
    PORTEPOCH=  1
PKGNAME变成gtkmumble-0.2,1
下一个版本是0.3.因为PORTEPOCH是不会降低的.版本号应该是:
    PORTNAME=  gtkmumble
    PORTVERSION=    0.3
    PORTEPOCH=  1
PKGNAME变成gtkmumble-0.3,1
注意: 如果这里的PORTEPOCH置为0,安装了gtkmumble-0.10_1的使用者不会发现gtkmumble-0.3是新的版本,因为0.3小于0.10.
4.4 PKGNAMEPREFIX 和 PKGNAMESUFFIX
两个可选的变量,PKGNAMEPREFIX和PKGNAMESUFFIX可以于PORTNAME和PORTVERSION配合使用形成如:
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}的PKGNAME.
请确定符合 我们的HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-pkgname.html"软件命名规范. 通常不允许在版本号中使用连字符
(-).如果一个软件包名有
language-

compiled.specifics
部分,请使用PKGNAMEPREFIX和PKGNAMESUFFIX.不要把他们直接加到PORTNAME中.
4.5 DISTNAME
DISTNAME是port源代码的作者对软件的命名.缺省为${PORTNAME}-${PORTVERSION}, 只在两个地方使用.
1.软件发布列表(DISTFILES)缺省为 ${DISTNAME}${EXTRACT_SUFX}.
2.在编译时会将软件解开到WRKSRC目录缺省为work/${DISTNAME}
注意: PKGNAMEPREFIX和PKGNAMESUFFIX并不影响DISTNAME.应当注意当WRKSRC为work/${PORTNAME}-$ {PORTVERSION},而软件发布的名字不是${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}时,就不要设置 DISTNAME,应当设置DISTFILES.而不是设置DISTNAME,WRKSRC或许还有EXTRACT_SUFX.
4.6 CATEGORIES
当软件包被创建,他会放在/usr/ports/packages/All.并从/usr/ports/packages下建立连接.这里子目录的命名有CATEGORIES定义.可能使我们的工作更加的清晰而不是面临一大堆杂乱的软件包.请花时间看一下已有的HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-categories.html"categories 从中选择一个适合你的port的类别.
这个变量也定义了你的port导入port树时的位置.如果你定义了多个类别,会被导入第一个.参看HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-categories.html"categories 一章正确的选择你的port类别.
如果你的port部署予以有的任何类别,你可以建立一个新类.请向<HYPERLINK "mailto:freebsd-ports@FreeBSD.org"freebsd-ports@FreeBSD.org>这个邮件列表发信申请.

4.7 MASTER_SITES
在MASTER_SITES变量指定源代码tar包的FTP/http的URL(不要忘记"/").
如果在本地系统没有找到需要的源文件,FETCH会到指定的URL取回tar包.
考虑网络的因素,建议你多加几个地址,我们甚至考虑加入最近地址的判断.
如果源文件的tar包来自像X,GNU,perl CPAN之类的地址.你可以简单的把你的MASTER_SITES定义为MASTER_SITE_*(如,MASTER_SITE_XCONTRIB MASTER_SITE_PERL_GNU等).
    MASTER_SITES=         ${MASTER_SITE_XCONTRIB}
    MASTER_SITE_SUBDIR=   applications
这些MASTER_SITE_*已经在/usr/ports/Mk/bsd.port.mk中预先定义了.
使用者也可以在/etc/make.conf中设置MASTER_SITE_*而覆盖我们原来的定义.

4.8 PATCHFILES
如果你的port需要从ftp/http取回需要的patch.请在PATCHFILES设置patch名,并设置PATCH_SITES指向可用的URL(格式跟MASTER_SITES相同).
如果patch包含了其他的一些额外路径,而不是相对路径.比如:在patch中没个文件前有路径名fooolix-1.0/.那么需要设置PATCH_DIST_STRIP=-pl..
不要担心patch会被压缩.如果是以.gz或.Z结尾的会自动的解压.
如果patch和其他一些文件一起压成tar包,你就不能在如上定义了,应当在DISTFILES中定义patch包名,并定义MASTER_SITES. 并使用EXTRACT_PATCHES指向这些文件,bsd.port.mk会自动解开并打补丁.一般不要拷贝patch文件到PATCHDIR(缺省为 files目录).
注意: 如果这个patch的tar包是gzip或Z.那么不需要额外的工作.注意设置pre-clean将patch的拷贝清除

4.9 MAINTAINER(维护者)
请在这个变量填写你的email地址

4.10 依赖性
可能你的port依赖其他的port.这里有5个环境变量可以用来定义.
4.10.1 LIB_DEPENDS
这个变量定义依赖的共享库.格式为lib:dir[:target],其中lib是共享库的名字,dir定义如果系统没有安装应该到哪里寻找.target定义了那个目录的行为.
     LIB_DEPENDS=
                  jpeg.9{PORTSDIR}/graphics/jpeg:install
将检查jpeg主版本为9的共享库,如果系统中没有安装就到graphics/jpeg下编译并安装,如果target=DEPENDS_TARGET(缺省为install)target可以省略掉
注意: lib 部分是传给ldconfig -r|grep -wF的参数.不要包含任何正则表达式.
依赖性要检查两次,在extract时和install时.并且在打包时依赖信息会打进包里.
4.10.2 RUN_DEPENDS
这个变量指定port在运行是依赖的文件(普通文件或可执行文件).以path:dir[:target]给出.path是可执行文件名,dir是当系统没有安装时的寻找目录,target是那个目录的行为.如果路径以"/"开头,那么会被认为是普通文件,使用test -e检查是否存在.否则,被认为是可执行文件,使用-s检查是否处于用户的系统路径.
举个例子:
    RUN_DEPENDS=   ${PREFIX}/etc/innd{PORTSDIR}/news/inn \
                   wish8.0{PORTSDIR}/x11-toolkits/tk80
将检查/usr/local/etc/innd是否存在(文件或目录),如果系统中不存在,会到news/inn子目录编译并安装.同样要检查可执行文件wish8.0是否在用户路径存在,如果不存在.到x11-toolkits/tk80目录编译并安装.
注意: 这里的innd实际是可执行的,如果在普通用户的路径不存在,则要使用完整路径.
这个依赖在install时检查.同样当target=DEPENDS_TARGET时,target可省略.并且在打包时依赖信息会打进包里.
4.10.3 BUILD_DEPENDS
这个变量定义在BUILD时的依赖文件或可执行文件.跟RUN_DEPENDS一样的格式.举个例子:
     BUILD_DEPENDS=
                  unzip{PORTSDIR}/archivers/unzip

注意: 这里的"build"指从解压到编译.
4.10.4 FETCH_DEPENDS
这个变量定义了FETCH的依赖性.格式和上面相同
     FETCH_DEPENDS=
                  ncftp2{PORTSDIR}/net/ncftp2
4.10.5 DEPENDS
如果你的port的依赖关系不属于上面列出的4类,或者你的port只需要解开其他的port源码而不需安装.可以定义这个变量.格式为dir:[:target],没有检查的过程.同样如果target=DEPENDS_TARGET可省略.
4.10.6 通用的定义依赖性变量
如 果你的port依赖于X window定义USE_XLIB=yes(暗指USE_IMAKE).如果你的port依赖gmake而不是系统make,定义
USE_GMAKE= yes
如果你的port需要使用autoconf,定义USE_AUTOCONF=yes.如果你的port依赖QT,可以定义
USE_QT=yes. 同样如果你的port依赖perl 5
应该定义USE_PERL5=yes(这是很重要的,因为有些版本的FreeBSD的基本系统安装了perl5,而有些没有)
4.10.7 依赖性注意事项
上面提到的target可以省略,是因为target=DEPENDS_TARGET(install),这是一个用户变量,没有在Makefile中定义,如果你需要一个特殊的target,不要重新定义DEPENDS_TARGET,而是在*_DEPENDS中详细指明target.
当你
make clean
时,所有的依赖关系也会被自动清除.如果你不想这样,定义NOCLEANDEPENDS环境变量.
无条件的依赖其他的port,请在BUILD_DEPENDS或RUN_DEPENDS的第一格定义${NONEXISTENT},只有你在使用其它port的source时定义他.使用这个变量也可以节省编译时间.举个例子:
    BUILD_DEPENDS=   ${NONEXISTENT}{PORTSDIR}/graphics/jpeg:extract
将转到jpeg并解开.万不得已,不要定义DEPENDS.因为他总是要编译依赖的port(缺省要安装),并且这个依赖关系要打进pkg包.
4.11 可选的依赖关系
一些很大的软件发布有很多的配置方式,当一些依赖关系满足时就可以提供更多的功能.但是并不是每个使用者都需要这样.所以port系统提供了多种选择,也就是提供一个软件的多种port.
最简单的例子是定义WITHOUT_X11.如果一个软件可以在有或没有X的情况下编译,通常会依赖X编译,如果定义了WITHOUT_X11,那么没有X也可以编译.
很多GNOME的应用程序也具有这样的特点.用起来可能困难一点,在Makefile中定义WANT_*和HAVE_*.如果这个程序可以在有或没有下列 WANT_*的情况下编译,那么应该在Makefile中设置WANT_
  • ,如果HAVE_
  • 定义了会编译生成一个使用
  • 的版本(
  • 代表 下面列出的)
    WANT_*现在有WANT_GLIB,WANT_GTK,WANT_ESOUND,WANT_IMLIB,WANT_GNOME.

    4.12 编译机制
    如果你的port使用GNU make,设置USE_GMAKE=yes.如果你的port使用configure,设置HAS_CONFIGURE=yes.如果你的port使用GNU configure,设置GNU_CONFIGURE=yes.如果你希望提供给configure 一些特殊的参数(缺省的参数是 对GNU configure 是--prefix=${PREFIX},对非GNU configure为空),设置CONFIGURE_ARGS变量.如果你的port使用GNU autoconf,设置USE_AUTOCONF=yes.
    如果你的port是X程序,需要使用imake从Imakefile中生成Makefile设置USE_IMAKE=yes,会调用xmkmf -a.如果 -a 参数不能在你的port中使用,设置XMKMF=xmkmf.如果你的port需要使用imake但不理解install.man行为,设置NO_INSTALL_MANPAGES=yes.
    如果源代码的Makefile中不使用all而还有其他的方式才能完全编译(如,make;make data),设置ALL_TARGET.同样的道理如果install时也要额外的方式(如,make install;make data-install),设置INSTALL_TARGET.


    第5章.特殊情况
    有一些你在创建port时的特殊情况,我们在这里提一下.
    5.1 Shared Libraries(共享库)
    如果你的port安装了一个或多个共享库,请定义INSTALLS_SHLIB make变量,在post-install时他会调用bsd.port.mk运行${LDCONFIG} -m,同样你也应当适当的在你的pkg-plist中定义一组@exec /sbin/ldconfig -m和@unexec /sbin/ldconfig -R.那么用户可以在安装之后马上就使用并且卸载软件包后系统也不会认为这些共享库仍然存在.
    如果你需要把共享库安装在缺省的位置之外,可以定义LDCONFIG_DIRS变量,包含安装共享库的目录列表.举个例子:如果你的port安装了共享库到PREFIX/lib/foo和PREFIX/lib/bar目录.你可以在Makefile中如下设置:
        INSTALLS_SHLIB= yes
        LDCONFIG_DIRS=  %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar
    注意这里LDCONFIG_DIRS的内容要使用HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=sed&sektion=1"sed(1)过滤,所以PLIST_SUB置换也会应用.推荐你使用%%PREFIX%%代替PREFIX,%%LOCALBASE%%代替LOCALBSE,%%X11BASE%%代替X11BASE.

    第6章.MASTERDIR
    如果你的port可以根据一些参数(如,纸张大小)的不同生成不同的包,为每个包创建一个目录是较好的,但应该尽可能的共享较多的文件.通常你只需要每个目录有一个简单的Makefile而不是每个目录都有一个完整的Makefile.在这个Makefile中,你可以使用MASTERDIR变量指定要共享 的文件.也要定义一个HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-pkgname.html"KGNAMESUFFIX 来表明不同的包.
    这里有一个很好的范例,是japanese/xdvi300/Makefile的一部分:
        PORTNAME=       xdvi
        PORTVERSION=    17
        PKGNAMEPREFIX=  ja-
        PKGNAMESUFFIX=  ${RESOLUTION}
         :
        # default
        RESOLUTION?=   300
        .if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
               ${RESOLUTION} != 300 && ${RESOLUTION} != 400
               @${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
               @${ECHO} "ossible values are: 118, 240, 300 (default) and 400."
               @${FALSE}
        .endif
    HYPERLINK "http://www.FreeBSD.org/cgi/url.cgi?ports/japanese/xdvi300/pkg-descr"japanese/xdvi300 也使用通常的patch等等.如果你输入make命令,会按照缺省的变量值resolution=300编译这个port.
    对于其他的resolution值,这里是完整的xdvi118/Makefile:
        RESOLUTION=     118
        MASTERDIR=      ${.CURDIR}/../xdvi300
       
        .include "${MASTERDIR}/Makefile"
    MASTERDIR告诉bsd.port.mk像FILEDIR和SCRIPTDIR可以在xdvi300中找到.RESOLUTION=118将覆盖RESOLUTION=300的定义,生成resolution=118的包.

    第7章.共享库的版本
    请参阅开发者手册中的HYPERLINK "http://freebsd.sinica.edu.tw/docs/developers-handbook/policies-shlib.html" \n _toppolicy on shared library versioning了解通常的处理办法.不要盲目的认为软件的作者知道他们在干什么,可能他们真的不知道.过去曾经出现过依赖一个不存在的jpeg9的先例.如果有疑问,请向<HYPERLINK "mailto:freebsd-ports@FreeBSD.org"freebsd-ports@FreeBSD.org>邮件列表问讯.很多时候,你的port能够正确的依赖共享库并且有很好的补丁实现他,才能算完成.

    第8章 Man page
    MAN[1-9LN]变量会自动的将所有的man page加入pkg-plist(你不需要在pkg-pilst中列出,参看HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-plist.html"创建pkg-plist文件). 在安装时是否压缩文件依赖/etc/make.conf中的NOMANCOMPRESS定义.
    如果你的port使用符号连接或硬连接安装man page到不同名字,你必须设置MLINKS变量.这些连接将会被bsd.port.mk破坏并重建以确定指向正确的文件.在MLINKS中列出的文件不能出现在pkg-plist中.
    你可以通过设置MANCOMPRESSED变量来指定是否在安装时压缩.有三个取值:yes no maybe.yes指压缩,no指不压缩,maybe指已经从NOMANCOMPRESS取值所以不需要bsd.port.mk做额外的工作.
    如果设定了USE_IMAKE并且NO_INSTALL_MANPAGES没有设置或置为no,那么MANCOMPRESSED会自动置为yes.
    如果源代码的作者将man page树安装在别的地方而不是PREFIX,你可以通过MANPREFIX指定.通常只有一些特殊的软件会这样,如perl模块,你可以使用Man
  • PREFIX(
  • 代表1-9,L或N)分别指定.
    如果你的man page安装在特定的语言子目录,设置MANLANG变量(缺省为"",英文)
    下面是一个例子:
        MAN1=          foo.1
        MAN3=          bar.3
        MAN4=          baz.4
        MLINKS=        foo.1 alt-name.8
        MANLANG=       "" ja
        MAN3PREFIX=    ${PREFIX}/share/foobar
        MANCOMPRESSED= yes
    man page文件会被安装成如下:
        ${PREFIX}/man/man1/foo.1.gz
        ${PREFIX}/man/ja/man1/foo.1.gz
        ${PREFIX}/share/foobar/man/man3/bar.3.gz
        ${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
        ${PREFIX}/man/man4/baz.4.gz
        ${PREFIX}/man/ja/man4/baz.4.gz

    第9章.需要Motif的port
    内容列表
    9.1 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-motif.html" \l "AEN915"REQUIRES_MOTIF
    9.2 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x919.html"MOTIFLIB
    很多的port依赖于motif编译.既然这是一个很流行的包并且允许重新发布静态连接的二进制,我们有一个办法来解决这个问题,可以编译静态或动态的包.
    9.1 REQUIRES_MOTIF
    如果你的port依赖motif,可以在Makefile中设置这个变量.这样没有Motif的使用者就不能试图编译他.
    9.2 MOTIFLIB
    这个变量是bsd.port.mk设置的,适当的参考motif lib.如果你的Makefile或Imakefile使用了motif lib,请patch你的源代码来只用这个变量.
    通常有两种情况:
    如果port中的Makefile和Imakefile以-lXm引用.请以${MOTIFLIB}替换.
    如果Imakefile中使用XmClientLibs,请以${MOTIFLIB}${XTOOLLIB}${XLIB}替换.
    注意通常MOTIFLIB扩展为-L/usr/X11R6/lib -lXm 或/usr/X11R6/lib/libXm.a,所以没有必要在加-L或-l
    第10章 X11字体
    如果你安装了新的X字体,应该将他们放在X11BASE/lib/X11/fonts/local目录.XFree86 3.3.3是没有这个目录的,如果不存在就建立这个目录.并且输出信息提醒用户升级X,或至少提醒用户将这个路径加入XF86Config文件.


    第11章. Info文件
    新版本的texinfo包含了一个叫install-info的工具.如果你的port安装了任何info文件,请阅读这一章,虽然很长,但内容很重要,如果你能按照来做,工作会是相当漂亮的.
    首先要知道:
        % install-info --help
        install-info [OPTION]... [INFO-FILE [DIR-FILE]]
          Install INFO-FILE in the Info directory file DIR-FILE.
       
        Options:
        --delete          Delete existing entries in INFO-FILE;
                            don't insert any new entries.
         :
        --entry=TEXT      Insert TEXT as an Info directory entry.
         :
        --section=SEC     Put this file's entries in section SEC of the directory. :
    注意: 这个程序并不实际安装info文件.只是插入或删除目录文件的实体.
    这里有7个步骤使你的port使用install-info.使用HYPERLINK "http://www.FreeBSD.org/cgi/url.cgi?ports/editors/emacs/pkg-descr"editors/emacs 为例.
    1.察看texinfo的源文件,在没有@dircategory和@direntry的文件添加,补丁如下.
        --- ./man/vip.texi.org  Fri Jun 16 15:31:11 1995
        +++ ./man/vip.texi      Tue May 20 01:28:33 1997
        @@ -2,6 +2,10 @@
       
         @setfilename ../info/vip
         @settitle VIP
        +@dircategory The Emacs editor and associated tools
        +@direntry
        +* VIP: (vip).          A VI-emulation for Emacs.
        +@end direntry
       
         @iftex
         @finalout
         :
    注意: 每个文件只能包含一个info实体,因为install-info --delete有个bug.如果你在@direntry定义了多个实体,只能删除第一个.
    2.会到port目录,make clean;make.确定所有的info文件从原码中重新编译.因为texinfo源文件比info文件新,所以当你输入make时,会重新编译.但很 多makefile文件没有包含一个正确的info依赖,所以你需要修改主Makefile.in文件,使他可以进入man子目录重新编译info文件.
        --- ./Makefile.in.org   Mon Aug 19 21:12:19 1996
        +++ ./Makefile.in       Tue Apr 15 00:15:28 1997
        @@ -184,7 +184,7 @@
         # Subdirectories to make recursively.  `lisp' is not included
         # because the compiled lisp files are part of the distribution
         # and you cannot remake them without installing Emacs first.
        -SUBDIR = lib-src src
        +SUBDIR = lib-src src man
       
         # The makefiles of the directories in $SUBDIR.
         SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile src/Makefile oldXMenu/Makefile
         lwlib/Makefile
        --- ./man/Makefile.in.org       Thu Jun 27 15:27:19 1996
        +++ ./man/Makefile.in   Tue Apr 15 00:29:52 1997
        @@ -66,6 +66,7 @@
         ${srcdir}/gnu1.texi \
         ${srcdir}/glossary.texi
       
        +all: info
         info: $(INFO_TARGETS)
       
         dvi: $(DVI_TARGETS)
    因为man子目录中的目标是info.而主Makefile调用的是all,所以第二段是必要的.
    3.如果在Makefile.in中存在一个安装dir文件的地方,请删除他.你的port不需要这么做.同样删除于此有关的信息.
        --- ./Makefile.in.org   Mon Aug 19 21:12:19 1996
        +++ ./Makefile.in       Mon Apr 14 23:38:07 1997
        @@ -368,14 +368,8 @@
                if [ `(cd ${srcdir}/info && /bin/pwd)` != `(cd ${infodir} && /bin/pwd)` ]; \
                then \
                  (cd ${infodir};  \
        -          if [ -f dir ]; then \
        -            if [ ! -f dir.old ]; then mv -f dir dir.old; \
        -            else mv -f dir dir.bak; fi; \
        -          fi; \
                   cd ${srcdir}/info ; \
        -          (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir);
        \
        -          (cd $${thisdir}; chmod a+r ${infodir}/dir); \
                   for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* message* mh-e* sc* vip*; do \
                     (cd $${thisdir}; \
                      ${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
                      chmod a+r ${infodir}/$$f); \
    4.(这一步仅仅在你修改一个存在的port时需要)察看以下pkg-plist文件,删除任何要patch up info/dir的信息.可能在pkg-install文件和其他文件中也存在,你需要搜索以下.
        Index: pkg-plist
        ===================================================================
        RCS file: /usr/cvs/ports/editors/emacs/pkg-plist,v
        retrieving revision 1.15
        diff -u -r1.15 pkg-plist
        --- pkg-plist       1997/03/04 08:04:00     1.15
        +++ pkg-plist       1997/04/15 06:32:12
        @@ -15,9 +15,6 @@
         man/man1/emacs.1.gz
         man/man1/etags.1.gz
         man/man1/ctags.1.gz
        -@unexec cp %D/info/dir %D/info/dir.bak
        -info/dir
        -@unexec cp %D/info/dir.bak %D/info/dir
         info/cl
         info/cl-1
         info/cl-2
    5.在Makefile中添加一个post-install行为调用install-info和要安装的info文件.你没有不要创建目录文件.install-info会自动创建.
        Index: Makefile
        ===================================================================
        RCS file: /usr/cvs/ports/editors/emacs/Makefile,v
        retrieving revision 1.26
        diff -u -r1.26 Makefile
        --- Makefile    1996/11/19 13:14:40     1.26
        +++ Makefile    1997/05/20 10:25:09     1.28
        @@ -20,5 +20,8 @@
         post-install:
         .for file in emacs-19.34 emacsclient etags ctags b2m
                strip ${PREFIX}/bin/${file}
         .endfor
        +.for info in emacs vip viper forms gnus mh-e cl sc dired-x ediff ccmode
        +       install-info ${PREFIX}/info/${info} ${PREFIX}/info/dir
        +.endfor
       
         .include <bsd.port.mk>
    6.修改pkg-plist文件,适当的加入@exec和@unexec.
        Index: pkg-plist
        ===================================================================
        RCS file: /usr/cvs/ports/editors/emacs/pkg-plist,v
        retrieving revision 1.15
        diff -u -r1.15 pkg-plist
        --- pkg-plist       1997/03/04 08:04:00     1.15
        +++ pkg-plist       1997/05/20 10:25:12     1.17
        @@ -16,7 +14,14 @@
         man/man1/etags.1.gz
         man/man1/ctags.1.gz
        +@unexec install-info --delete %D/info/emacs %D/info/dir
         :
        +@unexec install-info --delete %D/info/ccmode %D/info/dir
         info/cl
         info/cl-1
        @@ -87,6 +94,18 @@
         info/viper-3
         info/viper-4
        +@exec install-info %D/info/emacs %D/info/dir
         :
        +@exec install-info %D/info/ccmode %D/info/dir
         libexec/emacs/19.34/i386--freebsd/cvtmail
         libexec/emacs/19.34/i386--freebsd/digest-doc
    注意: @unexec install-info --delete应该在info文件之前出现.@exec install-info命令应该在info文件之后,这个@exec会创建需要的目录.
    7.HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-testing.html"测试 注意每一步是否达到目的.

    第12章. pkg-*文件
    内容列表
    12.1 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/c1051.html" \l "ORTING-MESSAGE"pkg-message
    12.2 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1069.html"pkg-install
    12.3 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1087.html"pkg-req
    12.4 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-plist.html"在make变量的基础上修改pkg-plist
    12.5 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1140.html"改变pkg-*的名字
    我们还没有解释手边的pkg-*文件:-)
    12.1 pkg-message
    如果你有一些信息输出给安装者,你可以把这些信息放在pkg-message文件.这个功能经常用于在pkg_add之后显示需要使用者作的工作或显示许可证.
    注意: 这个文件没有必要加入pkg-plist.他也不会在使用者从port编译时显示,如果你需要,应当手动的列在post-install中.
    12.2 pkg-install
    如果你需要在使用pkg_add安装一个二进制包之后执行一些命令,可以通过pkg-install脚本完成.这个脚本会被自动的加入到包中.并且可以被pkg_add执行两次.一次是${SH} pkg-install ${PKGNAME} PRE-INSTALL,另一次是${SH} pkg-install ${PKGNAME} POST-INSTALL.$2可以用于检查到底将在那个模式运行.PKG_PREFIX会被设置到包安装的目录.参看HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=pkg_add&sektion=1"pkg_add(1) 获得更多的信息.
    注意: 当使用者从port中编译时,这个脚本不会执行.如果你需要他运行,请在Makefile中调用
    12.3 pkg-req
    如果你的port需要决定到底应不应该安装,你应当创建pkg-req "requirments"脚本.他将在安装和卸载时包含,以决定安装和卸载是否应当继续.
    在pkg_add时以pkg-req ${PKGNAME} INSTALL的形式调用,在卸载时以pkg-req ${PKGNAME} DEINSTALL的形式调用.
    12.4 基于make的变量修改pkg-plist
    像 perl5之类的port需要根据configure时的不同参数修改pkg-plist.文件非常的多,工作量也很大.为了使事情简单一点我们可以使用 %%OSREL%% %%PREL_VER%% %%PREL_VERSION%%替换pkg-plist中的相关实例.%%OSREL%%指操作系统的发行版本号(如,2.2.7).%% PERL_VERSION%%指perl的完整版本号(如,5.00502).%%PERL_VER%%指perl的版本号减去patchlevel.这 样以后在升级时就不再需要修改pkg-plist.
    如果你需要其他的替换,应该在Makefile中设置PLIST_SUB,列出VAR=VALUE,这样就可以在pkg-plist中使用%%VAR%%代替VALUE.
    举个例子,如果你有一个port需要将很多文件安装在以版本号命名的子目录.可以在Makefile中设置:
        OCTAVE_VERSION= 2.0.13
        PLIST_SUB=      OCTAVE_VERSION=${OCTAVE_VERSION}
    然后在pkg-plist中用%%OCTIVE_VRESION%%代替所有的版本号.
    替换在do-install和post-install之间进行.从PLIST(缺省为pkg-plist)读取将结果写入TMPPLIST(缺省为WRKDIR/.PLIST.mktmp文件)

    12.5改变pkg-*的文件名
    所有的pkg-*文件名是用环境变量定义的,所以如果有需要可以在Makefile中重新定义.
    这里是一个变量和缺省值的列表 (PKGDIR 缺省为${MASTERDIR}.)

    变量
    缺省值
    COMMENT
    ${PKGDIR}/pkg-comment
    DESCR
    ${PKGDIR}/pkg-descr
    PLIST
    ${PKGDIR}/pkg-plist
    PKGINSTALL
    ${PKGDIR}/pkg-install
    PKGDEINSTALL
    ${PKGDIR}/pkg-deinstall
    PKGREQ
    ${PKGDIR}/pkg-req
    PKGMESSAGE
    ${PKGDIR}/pkg-message
    请修改这些变量而不是修改PKG_ARGS.如果你修改了PKG_ARGS,那些文件可能在安装时不会正确的安装在/var/db/pkg.

    第13章.许可证问题
    一些软件的许可证是限制性的或只能在某些国家使用(如侵犯专利权问题).
    注意: 读取和理解许可证是porter的责任,FreeBSD发布将不符任何责任.如果有疑问,请联系<HYPERLINK "mailto:freebsd-ports@FreeBSD.org"freebsd-ports@FreeBSD.org>这个mail list.
    在Makefile中有两个变量可以解决经常出现的问题.
    1.如果这个port有"不得用于销售盈利"之类的许可证.设置NO_CDROM说明原因.我们会不把它包含在CDROM中,但通过FT仍然可以得到.
    2.如果这个软件包需要针对每个不同的用户编译或不能发布二进制版本.设置NO_PACKAGE变量说明原因,这个port将不会在ftp和cdrom中出现但会在ftp和cdrom中包含distfiles.
    3.如果这个port有专利权限制或"不得用于商用".这样的port.我们的ftp不会包含distfiles/package.
    注意: GPL 版本1和版本2没有任何障碍.
    注意: 如果你是提交者,请确定升级ports/LEGAL文件.
    第14章.升级
    当你发现一个port已经相对的版本陈旧.你可以升级到最新的port.可以在ftp镜像站点ports/ports-current获得有关信息.
    然后发信给就版本port的维护者,可能他也在进行新版本的port,或因为一些原因他还不能继续.
    如果这个维护者请您做出升级.那么你应当提交patch.举个例子,如果你修改了目录名如,原来在我们的port树中是superediter.bak,现在你命名为superediter,那么你的patch应当是
    diff -ruN superedit.bak superedit.
    请确定所有修改准确无误,然后使用 HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=send-pr&sektion=1"send-pr(1) 提交. 如果有文件的添加和删除,请注明.同样大小超过了20k,请打包并使用uuencode,如果小于20k,请直接包含在PR中提交.
    注意:如果是port升级,请使用HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=diff&sektion=1" diff(1) 而不是HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=shar&sektion=1" shar(1)
    第15章.应该做的和不该做的
    内容列表
    15.1 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/c1250.html" \l "AEN1255"Strip二进制文件
    15.2 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1265.html"INSTALL_*宏定义
    15.3 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-wrkdir.html"WRKDIR
    15.4 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-wrkdirprefix.html"WRKDIRPREFIX
    15.5 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-versions.html"区分操作系统和版本
    15.6 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1769.html"在bsd.port.mk之后添加...
    15.7 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1853.html"安装额外的文档
    15.8 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1878.html"DIST_SUBDIR
    15.9 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1899.html"包信息
    15.10 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1909.html"RCS 字符串
    15.11 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1915.html"递归的diff
    15.12 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-prefix.html"REFIX
    15.13 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1975.html"子目录
    15.14 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-cleaning.html"清除空目录
    15.15 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2007.html"关于UID
    15.16 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2018.html"理性的工作
    15.17 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2028.html"有关CFLAGS
    15.18 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2047.html"配置文件
    15.19 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2059.html"ortlint
    15.20 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2064.html"反馈
    15.21 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2067.html"关于README.html
    15.22 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2073.html"其他
    15.23 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2081.html"如果你还不能继续...
    这里有一些你在port过程需要注意的问题.你应该按照这里的内容检查你的port.同样你也可以检查PR数据库中他人提交的port.然后按照HYPERLINK "http://freebsd.sinica.edu.tw/articles/contributing/contrib-how.html" \l "CONTRIB-GENERAL" \n _topBug Reports and General Commentary提交任何注释.检查PR数据库中的port可能有利于我们更快的确定它们同时也提高了你的水平:-)
    15.1 Strip 二进制文件
    一定要strip二进制文件.如果源代码已经strip二进制,ok.如果没有你一定要在post-install规则中定义,举个例子:
        post-install:
                strip ${PREFIX}/bin/xdl
    在install执行时使用HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=file&sektion=1"file(1) 命令检查

    15.2 INSTALL_* 宏定义
    一定要使用bsd.port.mk中的宏定义确定你在你的port的*-install行为安装的文件的mode和ownership是正确的
    INSTALL_PROGRAM 安装二进制可执行文件的命令
    INSTALL_SCRIPT 安装可执行脚本的命令
    INSTALL_DATA 安装共享数据的命令
    INSTALL_MAN 安装man page和其他文档的命令(不压缩)
    他们基于install命令并设置了合理的参数.

    15.3 WRKDIR
    请确定不要在WRKDIR(缺省为portname/work)之外写任何东西.WRKDIR是编译时唯一可以写的一个目录.参看FreeBSD手册的compiling ports from CDROM一节理解从只读的介质编译port. 如果你需要修改pkg-*文件.要HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x1140.html" \l "AEN1140"重定义变量, 而不是直接修改这些文件.
    15.4 WRKDIRPREFIX
    请 确定你的port支持WRKDIRPREFIX.如果你参考其他的port的WRKDIR,你应该会发现正确的位置是 WRKDIRPREFIXPORTSDIR/subdir/name/work而不是PORTSDIR/subdir/name/work或. CURDIR/../../subdir/name/work或其他的什么.
    你也可以自己定义WRKDIR,首先你要定义 ${WRKDIRPREFIX}${.CURDIR}.
    15.5 区分操作系统和版本
    可能你必须修改一些代码以使你的port能够在特定的unix版本上运行.如果你做了,请确定你的修改是通用的,可以使我们可以把代码port到来自CSRG的4.4BSD,BSD/386,386BSD,NetBSD,OpenBSD.下面我们就来讲讲这个问题.
    一个较好的办法是使用<sys/param.h>的BSD宏定义来区分 4.3BSD/Reno(1990)和新版本的BSD.希望你已经包含了这个文件,如果没有在你的c文件的合适位置定义以下代码:
        #if (defined(__unix__) || defined(unix)) && !defined(USG)
        #include <sys/param.h>
        #endif
    我们相信每一个操作系统只要定义了这两个符号就应该有sys/param.h这个文件.如果你知道那个系统没有,请发信到<HYPERLINK "mailto:freebsd-ports@FreeBSD.org"freebsd-ports@FreeBSD.org>.
    另一种办法是使用GNU Autoconf的风格定义:
        #ifdef HAVE_SYS_PARAM_H
        #include <sys/param.h>
        #endif
    不要忘记在你的Makefile中增加这样一个CFLAGS: -DHAVE_SYS_PARAM_H.
    一旦你包含了sys/param.h,你可以使用:
        #if (defined(BSD) && (BSD >= 199103))
    来表示代码是在4.3 Net2或新的版本上编译(如,FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1或更低版本)
    使用:
        #if (defined(BSD) && (BSD >= 199306))
    来表示代码是在 4.4 代码基础上或更新的版本(如, FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0 和更新版本)上编译
    4.4BSD-Lite2代码基础的BSD宏的值是199506.他并不能用于区分基于4.4-Lite的FreeBSD和根据4.4-Lite2修改的FreeBSD版本.这时应当使用__FreeBSD__
    使用方法:
    __FreeBSD__ 在所有FreeBSD版本中定义,在你的修改只影响FreeBSD时使用.像使用sys_errlist[]和strerror()变化的port属于伯克莱机制的,不属于FreeBSD的变化.
    在FreeBSD 2.x, __FreeBSD__ 被定义成2. 在早期的版本中是1.以后的版本会修改他为主版本号.
    如果你想区分FreeBSD 1.x和2.x或3.x的变化,可以使用上面的BSD宏.如果确实是FreeBSD的特定改变(如ld在处理共享库时的参数),你可以使用__FreeBSD__,如果#if __FreeBSD__ >1表示2.x和2.x以上.如果从2.0-RELEASE开始,你需要区分的更加细致,请使用:
        #if __FreeBSD__ >= 2
        #include <osreldate.h>
        #    if __FreeBSD_version >= 199504
                 /* 2.0.5+ release specific code here */
        #    endif
        #endif

    HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-versions.html"http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-versions.html
    注意: 2.2.5-RELEASE之后的2.2-STABLE 会把自己当成2.2.5-STABLE.因为使用的是年月的形式,从2.2开始我们采用更直接的主/次版本的形式.原因是开发者以时间不足以明确到底属于 哪个发布版,如果你正进行port工作,完全不必管他,只是给你做个参考.
    其实,在那么多的port中可能只有几个应该使用__FreeBSD__的.
    15.6 在bsd.port.mk之后添加...
    你不能在.include<bsd.port.mk>之后添加任何内容,如果你一定要作,可以在Makefile的中间包含bsd.port.pre.mk,然后写一些东西,最后在Makefile的结尾包含bsd.port.post.mk.
    注意: 或者在你的Makefile中使用bsd.port.mk或者使用bsd.port.pre.mk和bsd.port.post.mk这一对,两者不能同时出现在Makefile中.
    bsd.port.pre.mk只是定义了很少的变量,可以用于测试.bsd.port.post.mk定义了剩余的一些.
    这里是bsd.port.pre.mk中定义的一些变量(并不是全部,请参看实际文件)

    变量
    描述
    ARCH
    uname -m返回的硬件架构,如i386
    OPSYS
    uname -s返回的操作系统类型,如FreeBSD.
    OSREL
    操作系统的版本发布号 如2.2.7
    OSVERSION
    BSD的版本(类似于内核版本) 参看HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-versions.html"__FreeBSD_version.
    PORTOBJFORMAT
    系统的对象类型(aout或elf)
    LOCALBASE
    local目录的目录树根,一般为/usr/local
    X11BASE
    X11目录的目录树根,一般为/usr/X11R6
    PREFIX
    port安装在那里 (参看HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-prefix.html"more on PREFIX).
    注意:如果你需要定义USE_IMAKE,USE_X_PREFIX或MASTERDIR,一定要在包含bsd.port.pre.mk之前定义.

    这里是一些你可以在包含bsd.port.pre.mk之后填写的例子:
        # no need to compile lang/perl5 if perl5 is already in system
        .if ${OSVERSION} > 300003
        BROKEN= perl is in system
        .endif
       
        # only one shlib version number for ELF
        .if ${PORTOBJFORMAT} == "elf"
        TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}
        .else
        TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
        .endif
       
        # software already makes link for ELF, but not for a.out
        post-install:
        .if ${PORTOBJFORMAT} == "aout"
               ${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
        .endif
    15.7 安装额外的文档
    如果你的port中含有对用户很重要的文档,但又不是man或info.你可以在post-install阶段把他们安装在PREFIX/share/doc.
    你应该新创建一个目录,一般是以PORTNAME为名,如果有版本的区别,你也可以用PKGNAME为名.
    看下面这一段,你会发现文档的安装依赖于NOPORTDOCS的定义.用户可以在/etc/make.conf中如下定义
        post-install:
        .if !defined(NOPORTDOCS)
                ${MKDIR} ${PREFIX}/share/doc/xv
                ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
        .endif
    任何安装的额外的文档应当出现在pkg-plist.并且以%%PORTDOCS%%为前缀:
        %%PORTDOCS%%share/doc/pure-ftpd/AUTHORS
        %%PORTDOCS%%share/doc/pure-ftpd/CONTACT
        %%PORTDOCS%%@dirrm share/doc/pure-ftpd
    你也可以在安装时使用pkg-message文件来输出一些信息.参看HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/c1051.html" \l "ORTING-MESSAGE"pkg-message 以获得更多信息.
    注意: pkg-message不应在pkg-plist中列出
    15.8 DIST_SUBDIR
    如果你的port需要取回大量的文件或者可能文件名与其他的port冲突.你可以在Makefile中设置DIST_SUBDIR.这时就不会将取回的文件 放在DISTDIR(缺省为/usr/ports/distfiles)而是/usr/ports/distfiles/DIST_SUBDIR.
    同样也会对ftp.freebsd.org生效,直接在设置Makefile中显式的设置DISTDIR是无效的,应当使用DIST_SUBDIR.
    注意: 他并不影响你设置的MASTER_SITES.
    15.9 包信息
    一定要包含包的信息:pkg-comment,pkg-descr,pkg-plist.
    注意: 这些文件现在不仅仅用于打包,是强制性的,即使你的Makefile中设置NO_PACKAGE而不能打成pkg包.
    15.10 RCS 字符串
    不要在你的patch中包含RCS字符串.当我们导入主port树时,CVS会破坏他,这样你的patch就不可用了.RCS字符串通常被$$包含,并且一般以$ld或$RCS开头.

    15.11 递归的diff生成patch
    使 用diff的递归参数(-r)是可取的,但一定要确定patch中没有任何的垃圾.通常diff使用在两个备份文件、使用Imake或GNU configure的Makefile时的结果应当被删除,如果你一定要编辑configure.in并且使用autoconf去生成新的 configure文件,不要做两个configure文件的diff(会使你的patch多达几千行),而是做两个configure.in的diff 并定义USE_AUTOCONF=yes.
    同样,如果你需要删除源代码中的文件,最好定义post-extract而不是做补丁.最后如果你对你的diff结果满意了,要把他分到一个源文件对应一个补丁(也就是一个patch只能去patch一个文件)

    15.12 PREFIX
    不要让你的port依赖于特定的PREFIX(这个变量设置为LOCALBASE,缺省为/usr/local),除非你设置了USE_X_PREFIX或UES_IMAKE,这时PREFIX指X11BASE,缺省为/usr/X11R6.
    没有硬性的代码一定要安装到/usr/local或/usr/X11R6可以使你的port更加的通用,对于X的port如果使用imake这是自动完成的;否则你应该修改scripts下的Makefile让他读取PREFIX,并且使他在编译和安装的阶段生效.
    确定你的port没有将文件安装到/usr/local而不是PREFIX的一个简单的测试方法:
        # make clean; make package PREFIX=/var/tmp/port-name
    如果有文件安装在PREFIX之外,在打包时会有文件找不到的错误..
    不要设置USE_X_PREFIX(除非你的port真的一定依赖他)
    PREFIX应该可以被使用者重新设置,而不应该显式的在你的Makefiles中明确定义
    同样,如果你的port使用了其他port的的文件.不要显式的定义完整路径.举个例子,如果你要使用less的PAGER宏.可以使用下面的编译参数.
        -DPAGER=\"${PREFIX}/bin/less\"

        -DPAGER=\"${LOCALBASE}/bin/less\"
    这样当系统的管理者将/usr/local目录树完整的移动到其他地方并重新定义了PREFIX时,你的port照样可以运行.

    15.13 子目录
    尽可能的是你的port把文件安装在PREFIX下正确的子目录.一些port集中的安装在portname/目录.还有一些port除可执行文件外的头文件、man page安装在lib下的子目录,这些都是不符合BSD风格的.应当将配置文件安装在etc(配置文件目录)、libexec(可执行文件)、sbin(管理者和超级用户可执行),参看HYPERLINK "http://www.FreeBSD.org/cgi/man.cgi?query=hier&sektion=7"hier(7) 的man page获得更多的信息.唯一的例外时USENET "news",他可以安装在PREIFX/news目录.
    15.14 清除空目录
    一定要做到当port deinstall后不会遗留创建的目录.通常在pkg_plist文件加入@dirrm指令实现.你需要先删除所有的子目录.

         :
        lib/X11/oneko/pixmaps/cat.xpm
        lib/X11/oneko/sounds/cat.au
         :
        @dirrm lib/X11/oneko/pixmaps
        @dirrm lib/X11/oneko/sounds
        @dirrm lib/X11/oneko
    有时候,因为其他的port也使用了跟你一样的目录,@dirrm会提出一些警告However,你可以通过@unexec指令调用rmdir命令只删除空目录.
        @unexec rmdir %D/share/doc/gimp 2>/dev/null || true
    应当做到在PREFIX/share/doc/gimp目录因为其他port的使用而非空的情况下.没有任何的警告或pkg_delete的异常退出.
    15.15 有关UID
    如果你的port需要一个特定的用户安装.请在pkg-install脚本中调用pw自动创建.参看HYPERLINK "http://www.FreeBSD.org/cgi/url.cgi?ports/net/cvsup-mirror/pkg-descr" net/cvsup-mirror 的例子.
    如果你的port在编译安装时需要一个特定的用户和组.你必须在UID 50-999之间选择.参看HYPERLINK "http://www.FreeBSD.org/cgi/url.cgi?ports/japanese/Wnn/pkg-descr"japanese/Wnn 的例子.
    确定你没有使用系统的或已经被其他port使用的UID.下面是一个已经使用的50-999之间的列表.
        majordom:*:54:54:Majordomo Pseudo User:/usr/local/majordomo:/nonexistent
        cyrus:*:60:60:the cyrus mail server:/nonexistent:/nonexistent
        gnats:*:61:1:GNATS database owner:/usr/local/share/gnats/gnats-db:/bin/sh
        uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
        xten:*:67:67:X-10 daemon:/usr/local/xten:/nonexistent
        pop:*:68:6ost Office Owner (popper):/nonexistent:/sbin/nologin
        wnn:*:69:7:Wnn:/nonexistent:/nonexistent
        ifmail:*:70:66:Ifmail user:/nonexistent:/nonexistent
        pgsql:*:70:70ostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
        ircd:*:72:72:IRCd hybrid:/nonexistent:/nonexistent
        www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin
        alias:*:81:81Mail user:/var/qmail/alias:/nonexistent
        qmaill:*:83:81Mail user:/var/qmail:/nonexistent
        qmaild:*:82:81Mail user:/var/qmail:/nonexistent
        qmailq:*:85:82Mail user:/var/qmail:/nonexistent
        qmails:*:87:82Mail user:/var/qmail:/nonexistent
        qmailp:*:84:81Mail user:/var/qmail:/nonexistent
        qmailr:*:86:82Mail user:/var/qmail:/nonexistent
        msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
        mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin
        vpopmail:*:89:89::0:0:User &:/usr/local/vpopmail:/nonexistent
        smmsp:*:90:90:Sendmail Queue:/nonexistent:/nonexistent
        mailman:*:91:91:Mailman User:/usr/local/mailman:/sbin/nologin
        drweb:*:426:426r.Web Mail Scanner:/nonexistent:/sbin/nologin
    请在提交你的port时包含一个通知,这样我们可以保持列表的升级.
    15.16 理性的工作
    Makefile 应该尽可能的合理简单,可读.比如,使用make的.if结构而不使用shell的if结构,如果可以定义EXTRACT*就不要定义do- extract,使用GNU_CONFIGURE而不使用CONFIGURE_ARGS+=--prefix=${PREFIX}
    15.17 有关CFLAGS
    port应当检查CFLAGS变量.如果不需要,在Makefile中添加NO_PACKAGE=ignores cflags.
    一个修改CFLAGS的例子,注意+=:
        CFLAGS += -Wall -Werror
    这是一个不需要检查的例子:
        CFLAGS = -Wall -Werror
    CFLAGS变量在系统的/etc/make.conf里定义.第一个例子保留了系统CFLAGS的定义并追加.第二个例子覆盖系统CFLAGS定义.
    15.18 配置文件
    如果你的port需要在PREFIX/etc目录下安装配置文件,不要仅仅是安装他们并在pkg-plist中列出.这样会导致pkg_delete删除掉用户辛苦配置好的自己的配置文件并在重新安装port是导致文件被覆盖.
    一个好的办法是安装一个filename.sample并且输出提示HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/c1051.html" \l "PORTING-MESSAGE"信息 提示使用者自己拷贝并编辑这个文件以便port可以运行.
    15.19 Portlint
    在你提交你的port之前一定要使用HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-portlint.html"portlint 检查你的port.
    15.20 反馈
    一定要将patch反馈给源作者,这样你的下一个版本的port可能会更容易.
    15.21 README.html
    不要包含README.html文件.这个文件不是CVS收集的一部分.但可以用make readme命令生成.
    15.22 其他杂项
    pkg-comment pkg-descr pkg-plist文件应当详细的检查.
    不要拷贝太多的GPL到我们的系统.
    一定要确定法律问题,不要让我们发布非法的软件.
    15.23 如果你还不能继续
    在提问之前请看一下例子和bsd.port.mk:-)
    当你还有问题一定要问我们,不要去撞墙:-)
    第十六章.一个简单的Makefile
    这里有一个简单的Makefile.你可以在他的基础上创建你自己的Makefile.确定你删除掉所有的无关内容(括号中的那些)!
    推荐你按照下面的格式创建Makefile(包括变量的顺序,段与段之间的空行等),这样的格式可以使内容更加的清晰.我们推荐你使用HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-portlint.html"portlint 开检查你的Makefile.

        [header...使我们更容易的分辨你的port]
        # New ports collection makefile for:   xdvi
        ["version required"一行只在您的PORTVERSION变量没有足够明确的描述这个port]
        # Date created:                26 May 1995
        [一般Whom一行是第一个做出port的porter,也就是第一个创建Makefile的.并且请记住在以后的port升级
         时,不能修改这一行的名字.]
        # Whom:                        Satoshi Asami <asami@FreeBSD.org>
        #
        # $FreeBSD$
        [ ^^^^^^^^^ 这一行会被CVS自动的以RCS ID字符串替代.如果你是升级一个已有的port,请不要修改原有
          Makefile的这一行,CVS会自动的处理]
        #
       
        [这一段主要是对这个port的描述,PORTNAME和PORTVERSION总是在最前的.接着是CATEGORIES,
         MASTER_SITES,然后是MASTER_SITE_SUBDIR PKGNAMEPREFIX 和 PKGNAMESUFFIX,如果有需要,可以加上
         DISTNAME, EXTRACT_SUFX  DISTFILES 还有EXTRACT_ONLY]
        PORTNAME=      xdvi [port名]
        PORTVERSION=   18.2 [版本号]
        CATEGORIES=    print [在FreeBSD安装盘目录类别]
        [如果你没有使用MASTER_SITE_*宏定义,不要忘记"/"]
        MASTER_SITES=  ${MASTER_SITE_XCONTRIB}
        MASTER_SITE_SUBDIR= applications
        PKGNAMEPREFIX= ja-
        DISTNAME=      xdvi-pl18
        [如果源代码不是tar.gz的包,设置这一行]
        EXTRACT_SUFX=  .tar.Z
       
        [定义这个port的patch,如果没有patch,可以为空]
        PATCH_SITES=   ftp://ftp.sra.co.jp/pub/X11/japanese/
        PATCHFILES=    xdvi-18.patch1.gz xdvi-18.patch2.gz
       
        [为了bug的报告和一些问题的解答,porter可以留下自己的mail地址,如果你不想公开你的mail
         请设置为ports@FreeBSD.org]
        MAINTAINER=    asami@FreeBSD.org
       
        [依赖关系,可以为空]
        RUN_DEPENDS=   gs{PORTSDIR}/print/ghostscript
        LIB_DEPENDS=   Xpm.5{PORTSDIR}/graphics/xpm
       
        [这一段与上面的内容关系不大,主要是一些bsd.port.mk的变量]

        [如果在configure, build, install等过程中需要和使用者交互,要求回答问题]
        IS_INTERACTIVE=        yes
        [不解压到${DISTNAME}而是解压到另外的目录]
        WRKSRC=                ${WRKDIR}/xdvi-new
        [If the distributed patches were not made relative to ${WRKSRC}, you
         may need to tweak this]
        PATCH_DIST_STRIP=      -p1
        [如果需要有GNU autoconf生成一个"configure"脚本]
        GNU_CONFIGURE= yes
        [如果需要GNU make编译,而不是/usr/bin/make]
        USE_GMAKE=     yes
        [如果是X应用程序,并且需要xmkmf -a来运行]
        USE_IMAKE=     yes

       
        [以下是一些特殊的规则,顺序调用]
        pre-fetch:
                要到web取回...
       
        post-patch:
                patch后要作...
       
        pre-install:
                安装前,要...
       
        [最后一定要]
        .include <bsd.port.mk>
    第17章.自动创建pkg_plist文件
    你的port已经基本完成,只剩pkg-plist文件没有创建,创建一个空的文件.
    # touch pkg-plist
    接下来,创建一些目录用来安装port,并安装所有的依赖文件.
    # mtree -U -f /etc/mtree/BSD.local.dist -d -e -p /var/tmp/port-name # make depends PREFIX=/var/tmp/port-name
    在一个新文件中保存目录结构
    # (cd /var/tmp/port-name && find -d * -type d) > OLD-DIRS
    如果你的port支持PREFIX.你可以安装并创建pkg_plist文件.
    # make install PREFIX=/var/tmp/port-name # (cd /var/tmp/port-name && find -d * \! -type d) > pkg-plist
    同时你也应该将你的port新创建的目录加入pkg_plist.
        # (cd /var/tmp/port-name && find -d * -type d) | comm -13 OLD-DIRS - | sed -e 's#^#@dirrm #' >> pkg-plist
    最后,你应该手动的修正以下你的文件,并不是所有的事情都是自动的.man page应该在Makefile中的MAN*列出,用户配置文件应当删除或者安装为filename.sample. info/目录的文件应当从文件中删除,参考iHYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-info.html"info 文件 一节安装. 任何库文件应该参考HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/c791.html" \l "PORTING-SHLIBS"共享库 一节列出.
    第18章.软件包的命名
    以下是我们软件包命名的约定俗成.
    一般应当是[语言[_区域]]-软件名[[-]编译.细节]-版本.数字
    软件包的名字一般定义成${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}.确定你在Makefile中的设定是符合格式的.
    1.FreeBSD努力的支持本地化语言[语言-] 这一部分应当是ISO-639定义的本地语言的两个字母的缩写.如 zh 代表中文;ja 代表日文;ko 代表韩文等.
    如果port明确定义了使用这个语言的地区,可以添加两个字符的地区缩写,如:en_US代表美国英语 fr_CH代表瑞士法语.
    [语言-] 这一部分应当在PKGNAMEPREFIX定义.
    2.软件名 应当是小写的.perl5的模块使用p5-作为前缀,食用连字符"-"代替了"::",如ata:umper就变成p5-Data-Dumper.如果软件名本身就有数字.连字符.下划线,你可以保留,如:kinput2
    3.If the port can be built with different HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-masterdir.html"hardcoded defaults (usually part of the directory name in a family of ports), the -compiled.specifics part should state the compiled-in defaults (the hyphen is optional). Examples are papersize and font units.
    4.[编译.细节] 部分应当在PKGNAMESUFFIX变量定义.
    5.版本号应当在破折号的后面,以句点分割,只使用一个小写字母.通常不要在版本号部分出现另外一个破折号.唯一例外的字符是pl(patchlevel),当没有主次版本号时使用.如果软件名本身有alpha beta rc pre等字符串,使用第一个字符在句点后添加.如果后面还有版本信息,应当跟在字母的后面(不是句点),如2.2alpha3就是2.2a3 主要是为了按照版本号可以很容易的给port排序.一定要确认版本号以句号分割,或者使用时间做版本号应该使用yyyy.mm.dd,不要使用其它格式(于Y2k不兼容)
    这里是一些真实的例子,告诉你怎样转化为一个可取的包的名字.

    发布名
    PKGNAMEPREFIX
    PORTNAME
    PKGNAMESUFFIX
    PORTVERSION
    原因
    mule-2.2.2
    (empty)
    mule
    (empty)
    2.2.2
    无需变化
    XFree86-3.3.6
    (empty)
    XFree86
    (empty)
    3.3.6
    无需变化
    EmiClock-1.0.2
    (empty)
    emiclock
    (empty)
    1.0.2
    单一程序没有大写名
    rdist-1.3alpha
    (empty)
    rdist
    (empty)
    1.3.a
    不允许alpha之类的字符
    es-0.9-beta1
    (empty)
    es
    (empty)
    0.9.b1
    不允许beta之类的字符
    mailman-2.0rc3
    (empty)
    mailman
    (empty)
    2.0.r3
    No strings like rc allowed
    v3.3beta021.src
    (empty)
    tiff
    (empty)
    3.3
    同上
    tvtwm
    (empty)
    tvtwm
    (empty)
    pl11
    版本号总是需要的
    piewm
    (empty)
    piewm
    (empty)
    1.0
    版本号总是需要的
    xvgr-2.10pl1
    (empty)
    xvgr
    (empty)
    2.10.1
    没有主次版本号才使用pl
    gawk-2.15.6
    ja-
    gawk
    (empty)
    2.15.6
    日语版本
    psutils-1.13
    (empty)
    psutils
    -letter
    1.13
    Papersize hardcoded at package build time
    pkfonts
    (empty)
    pkfonts
    300
    1.0
    300dpi的字体包
    如果源代码中没有版本号,很有可能作者不会发布其他版本,就把版本号设置为1.0,不然就问讯作者或置为(yyyy.mm.dd)
    第19章.port类别
    内容列表
    19.1 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/porting-categories.html" \l "AEN2323"现有的port类别
    19.2 HYPERLINK "http://freebsd.sinica.edu.tw/docs/ports-handbook-gb2312/x2642.html"选择正确的port类别
    port被归类成很多类别,但是这就要求移植者和使用者知道什么样的port应当属于那个类别.
    19.1 现有类别列表
    这是现有的port类别列表,以星号注释的是虚拟类别,在port树中没有相应的目录.
    提示:对于真实的类别,你可以在pkg/COMMENT文件找到一行的说明(如archivers/pkg/COMMENT)

    类别
    描述
    afterstep*
    支持AfterStep窗口管理器的port
    archivers
    文档工具
    astro
    天文类的port
    audio
    声音的支持
    benchmarks
    Benchmark工具(性能评测)
    biology
    生物学相关的软件
    cad
    CAD工具
    chinese
    中文支持
    comms
    交流工具,一般使用特定的端口
    converters
    字符编码转换
    databases
    数据库
    deskutils
    计算机发明之前,桌面上的东西:-)
    devel
    开发工具,不要在这里放置任何的lib文件.
    editors
    通用编辑器,特殊的编辑器如数学公式编辑器归到math类
    elisp*
    Emacs-lisp ports.
    emulators
    其他操作系统的模拟器. 终端编辑器如果基于X,应当归到x11,如果基于console,应当归到comms或misc(根据具体的功能定)
    french
    法语支持
    ftp
    FTP的客户端和服务器,如果你的port拥有FTP和HTTP的功能,第二个类归到www
    games
    游戏
    german
    德语支持
    gnome*
    (GNOME) 环境
    graphics
    图形处理工具
    hebrew
    希伯来语支持
    irc
    IRC工具
    ipv6*
    IPv6相关的工具
    japanese
    日本语支持
    java
    JAVA相关
    kde*
    (KDE) 桌面环境
    korean
    韩国语支持
    lang
    开发语言
    linux*
    linux支持和linux程序
    mail
    Mail软件
    math
    数字计算软件和其他数学工具
    mbone
    MBone程序(译者注:Mbone一种多媒体骨架结构,可以在全球范围传输图像)
    misc
    杂类,如果你的Makefile中有其他归类就不应当放在这
    net
    各种各样的网络软件
    news
    新闻工具
    offix*
    OffiX 套件.
    palm
    3Com Palm(tm)支持软件.
    perl5*
    使用perl5运行的程序.
    picobsd
    支持PicoBSD的程序
    plan9*
    从Plan9而来的软件
    print
    打印软件,排版软件
    python*
    用python写成的软件
    ruby*
    用ruby写成的软件
    russian
    俄语支持
    science
    科学相关而又不属于astro bilogy和math
    security
    安全相关
    shells
    命令行shell
    sysutils
    系统软件
    tcl76*
    使用Tcl7.6运行的port
    tcl80*
    使用Tcl8.0运行的port
    tcl81*
    使用tcl8.1运行的port
    tcl82*
    使用tcl8.2运行的port
    textproc
    文本处理,排版软件归到print
    tk42*
    使用tk4.2运行的port
    tk80*
    使用tk8.0运行的port
    tk81*
    使用tk8.1运行的port
    tk82*
    使用tk8.2运行的port
    tkstep80*
    使用tkStep8.0运行的port
    ukrainian
    乌克兰语支持
    vietnamese
    越南语支持
    windowmaker*
    windowMaker桌面管理器
    www
    www相关,http支持的软件归类到这
    x11
    X window相关. X的应用程序不应归类到这,如果你定义了USE_XLIB(指USE_IMAKE),请归到x11-*类别
    x11-clocks
    X11 时钟?
    x11-fm
    X11 文件管理器
    x11-fonts
    X11 字体和字体相关软件
    x11-servers
    X11 服务器
    x11-toolkits
    X11 工具包
    x11-wm
    X11 窗口管理器
    zope*
    Zope支持
    19.2 选择正确的port类别
    因为很多port类别存在交叠,一般你应该选择一个主类别.有一些规则,这里列出了优先权(按优先权递减)
    语言明确的类别总是优先的,几个例子如果你的port安装了中文的X11字体.那么在你的Makefile中CATEGORIES应当是chinese x11-fonts.
    采用明确的类别放弃不明确的类别,如一个html编辑器应当在www editors列出.当这个port属于irc,mail,mbone,news,security或www,你不需要再指定net类别.
    只有你的port的第一个类别是语言类,x11才可以作为第二个类别.应当说你不应当把任何X程序置为x11类别
    Emacs 模块应当归类到这个模块支持的程序的类别而不是归类到editors.举个例子,emacs用于编辑某些程序语言的模块应当归到lang类而不是editors.
    如果你的port不属于任何类别,归到misc类
    如果你对port的类别还是搞不清楚,可以在提交时做一下注释,我们会决定到底归到哪里.如果你已经提交了,请发信到HYPERLINK "mailto:freebsd-ports@FreeBSD.org"freebsd-ports@FreeBSD.org 这个mail list.很多错误归类的port会被移到正确的类别.
    第20章.这个文档和port系统的变化
    如果你维护很多的port,你应当加入这个mail list<HYPERLINK "mailto:freebsd-ports@FreeBSD.org"freebsd-ports@FreeBSD.org>.有关port系统的重要变化会在这里声明.你可以从HYPERLINK "http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/Mk/bsd.port.mk" \n _topthe bsd.port.mk CVS log 获得最后修改的详细信息
    其他的帮助可以在HYPERLINK "http://bento.FreeBSD.org/" \n _toppackage building logs and errors 和 HYPERLINK "http://people.FreeBSD.org/~fenner/portsurvey/" \n _topFreeBSD Ports distfiles survey 找到.
    第21章.就到这了
    HI,很高兴你能看到这里,这真是一个很长的教程.相信你已经可以制作自己的port了,接下来就可以将这个世界上任何可以port的东西移植到FreeBSD上来吧:-).
  •  楼主| 发表于 2003-10-22 23:23:57 | 显示全部楼层
    openoffice文档:

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    发表于 2003-10-23 08:10:58 | 显示全部楼层
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表