2008年8月12日火曜日

(FreeBSD) ports, portupgradeで、"/usr/ports/Mk/bsd.openssl.mk", line 133: warning: "grep "^lib/libssl.so." """ returned non-zero status というエラー

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



0 件のコメント:

コメントを投稿