ports-mgmt/portconf 是一個很好用的工具,可以設定一個 port.conf,內容大致上的形式是這樣:
editor/vim*: WITH_CSCOPE=yes | WITH_EXUBERANT_CTAGS=yes
如此一來,portconf 便會在 /etc/make.conf 自動去 parse port.conf,然後將對應的參數加入,以上面的例子,如果我安裝 editor/vim or editor/vim-lite 都會自動加入 “WITH_CSCOPE=yes WITH_EXUBERANT_CTAGS=yes”,這樣我們便可以更方便地管理各種不同 ports 的安裝參數。
但是,原本的 portconf 只是單純地判斷是否在 /usr/ports 下執行 make 的,如果 /usr/ports 是使用 soft link 的方式,其 real path 卻是在其它地方,那麼 portconf 便不會運作,它判斷的程式碼是加在 /etc/make.conf:
.if !empty(.CURDIR:M/usr/ports*) && exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
從上面可以看到,它是利用 make 的 modifier 去比對,但是 modifier 其後接的 pattern 是不接受變數展開的,也就是說我們不能這樣寫:
_PORTDIR!=/bin/realpath /usr/ports
.if !empty(.CURDIR:M${_PORTDIR}*) && exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
這是 make 本身的限制,rafan 後來送了個 patch,讓 portconf 可以在安裝的時候自動將 make.conf 裡 /usr/ports 換成它的 real path,但是只保證安裝時候判斷,如果 real path 換地方了,便得手動修改或是乾脆重裝 portconf,其實 /usr/ports 的 real path 多半很少換,只要記得換了要修改或重裝就好,所以也還可以,但是我在想有什麼方式可以達到真正的動態判斷 real path,後來我改出了兩個版本:
Version 1
第一個版本想法是既然直接在 make.conf 做判斷有困難,那不如都改到 portconf 那隻 shell script 去判斷吧!
/etc/make.conf
.if exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
/usr/local/libexec/portconf 前面加入
_portdir=`/bin/realpath /usr/ports`
_curdir=`pwd`
if [ "${_curdir##${_portdir}*}" != "" ]; then
exit
fi
Version 2
第二個版本是直接在 make.conf 利用外部工具做判斷,只需要修改 make.conf,不用動到 portconf 那隻 shell script。
/etc/make.conf
_PORTSDIR!=/bin/realpath /usr/ports
_MATCHDIR!=echo `echo ${.CURDIR} | /usr/bin/grep ^${_PORTSDIR}`
.if !empty(_MATCHDIR) && exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
上面兩個版本都可以達到動態判斷 real path,但是有一利必有一弊…原本 portconf 利用 make 本身的 modifier 便是為了減少每次呼叫 make 多花費在判斷的時間,這對於一般的 ports 安裝來說,不會有多大的影響,但是對於 make buildworld 來說,便有可能造成很大的影響,所以我做個了測試,看看上面兩種修改在 make buildworld 增加多少時間,我的測試環境是:
- CPU:Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz (2333.35-MHz K8-class CPU)
- OS:FreeBSD 7.0R amd64
測試出來的結果:
- Original:60m57.49s
- Version 1:62m6.19s
- Version 2:61m29.74s
這樣的結果我還算可以接受,所以我選擇了 Version 2 的版本 (雖然它做法挺髒的 XD)。
0 Response to “portconf 處理 soft link 的問題”