jdk で mak extract 済みなのに build を再開するのにソースが必要な理由2007年12月11日 13時56分08秒

FreeBSD の ports system は COOKIE を作り、既に終わった段階の処理は段階的に記録し、終了済の工程は処理を飛ばす。具体的には、EXTRACT_COOKIE、CONFIGURE_COOKIE、INSTALL_COOKIE、BUILD_COOKIE、PATCH_COOKIE、PACKAGE_COOKIE とあり、例えば、make extract が終わっているのであれば、make build をすると、extract までの処理を一気に飛ばして再開する。

そのために、一度 extract を終わらせておけば、distfiles に何もなくても、ports の build を終了できる。一部には patch が distfiles に置かれるものもあるので、それらは make patch が終わっていなければいけないが。laptop 等の持ち運び出来る PC を使っている場合には、便利に使える。時間の掛かる ports を出先でもコンパイルする事が出来て、膨大なファイルのある distfiles を持ち運ぶ必要もない。

ところが jdk 関連はそうはいかない。何故だか、extract 済みでも distfiles が要求される。COOKIE を点検すると確かに /ports/tmp/usr/ports/java/jdk15/work/.extract_done.jdk-1.5.0.13p7_1._usr_loc が存在する。ずっと不思議に、そして不便に思っていたのだ。そこで、Makefile を見た。

一行が長すぎるので改行した。


# Check for JDK sources and patch file
.if !defined(PACKAGE_BUILDING) && \
 (!exists(${DISTDIR}/${JRL_SRCFILE}) || \
 !exists(${DISTDIR}/${JRL_BINFILE}) || \
 !exists(${DISTDIR}/${JRL_MOZFILE}) || \
 (defined(WITH_POLICY) && !exists(${DISTDIR}/${POLICYFILE})) || \
 (defined(WITH_TZUPDATE) && !exists(${DISTDIR}/${TZUPDATEFILE})) || \
 !exists(${DISTDIR}/${PATCHSETFILE}))#{
ECHO_MSG=/usr/bin/printf
IGNORE= :\n\
Due to licensing restrictions, certain files must be fetched manually.\n\n
...

簡単にいうと、自前でファイルがあるかを調べているのだ。そして、そこには !exists(PATCH_COOKIE) がない。そこで、COOKIE を調べるコードを追加したが、うまくいかない。更に調べると、この COOKIE は bsd.port.porst.mk にて、定義される。そのため、この exists のある場所では使えないのだ。

この問題はかなり根が深く、簡単には修正できそうもない。COOKIE 定義場所を移すには、全ての ports への影響を調べる必要がある。だからといって jdk 内で、システムのデフォルトと同じ COOKIE を作るのは、おかしい。