今日、とあるホストでportupgradeを実行したら、以下のような、見慣れないエラーが発生。
# portupgrade -P curl-7.18.0
** Makefile possibly broken: ftp/curl:
grep: : No such file or directory
grep: : No such file or directory
"/usr/ports/Mk/bsd.openssl.mk", line 133: warning: "grep "^lib/libssl.so." """ returned non-zero status
curl-7.18.0
/usr/local/sbin/portupgrade:1468:in `get_pkgname': Makefile broken (MakefileBrokenError)
from /usr/local/sbin/portupgrade:622:in `main'
from /usr/local/sbin/portupgrade:613:in `each'
from /usr/local/sbin/portupgrade:613:in `main'
from /usr/local/sbin/portupgrade:588:in `catch'
from /usr/local/sbin/portupgrade:588:in `main'
from /usr/local/lib/ruby/1.8/optparse.rb:1303:in `call'
from /usr/local/lib/ruby/1.8/optparse.rb:1303:in `parse_in_order'
from /usr/local/lib/ruby/1.8/optparse.rb:1299:in `catch'
... 6 levels...
from /usr/local/lib/ruby/1.8/optparse.rb:785:in `initialize'
from /usr/local/sbin/portupgrade:229:in `new'
from /usr/local/sbin/portupgrade:229:in `main'
from /usr/local/sbin/portupgrade:2208
portupgradeだけでなく、makeしただけでも、エラーメッセージは表示されるらしいです。
# cd /usr/ports/ftp/curl
# make
grep: : No such file or directory
grep: : No such file or directory
"/usr/ports/Mk/bsd.openssl.mk", line 133: warning: "grep "^lib/libssl.so." """ returned non-zero status
「make -d A」とか、泥臭い方法で調べてみること、約3分。
/usr/ports/Mk/bsd.openssl.mk の以下のあたりでエラーが出てることがわかりました(てゆーか、そう、エラーメッセージで出てるし)。
PKG_DBDIR?= ${DESTDIR}/var/db/pkg
.if !defined(OPENSSL_INSTALLED)
OPENSSL_INSTALLED!= find "${PKG_DBDIR}" -type f -name "+CONTENTS" -print0 | \
xargs -0 grep -l "^lib/libssl.so." | \
while read contents; do \
sslprefix=`grep "^@cwd " "$${contents}" | ${HEAD} -n 1`; \
if test "$${sslprefix}" = "@cwd ${LOCALBASE}" ; then \
echo "$${contents}"; break; fi; done
.endif
findコマンドの動作がちょっと怪しい気がしたので、手で実行してみると
# find /var/db/pkg -type f -name "+CONTENTS" -print
何もでてきません。
実は、たくさんあるFreeBSDのなかで、このエラーがでたホストだけ、/var/db/pkgがsymbolic linkだったんです。/var パーティションの空き容量が不足してきてしまったもので、別パーティションに、ファイルを移動させていたのでした。
# ls -l /var/db/pkg
lrwxr-xr-x 1 root wheel 17 10 10 2006 /var/db/pkg -> /home/var/db/pkg
ちょこっと変更して、パス名の最後に/をつけてやれば、findコマンドは、ディレクトリを探索していってくれているらしいです。
# find /var/db/pkg/ -type f -name "+CONTENTS" -print
/var/db/pkg/pciids-20080312/+CONTENTS
/var/db/pkg/libiconv-1.11_1/+CONTENTS
/var/db/pkg/gmake-3.81_3/+CONTENTS
(以下省略)
という感じ
というわけで、とりあえず、/etc/make.conf に
PKG_DBDIR=/var/db/pkg/
と書き加えてみたところ、うまいこと、portupgradeが動くようになりました。
/を付け足すのではなく、symbolic linkが指している先を、PKG_DBDIRで指定するべきかもしれませんが。
☆
symbolic linkを使ってると、こういうこともありえるんだ、と、いまさらの発見。自分でも、シェルスクリプトを書くときは、気をつけよう、と、肝に銘じたのでした。