2008年3月4日 星期二

PERL_DEPENDS family in bsd.perl.mk

事情要從 des@ 在 freebsd-perl@ 的一篇抱怨說起

des@ 說我們現在有太多的 p5-* 會去拉 p5-Test-*,所以造成了一堆不必要的相依關連。這個問題我也常碰到,很久很久以前的設定常常是這樣:

BUILD_DEPENDS= ${SITE_PERL}/${PERL_ARCH}/Digest/MD5.pm:${PORTSDIR}/security/p5-Digest-MD5 \
${SITE_PERL}/Test/Pod.pm:${PORTSDIR}/devel/p5-Test-Pod \
${SITE_PERL}/Test/More.pm:${PORTSDIR}/devel/p5-Test-Simple
RUN_DEPENDS= ${BUILD_DEPENDS}

這裡產生兩個問題,一個是 Digest::MD5 已經包在 perl-5.7.3 以後的 core list 之中,所以新版的 perl 應該不需要另外拉 Digest::MD5;另一個問題是 Test::Pod 只用來測試,不應該被放進 RUN_DEPENDS;至於 Test::More 則是兩者兼有之,可是我們又不一定能直接捨棄 Test::More,因為有可能這個 module 本身會使用某個新版 Test::More 的功能,舉例來說,使用到 perl-5.8.7 以後內建的 Test::More 0.54。所以如果是我經手的 port,我都會把他改成這樣:

BUILD_DEPENDS= ${RUN_DEPENDS}
BUILD_DEPENDS+=${SITE_PERL}/Test/Pod.pm:${PORTSDIR}/devel/p5-Test-Pod
.if ${PERL_LEVEL} < 500703
RUN_DEPENDS+= ${SITE_PERL}/${PERL_ARCH}/Digest/MD5.pm:${PORTSDIR}/security/p5-Digest-MD5
.endif
.if ${PERL_LEVEL} < 500807
RUN_DEPENDS+= ${SITE_PERL}/Test/More.pm:${PORTSDIR}/devel/p5-Test-Simple
.endif

也就是說,把真正會用到的放在 RUN_DEPENDS,把只有測試會用到的放在 BUILD_DEPENDS,這樣包 package 的人會兩個都拉到,但是用 package 的人只會拉到 RUN_DEPENDS。不過即使如此,des@ 還是嫌拉太多東西了,而且 p5-* port maintainer 要去記住每一個模組出現在每一個版的 perl 之中的版本,所以對 maintainer 來說也是額外的負擔。之後,tobez@ 的一篇提議, 建議新增兩個設定,一個是 PERL_DEPENDS 一個是 PERL_TEST_DEPENDS,另外在 bsd.perl.mk 裡面維護一份各個版本的列表,這樣讓 bsd.perl.mk 來檢查版本,並且決定哪些需要被帶入 BUILD_DEPENDS 和 RUN_DEPENDS。至於 p5-Test-* 及其他測試專用的模組,則另外定義 PERL_TEST_DEPENDS,只有設定 P5PORTER 的時候,才會把它帶入檢查流程並視需要放進 BUILD_DEPENDS。

我試著按照 tobez@ 的理念去實做這幾個設定,但是發現 tobez@ 原先提議的實在改了太多,為了不讓 PERL_DEPENDS 步上 PERL_(BUILD|RUN)_DEPENDS 的後塵,我試著在最小修改和維持最大相容性的情況下,完成 tobez@ 原本的設計理念。

如果這個 PR 可以被接受的話,以後只要寫這樣:

PERL_DEPENDS= Digest::MD5>=0:${PORTSDIR}/security/p5-Digest-MD5
PERL_TEST_DEPENDS= Test::Pod:${PORTSDIR}/devel/p5-Test-Pod \
Test::More>=0.54:${PORTSDIR}/devel/p5-Test-Simple

剩下的問題,例如哪個版本已經內建哪些模組,有沒有滿足需求,要不要另外拉,就交給 bsd.perl.mk 來處理吧。

0 意見: