ttt

getttyent

(FreeBSD) ports, portupgradeで、"/usr/ports/Mk/bsd.o

2008-08-11 22:28:16 | デジタル・インターネット

今日、とあるホストで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を使ってると、こういうこともありえるんだ、と、いまさらの発見。自分でも、シェルスクリプトを書くときは、気をつけよう、と、肝に銘じたのでした。