更新 INDEX 对照表
4.x 的 INDEX 位於 /usr/ports/INDEX,5.x 位於 /usr/ports/INDEX-5。 INDEX 是对照 ports 所有相依等资讯的对照表,若长期未更新的话,会导致ports 对照失败。官方有定期更新 INDEX,如果 想自行更新的话,则:
cd /usr/ports/
make fetchindex
更新 INDEX HTML
FreeBSD 提供了用网页的方式来观看 ports collection,即可使用 lynx, w3m, links 或其它可浏览网页的程式来查阅。制作全部 ports collection 的方式如下:
cd /usr/ports/
make readmes
如果是仅须要做目前目录下的资讯,或单一更新某一分类下的资讯,如 /usr/ports/ftp/ 的话,则:
cd /usr/ports/ftp/
make readme
则仅会更新 /usr/ports/ftp/ 这个目录的资讯,其上与其下的目录皆不会更动到。 执行成功後,会在相对应的目录下产生 README.html 的档案。
更新 ports Mk
Mk (/usr/ports/Mk/) 是编译 ports 时所叁考的设定,有时若发生 ports
collections 太新,而导致 Mk 的内容不符,此时 就是应该更新 Mk 的时候了。
cd /usr/src/
make update
cd /usr/src/share/mk
make install
以关键字在ports寻找软件
如果要从全部的 ports collection 中找寻与关键字 "ldap" 有关的 ports,则:
cd /usr/ports/
make search key=ldap | grep ^Path
如果只要从与 ftp 相关的 ports 下找寻与关键字 "ldap" 有关的 ports,则:
cd /usr/ports/ftp/
make search key=ldap | grep ^Path
还有另一个用法,方法只是将 key 换成 name 。如果已经知道要搜寻 ports 的名称,或只想找名称相关的关键字 "ldap", 则:
cd /usr/ports/
make search name=ldap | grep ^Path
如果只要从 ftp 相关的 ports 下找寻名称与关键字 "ldap" 有关的 ports,则:
cd /usr/ports/ftp/
make search name=ldap | grep ^Path
安装一个新的 port
如果系统上未安装此软体,则可以选择安装一个新的 port。以 editors/joe 为例的话,则:
cd /usr/ports/editors/joe/
make install
如此会在系统上安装一个新的 joe 软体。如果需要在安装完成後,一并清除编辑时期所留下来的暂存目录,则:
cd /usr/ports/editors/joe/
make clean
如何得知 ports system 对某个 ports 所提供的编译叁数
所有的 ports collections 中所提供的编译叁数都会在对应的 Makefile 档案内详述,如 sysutils/portupgrade 的话,则是位在 /usr/ports/sysutils/portupgrade/Makefile 档案下。
可以对此档案浏览以得知编译时期可以下达的叁数,如对 sysutils/portupgrade 有提供 NOPORTDOCS,则:
cd /usr/ports/sysutils/portupgrade/
make -DNOPORTDOCS install 和make NOPORTDOCS=yes install 亦同那麽安装此 ports 时,会将 NOPORTDOCS 所对应的相关叁数指定进去。有时候设定较人性化的 ports 会在安装前提供叁数供选择,但是其实大部份的ports 都没有提供,因此必须自行去搜寻可编 译的叁数,在此我提供的方式如下:
cd /usr/ports/sysutils/portupgrade/
grep defined Makefile
如此几乎可以知道所有提供的可编译叁数,虽然有时会多出一些不相干的资料,不会这个确实是一个不错可叁考的方式。
安装 ports 前查询所需依赖/相关的套件
在安装 ports 前,可以查询所需依赖/相关的套件。以 mail/p5-Mail-SpamAssassin 为例的话,则:
cd /usr/ports/mail/p5-Mail-SpamAssassin/
make all-depends-list #显示所有相关的套件
make pretty-print-build-depends-list #显示编译期间所需要的套件
make pretty-print-run-depends-list #显示此套件要执行时所需要的套件
手动加入编译 ports 的叁数
在ports collections 有提供的前提之下,有时候并不是所有该软体所支援的叁数 都会收纳在 ports collections 中,因此有时候会需要手动加入编译的叁数。如 ftp/pure-ftpd 中,如果不想把 inetd 的支援编入的选项,并没有被 ports collections 所纳入,因此必须手动加上这个 编译叁数,如下:
cd /usr/ports/ftp/pure-ftpd/
make CONFIGURE_ARGS+="–without-inetd" install
指定 ports 的安装路径
预设 ports collecions 已安排安装的路径 (/usr/local/),如果不想将套件安装在预设路径的话,可以手动指定安装路径。 以 editors/joe 为例,则:
cd /usr/ports/editors/joe/
make PREFIX=/usr install
那么 joe 就会将档案对应在 /usr 目录下,而不是预设的 /usr/local 目录下。
只下载源码包
cd /usr/ports/editors/joe/
make fetch
预设会将 joe 的 源码包 下载至 /usr/ports/distfiles/ 目录下。
下载安装此 ports 所有须要的其他 ports 的 源码包
cd /usr/ports/systuils/portupgrade/
make fetch-recursive
预设会将此 ports 的源码包与所有须要的其他ports 的源码包,下载至 /usr/ports/distfiles/ 目录下。
下载全部所有 ports 的 源码包
cd /usr/ports/
make fetch
则会所将全部所有 ports 的 源码包 下载至 /usr/ports/distfiles/ 目录下。
下载全部 ftp 下所有 ports 的 源码包
cd /usr/ports/ftp/
make fetch
则会所将全部 ftp 下所有 ports 的 源码包 下载至 /usr/ports/distfiles/目录下。
下载并解开源码包的步骤
cd /usr/ports/editors/joe/
make extract
会将源码包解开至 /usr/ports/editors/joe/work/ 目录下。
解开源码包并补上官方提供的 patch
先补上官方提供的 patch ,再行 patch 自己的修正。以 editors/joe 为例的话,则:
cd /usr/ports/editors/joe/
make patch
会将源码包解开至 /usr/ports/editors/joe/work/ 目录下,并已经 patch 上官方提供的 patch。
如果想要一次清掉所有 ports 产生的暂存资料,则只要回到 ports 的根目录执行即可:
cd /usr/ports/
make clean
安装一个新的 port,并将打包(package)起来
将安装完成的软体打包起来,有许多便利性:包括在丛集系统中,可供其它机器 使用,或将未来此软体出问题可重新利用此 package 重新快速安装。以 editors/joe 为例的话,则:
cd /usr/ports/editors/joe/
make package
如此会在系统上安装一个新的 joe 软体,并将此软体打包(package)起来。package 预设会在 /usr/ports/editors/joe/ 目录下,如果希望集中管理的话,建议做如下的步骤:
mkdir -p /usr/ports/packages/All/以後打包的 packages 都会存放在此目录下,并且系统会自动做分类,以方便管理。如果需要在安装完成後,一并清除编辑 时期所留下来的暂存目录,使用,如:
cd /usr/ports/editors/joe/
make package clean
打包一个 port,并将其所有相依的 ports 也打包起来
如果编辑一个 port 需要依赖其它的ports,那麽必须将其它 ports 也一起打包,否则安装 packages 会有相 依赖其它 ports 的 packages 的问题。以 sysutils/portupgrade 为例的话,则:
cd /usr/ports/sysutils/portupgrade/
make DEPENDS_TARGET=package package
如此会在对所有 portupgrade 所相依赖的 ports 一并打包,也包括自己本身。
对一个已经安装的 port 打包
如果安装好一个套软,事前并未打包,事後想打包的话,则:
以 editors/joe 为例的话
cd /var/db/pkg/
pkg_create -b joe-{版本号}
会将已安装的 port 打包起来,放在 /var/db/pkg/ 目录下。
清理 ports 编辑期间所产生的暂存资料
在编辑 port 的时候,会有编辑期间所需要的工作目录(work),因此通常安装好一个套件後,会清除此暂存目录,以节省系 统磁碟空间。以 editors/joe 为例的话,则:
cd /usr/ports/editors/joe/
make clean
如果是希望清除所有 ports 的暂存目录,则:
cd /usr/ports/
make clean
如果是希望清除全部 ftp 下所有的暂存目录,则:
cd /usr/ports/ftp/
make clean
清理 ports 编辑期间所产生的暂存资料,以及其相对应的源码包
make clean,仅只是清除编辑期间所需要的工作目录(work),并没有将编译ports 时一并下载的 源码包 删除(相对应之 源码包 预设会存放在 /usr/ports/distfiles/),如果欲把 源码包 一并删除,以 editors/joe 为例的话,则:
cd /usr/ports/editors/joe/
make distclean
make distclean 的步骤包含了 make clean 的功能,也就是说除了会删除源码包 外,还会一并清除编辑期间所产生的工作目录。
如果是希望清除所有 ports 的暂存目录,及源码包 ,则:
cd /usr/ports/
make distclean
如果是希望清除全部 ftp 下所有的暂存目录,及 源码包,则:
cd /usr/ports/ftp/
make distclean
移除已安装的 ports
以 editors/joe 为例的话,则:
cd /usr/ports/editors/joe/
make deinstall
或是使用 pkg_delete
cd /var/db/pkg/
pkg_delete joe-{version}
有时候套件之间的相依性会导致无法直接移除,如果要强制移除的话,则:
cd /var/db/pkg/
pkg_delete -f joe-{version}但很有可能会导致其它的套件执行起来出现问题。
一并移除所相依的 ports
以 sysutils/portupgrade 为例的话,则:
cd /usr/ports/sysutils/portupgrade/
make deinstall-depends
执行此步骤前,请注意是否会移除应该保护的套件。
或是使用 pkg_delete
cd /var/db/pkg/
pkg_delete -r portupgrade-{version}
重新安装已安装过的 ports
重新安装的前提是,之前有安装过或目前已安装。以 editors/joe 为例的话,
则:
cd /usr/ports/editors/joe/
make deinstall
make clean
make install 或 make reinstall
升级已安装的 ports
如果已经安装好套件,事後欲升级的话,必须先移除旧版本的 port,移除的方法以 editors/joe 为例,则:
cd /var/db/pkg/
pkg_delete joe-{version}
cd /usr/ports/editors/joe/
make install
或是
cd /usr/ports/editors/joe/
make clean
make reinstall
安装旧版的 ports
有时候会因为相依性,或是新版有问题,而会想装旧版本的套件。这里的方法是利用 CVS 的好处,回归到以前旧版本存在的日子,以安装旧版本的套件。首先,若我们要回复到某一个套件的版本时,需要去查询 FreeBSD ports CVS repository。最常见的就是 Freshports 网站、 FreeBSD 的 Mailing FreeBSD cvs 或是 FreeBSD ports cvsweb。
查到该套件版本所依存的日子後,就修改 CVS tag。一般预设 ports 的 CVStag 会写在 /usr/share/examples/cvsup/ports-supfile ,如要回朔到2002/10/05 号的话,则:
vi /usr/share/examples/cvsup/ports-supfile
******************************************
default date=2002.10.05.00.00.00 #将 date 改成当日然後按照一般 CVSup 的时候一样,执行 CVSup (make update),此时的 portscollections 就会回到当时的情形,那麽该套件旧版本也会出现在 ports collections 中,只要安装即可。
如果仅是想把某部份的 ports 回朔,则必须加上额外的资讯,如仅希望把lang/perl5.8 回朔,而得知此属於 lang 中的一支,则:
vi /usr/share/examples/cvsup/ports-supfile
******************************************
ports-all #将 ports-all 标示起来ports-lang #加入这行最後,执行 CVSup,并安装即可。目前若希望单独回朔单一的 ports,则比较麻烦。
安装 ports 出现 FORCE_PKG_REGISTER 的错误讯息
問題敘述:
當你先前已經用ports 安裝過某一軟體 當你要再次透過ports 安裝同一軟體時,
很有可能會出現類似下述的錯誤訊息產生. 意思是說 你可以透過 make deinstall 解除安裝 然後透過 make reinstall來再次安裝
若你確定想要*覆蓋*此安裝 可以透過設定 FORCE_PKG_REGISTER 變數達成目標.
===>; An older version of PORTS資料夾位置 is already installed (軟體版本)
You may wish to “make deinstall\’\’ and install this port again
by “make reinstall\’\’ to upgrade it properly.
If you really wish to overwrite the old port of PORTS資料夾位置
without deleting it first, set the variable "FORCE_PKG_REGISTER"
in your environment or the "make install" command line.
處理方式:
只要在make install 時加上 FORCE_PKG_REGISTER="yes" 就可以強制安裝.
也就是: /usr/ports/資料夾位址/#make install FORCE_PKG_REGISTER="yes"
解决安装 ports 时出现 sed -i 的错误
因为 BSD style 的 sed ,也就是 BSD 本身自有的 sed ,与一些 ports 编译期间所执行的 sed 不一致,所以会导致一些语 法错误。此时先安装 sed_inplace(textproc/sed_inplace),然後再安装原本无法安装的 ports:
cd /usr/ports/???/???/
make -DUSE_REINPLACE install
安装 ports 出现 Shared object libintl.so.X not found 的错误讯息
Shared object "libintl.so.4" 或 (libc.so.4) not found
問題敘述:
近來的FreeBSD版本,常常在安裝某些軟體時,會出現類似的失敗畫面並且告訴你缺乏 libintl.so.4或是 libc.so.4 這個函式.
Shared object "libc.so.4" not found
如下圖:是近來版本安裝某些程式問題時常見的問題,缺少 libc.so.4 函式.
問題分析:
提到libc.so函式 首先想到的是與 linux 程式相關共享函式庫. FreeBSD在讀取相關函式前,首先會在 /compat/linux 資料夾中尋找; 然後若找不到則會嘗試搜尋 /lib 資料夾. 以 libc.so 函式為例,會先尋找/compat/linux/lib/libc.so ; 其次才是/lib/libc.so .