2008年12月2日火曜日

(FreeBSD) USE_FORTRAN=yesの罠 ~ gcc42をうっかりアンインストールしてはいけない

portsのlang/gcc42のバージョンがあがっていることに気がつきまして、いつもパッケージビルドを行っているマシンではportupgradeしましたが、全部のFreeBSDマシンをアップデートするのはめんどくさい。



どうしてここにgcc42がインストールされているんだ?と疑問に思うホストがあり、どいつが依存しているんだ? ということで調べてみると…



/var/db/pkg/gcc-4.2.5_20081126/には、+REQUIRED_BYがありません。
というか、本当はpkg_infoコマンドで調べるんでしょうが…



# pkg_info -R /var/db/pkg/gcc-4.2.5_20081126/
Information for gcc-4.2.5_20081126:



じゃあ消しちゃえ!ということでpkg_deleteしちゃいました。しばらくして、とあるプログラムで、libgcc_s.so.1がないというエラーが出ることに気がつきました。



あっそうか!



lddコマンドで調べてみると、libgcc_s.so.1とか、libgfortran.so.2がリンクされています。



libgcc_s.so.1 => /usr/local/lib/gcc-4.2.5/libgcc_s.so.1 (0x483a8000)
libgfortran.so.2 => /usr/local/lib/gcc-4.2.5/libgfortran.so.2 (0x48400000)



gcc42でビルドしたアプリは、gcc42でインストールされた共有ライブラリに依存してたんですね。



え~、じゃあgcc42の+REQUIRED_BYに入ってないとおかしいんじゃない?!



gcc42をpkg_deleteしたソフトでは、portsのMakefileに「USE_FORTRAN=yes」と書いてありました。



/usr/ports/Mk/bsd.gcc.mkの中には、こんなのがあります。



.if defined (USE_FORTRAN)
# gfortran42 from lang/gcc42 is the default for now.
. if ${USE_FORTRAN} == yes || ${USE_FORTRAN} == gfortran42
BUILD_DEPENDS+= gfortran42:${PORTSDIR}/lang/gcc42
FC:=    gfortran42
F77:=   gfortran42
. endif



BUILD_DEPENDSだけだったんですね。う~ん、それじゃまずいんじゃないかと。



USE_FORTRAN以外でも、BUILD_DEPENDSでlang/gcc42が入ってくるケースがあるみたいです。罠は、FORTRAN以外にもあると。





LispとかPrologなど、実社会ではほとんど役に立たない言語の授業が大学のときにありましたが、Fortranは無かったです。というわけで、Fortranはぜんぜん使ったことがないです。





夕方、金星、木星、月が見えました。かなり細長い、馬面なニコニコマークの形になてました。:)
うちに帰って写真をとろうと思ってたら、うちにつくころには雨が…





そういえば、FreeBSD 6.4が出てました。といっても、バージョン6系には、もはや、興味ないし…





0 件のコメント:

コメントを投稿