2009-04-21

FreeBSDのportsでmake installするときは-dlなど禁止

makeの -dl は、makeが実行するコマンドをすべて強制表示させるオプションで、Makefileなんかで非表示にしたコマンドも表示されるので、デバッグに便利な機能である。

portsのmake時にいったい何が起きているのかを表示させようと、portupgrade -f -m -dl hoge とかやってみたところ、たしかに期待どおりに表示されるのだが、もう一度portupgradeしようとすると、

Stale dependency: hoge --> ] -- manually run 'pkgdb -F'...
とか言われるようになり、pkgdb -F をするはめになる。そうすると何やらわけのわからない依存関係が多量に削除される。

で、hoge/+CONTENTS を見てみたら、多量のゴミが。

しばらく bsd.port.mk と格闘したところ、fake-pkg のターゲットで Registering installation for hoge と表示した後の処理で使う PKG_ARGS の展開結果がおかしい。その定義はというと、make actual-package-depends を実行した結果を加工している。つまり、このmakeの実行時に -dl が有効になってしまって、ゴミが出力され、それも含めて加工した結果をpkg_createに渡しているせいで、+CONTENTSが壊れるということらしい。

makeが子makeを呼ぶときに .MAKEFLAGS を渡すが、この中から -d* を探して削除するというコードが必要になる。とってもめんどくさそうなので、make install時に限っては -d* をつけないことにする。

あとでpkgdb -Fすればいいんだから簡単じゃないかとも思えるが、-dg2 とかしたらpkgdb -Fの後でもpkg_deleteがcoreを吐くとかいう事態になる。


追記(5/7)

デバッグオプションを取り除いて子makeを呼ぶコードを書いてみた。
--- bsd.port.mk.orig 2009-04-10 07:40:20.000000000 +0900
+++ bsd.port.mk 2009-05-06 13:36:11.000000000 +0900
@@ -2384,7 +2384,18 @@
.endif

.if !defined(PKG_ARGS)
-PKG_ARGS= -v -c -${COMMENT:Q} -d ${DESCR} -f ${TMPPLIST} -p ${PREFIX} -P "`cd ${.CURDIR} && ${MAKE} actual-package-depends | ${GREP} -v -E ${PKG_IGNORE_DEPENDS} | ${SORT} -u -t : -k 2`" ${EXTRA_PKG_ARGS} $${_LATE_PKG_ARGS}
+_MINUSD= -d
+. for _MAKEFLAG in ${.MAKEFLAGS}
+. if ${_MINUSD} == ${_MAKEFLAG}
+_AFTERMINUSD= yes
+. else
+. if !defined(_AFTERMINUSD)
+_NODEBUGMAKEFLAGS+= ${_MAKEFLAG}
+. endif
+.undef _AFTERMINUSD
+. endif
+. endfor
+PKG_ARGS= -v -c -${COMMENT:Q} -d ${DESCR} -f ${TMPPLIST} -p ${PREFIX} -P "`cd ${.CURDIR} && MAKEFLAGS=${_NODEBUGMAKEFLAGS} ${MAKE} actual-package-depends | ${GREP} -v -E ${PKG_IGNORE_DEPENDS} | ${SORT} -u -t : -k 2`" ${EXTRA_PKG_ARGS} $${_LATE_PKG_ARGS}
.if !defined(NO_MTREE)
PKG_ARGS+= -m ${MTREE_FILE}
.endif

一応動いてそうなので、いつかのためにメモ。


追記(5/20)

やっぱりダメ。依存関係によってインストールされたパッケージに正常に@pkgdepがつかない。 -DINSTALLS_DEPENDS がうまくわかってない感じ。