回到首頁過去文章最新消息FAQ相關討論 | 關於我們

FreeBSD Ports System : Master/Slave ports、Language ports、Meta ports


作者:ijliao

1. 前言

在介紹過了 port 的使用和製作方法以後,接下來要認識一些比較 "複雜" 的東西,也就是標題上面寫的那三種 master/slave、language、meta;不過因為這三種 ports 比較特殊,一時之間也找不到適當例子可以實做給大家看,所以本期就以參觀附帶講解為主。

2. Master/Slave ports

這一部份我拿大家耳熟能詳的 "MySQL" 來做例子。

進到 ports/databases 裡,可以看到 mysql 有很多版本,3.2.3/4.0/4.1/5.0,再仔細看看,每個版本都還分成兩三個不一樣的 port,-client/-server 等等;切進各個目錄看看,嗯... -server 的看起來好像還蠻正常的,該有的檔案都有,但是為什麼 -client 的就都只有一個 Makefile,而且這個 Makefile 長得看起來也不太像是以前看過的樣子呢 ? 其實這就是所謂的 Master/Slave ports,而很明顯的 -server 是 Master port,-client 就是 Slave port 啦。

簡單的說,你可以把 slave port 想像成是 "master port 的特例" (這個例子要看 ports/editors/vim 和 ports/editors/vim-lite 比較容易體會),所有的設定都寫在 master port 那邊,而 slave port 只是 enable/disable 某些選項。在做 master/slave port 的時候其實和其他 port 沒什麼不同,只有幾個地方要特別注意:

  • Master port 方面:
    • MAINTAINER 要用 MAINTAINER?= 來指定,除非你確定 slave port 也是你自己要 maintain;
    • COMMENT 要用 COMMENT?= 來指定,這樣 slave port 才能用 COMMENT= 來 override 掉。

  • Slave port 方面:
    • MASTERDIR 要記得設定;
    • 最下面要改成 .include "${MASTERDIR}/Makefile" 而不是常見的 .include

3. Language ports

對非英語系國家的使用者而言,對電腦的恐懼除了科技本身以外,語言不通也是很大的一個因素;不過還好有很多熱心的人為大家做了很多修補工作,讓大家用起來更方便。在 FreeBSD 的 ports system 裡面,這些 language ports 是以一種 "master/slave ports 的特例" 的型式存在,以下就拿 ports/chinese/mutt 來做介紹:

  • 原本 port 方面:
    • MAINTAINER 和 COMMENTS 一樣要改成 ?= ;
    • CATEGORIES 改成 CATEGORIES+= ,這樣 ports/chinese/mutt 就會自動被歸類到 chinese 和 mail ipv6 這幾個分類去;
    • 如果這個 language port 有用到 *_DEPENDS 的話 (例如 ports/chinese/mutt 多用了 LIB_DEPENDS),記得去把原本的 *_DEPENDS 也改成 += 。

  • Language port 方面:
    • 一樣不要忘了 MASTERDIR ;
    • MAINTAINER 和 COMMENTS 也要改,CATEGORIES 記得加 chinese ;
    • 如果有 patch 的話,要用 EXTRA_PATCHES 指定,可以參考 ports/chinese/tin 的範例。

4. Meta ports

不知道大家有沒有自己 build 過 X/gnome/KDE 等等巨型程式 ? 有沒有想像過如果 build 到一半出錯了怎麼辦 ? 在古老的年代裡,只要中途出了點小錯,或者是只要有一個小程式要更新,使用者就要花時間把所有的程式全部重新 build 一次;不過在發展出 meta port 的技術以後,使用者可以很輕易地分別安裝分別升級,再也不用被綁在一起了。

在 meta port 裡面,通常會看到 MASTER_SITES、DISTFILES 和 EXTRACT_ONLY 被設成 empty,NO_BUILD 被設成 yes,do-install 也不會做任何事,然後 *_DEPENDS 下面就列了落落長一大串;這麼一來,當使用者在安裝的時候,會自動去安裝各別的 sub-port,全部安裝完了以後,目前的這個 meta port 也就自動完成了。而在要昇級的時候也是一樣,只要 depends 沒設錯,對 meta port 下 portupgrade 的指令就會自動去昇級各該 sub-port。

5. 結語

看了這麼幾期下來,讀者們應該對於 ports collection 不管是在使用上或是在製作上都應該有了相對的了解,希望大家有空的時候也能練習一下,多多 submit 一些程式到 FreeBSD 的 ports 來,讓 ports collection 更豐富。另,這是本系列的最後一篇,爛戲拖棚也到了尾聲,下回就要想新題目了 XD