◆ この Web ページで行うこと
FreeBSD のシステム(本体)は gcc 4.2.1 ベースです.gcc のバージョンアップの予定は無いらしいです. なので, make buildworld, make buildkernel にはバージョン 4.4 や 4.5 を使わずに,システムに付属のものを使うこと.
※ 参考ファイル: hoge4.sh
「FreeBSD システムの更新,ポーツコレクションの維持更新」 のページを参考に,次のことを行っておく.
GNU コンパイラコレクション・バージョンのバージョンをあげる前に, インストール済みのアプリケーションソフトウェアの全削除 を行うことを検討してください. メリットとデメリットがあります.
<メリット> 異なるバージョンでコンパイルされたソフトウェア(特に 4.2 以下と 4.3 以上)が混在していると,ビルド時に不可解なエラーが出る可能性がある(私の経験上).これを避けることが出来ます.
<デメリット> ソフトウェアを全部入れ直しです.設定ファイルなど,いろいろカスタマイズしているときは本当に面倒.
※ pkg_deinstall -a, pkg_delete -a は冗長な操作ですが、最悪、どちらかはうまくいくだろうと考えて書いています.
pkg_deinstall -a pkg_delete -a
次の操作で,GNU コンパイラコレクション・バージョン 4.4 / 4.5 のインストールを行う.
※ 次の操作により,次のgcc が依存するソフトウェア(前提ソフトウェア)も自動的にインストールされる(はず.)
バージョン 4.4 と 4.5 の違いはほとんどありません.
※ 再インストールしたい場合には,下記の手順の「make install」の代わりに「make deinstall reinstall」を実行してください.
■ バージョン 4.5の場合
cd /usr/ports/math/mpc make clean clean-depends make make install cd /usr/ports/lang/gcc45 make clean clean-depends make config-recursive
cd /usr/ports/lang/gcc45 make make install
■ バージョン 4.4の場合
cd /usr/ports/math/mpc make clean clean-depends make make install cd /usr/ports/lang/gcc44 make clean clean-depends make config-recursive cd /usr/ports/lang/gcc44 make make install
バージョン 4.4 と 4.5 の違いはほとんどありません.
※ 「make config-recursive」の結果を維持したいので, 「portupgrade -Np -b 'make rmconfig' lang/gcc45」とはせず,「portupgrade -Np lang/gcc45」を実行する
※ 再インストールしたい場合には上記の手順の「portupgrade -Npv lang/gcc44」の代わりに 「portupgrade -frprv lang/gcc44」を実行.
■ バージョン 4.5の場合
cd /usr/ports/lang/gcc45 make clean clean-depends make config-recursive portupgrade -Npv lang/gcc45
■ バージョン 4.4の場合
cd /usr/ports/lang/gcc44 make clean clean-depends make config-recursive portupgrade -Npv lang/gcc44
◆ pkg_info の実行例
pkg_info
■ バージョン 4.5の場合
■ バージョン 4.4の場合
◆ (参考)ls /usr/local/bin/*45*
◆ ここ以降の記述はオプションです(推奨ではありません). 手間もかかりますし,デメリットもありますので,よく検討の上,行ってください.
せっかくインストールしたので使ってみることにする.
これも,バージョン 4.4 と 4.5 の違いはほとんどありません.
■ バージョン 4.5の場合
/etc/make.conf の先頭部分に次を書き加える (参考 /usr/ports/Mk/bsd.gcc.mk)
USE_GCC=4.2+ .if ${.CURDIR:M/usr/ports*} != "" .if exists(/usr/local/lib/gcc45) CC=gcc45 GCC=gcc45 CXX=g++45 CPP=cpp45 USE_FORTRAN=yes FC=gfortran45 F77=gfortran45 .endif .endif
/etc/make.conf の末尾部分に次を書き加える (参考 /usr/ports/Mk/bsd.gcc.mk)
.if ${CC} == "gcc45" CFLAGS+=-Wl,-rpath,/usr/local/lib/gcc45 -Wl,-rpath,/usr/local/lib #LDFLAGS+=-Wl,-rpath,/usr/local/lib/gcc45 -Wl,-rpath,/usr/local/lib .endif
※ /etc/make.conf で「USE_GCC=4.2+」でなく,「USE_GCC=4.5+」にすると、 /usr/local/sbin/portupgrade:856:in 'get_all_depends': recursive dependency (RecursiveDependencyError) が発生します. 「USE_GCC=4.2+」にしているのはそのためです.
■ バージョン 4.4の場合
/etc/make.conf の先頭部分に次を書き加える (参考 /usr/ports/Mk/bsd.gcc.mk)
.if ${.CURDIR:M/usr/ports*} != "" .if exists(/usr/local/lib/gcc45) CC=gcc44 GCC=gcc44 CXX=g++44 CPP=cpp44 USE_FORTRAN=yes FC=gfortran44 F77=gfortran44 .endif .endif
/etc/make.conf の末尾部分に次を書き加える (参考 /usr/ports/Mk/bsd.gcc.mk)
.if ${CC} == "gcc44" CFLAGS+=-Wl,-rpath,/usr/local/lib/gcc44 -Wl,-rpath,/usr/local/lib #LDFLAGS+=-Wl,-rpath,/usr/local/lib/gcc44 -Wl,-rpath,/usr/local/lib .endif
ここでは,先ほど言及した gcc が依存するソフトウェア(前提ソフトウェア)と,それに加えて 次のソフトウェアを再コンパイルし再インストールしてみる. 先ほど /etc/make.conf に,GNU コンパイラコレクション・バージョン 4.4 や 4.5 を使うように設定したことに注意.
「make; make deinstall install」の「make;」は必要.make; でビルドした後で,インストールしなおす.
■ portupgrade を使わない場合の手順例
ここには再コンパイルと再インストールの例を示している. 新規インストールの場合には, 「cd /usr/ports/devel/libtool22; make; make install」のようにしてください.
※ 下記の手順例は,実は,冗長な操作も含んでいますが,説明の分かりやすさ優先
cd /usr/ports/devel/binutils; make clean; make; make deinstall reinstall cd /usr/ports/devel/bison; make clean; make; make deinstall reinstall cd /usr/ports/devel/gettext; make clean; make; make deinstall reinstall cd /usr/ports/devel/gmake; make clean; make; make deinstall reinstall cd /usr/ports/math/gmp; make clean; make; make deinstall reinstall cd /usr/ports/converters/libiconv; make clean; make; make deinstall reinstall cd /usr/ports/devel/libtool22; make clean; make; make deinstall reinstall cd /usr/ports/devel/m4; make clean; make; make deinstall reinstall cd /usr/ports/math/mpc; make clean; make; make deinstall reinstall cd /usr/ports/math/mpfr; make clean; make; make deinstall reinstall cd /usr/ports/lang/perl; make clean; make; make deinstall reinstall cd /usr/ports/devel/ppl; make clean; make; make deinstall reinstall cd /usr/ports/archivers/unzip; make clean; make; make deinstall reinstall cd /usr/ports/archivers/zip; make clean; make; make deinstall reinstall cd /usr/ports/lang/gcc44; make clean; make; make deinstall reinstall cd /usr/ports/lang/gcc45; make clean; make; make deinstall reinstall
■ portupgrade を使う場合の手順例
ここには再コンパイルと再インストールの例を示している. 新規インストールの場合には, 「portupgrade -Nprv devel/libtool22」のようにしてください.
※ 下記の手順例は,実は,冗長な操作も含んでいますが,説明の分かりやすさ優先
cd /usr/ports/devel/binutils; make clean; make clean-depends cd /usr/ports/devel/bison; make clean; make clean-depends cd /usr/ports/devel/gettext; make clean; make clean-depends cd /usr/ports/devel/gmake; make clean; make clean-depends cd /usr/ports/math/gmp; make clean; make clean-depends cd /usr/ports/converters/libiconv; make clean; make clean-depends cd /usr/ports/devel/libtool22; make clean; make clean-depends cd /usr/ports/devel/m4; make clean; make clean-depends cd /usr/ports/math/mpc; make clean; make clean-depends cd /usr/ports/math/mpfr; make clean; make clean-depends cd /usr/ports/lang/perl; make clean; make clean-depends cd /usr/ports/devel/ppl; make clean; make clean-depends cd /usr/ports/archivers/unzip; make clean; make clean-depends cd /usr/ports/archivers/zip; make clean; make clean-depends cd /usr/ports/lang/gcc44; make clean; make clean-depends cd /usr/ports/lang/gcc45; make clean; make clean-depends portupgrade -fprv devel/binutils portupgrade -fprv devel/bison portupgrade -fprv devel/gettext portupgrade -fprv devel/gmake portupgrade -fprv math/gmp portupgrade -fprv converters/libiconv portupgrade -fprv devel/libtool22 portupgrade -fprv devel/m4 portupgrade -fprv math/mpc portupgrade -fprv math/mpfr portupgrade -fprv lang/perl portupgrade -fprv devel/ppl portupgrade -fprv archivers/unzip portupgrade -fprv archivers/zip portupgrade -fprv lang/gcc44 portupgrade -fprv lang/gcc45
ここで、次の判断を行う
→ アプリケーションソフトウェアによっては,ビルドがうまくいかない場合が出てきます. そうなると,かなり手間がかかります. 対処法は,個々違う. 下に,対処の事例を書いています.
ここでは,エラーの例と対処法の例も示している. ここに示した対処法をやみくもに試してはいけません. まず,エラーの中身を確認し,それに応じた対処のみを実施すること.
◆ エラーの例
ポーツツリーの ports-mgmt/psearch でのビルド.
portupgrade -Nprv -B 'make rmconfig' ports-mgmt/psearch
すると,次のように 「psearch.cpp:209:41: error: 'strncmp' was not declared in this scope」というエラーメッセージが出る ことがある.
(原因)これは g++ 4.3 以上が gcc++ 4.2 と互換性がないことに起因する(と思われる)
◆ 対処法の例
ports-mgmt/psearch のビルドでは,システムに付属の g++ 等を使うように設定する. /etc/make.conf に次のような設定を書き加える.
.if ${.CURDIR:M/usr/ports/*/psearch*} != "" CC=gcc GCC=gcc CXX=g++ CPP=cpp USE_FORTRAN=no .endif
◆ エラーの例
ポーツツリーの graphics/libGL, graphics/libGLU でのビルド.
portupgrade -Nprv -B 'make rmconfig' graphics/libGL
すると,次のように 「..._x86-64.o: relocation R_X86_64_PC32 against symbol '_gl_DispatchTSD' can not be used when making a shred object: remompile with -fPIC」というエラーメッセージが出ることがある.
◆ 対処法の例
/etc/make.conf に次のような設定を書き加える.graphics/libGLU でも同じエラーが出るので,ついでに対処しておく.
.if ${.CURDIR:M/usr/ports/*/libGL} != "" CC=gcc GCC=gcc CXX=g++ CPP=cpp USE_FORTRAN=no .endif .if ${.CURDIR:M/usr/ports/*/libGLU} != "" CC=gcc GCC=gcc CXX=g++ CPP=cpp USE_FORTRAN=no .endif .if ${.CURDIR:M/usr/ports/*/dri} != "" CC=gcc GCC=gcc CXX=g++ CPP=cpp USE_FORTRAN=no .endif
ポーツツリーの graphics/gd でのビルド.
portupgrade -Nprv 'make rmconfig' graphics/gd
◆ エラーの例
ポーツツリーの graphics/gd で, 「undefined reference to 'FcPatternDestroy」
(原因)fontconfig 等のライブラリが 4.5 よりも古いコンパイラでコンパイルされていた(と思われる)
◆ 対処法の例
1つの方法は,下のように graphics/gd でライブラリを使わないように設定しなおすこと
※ 他の方法としては,ライブラリを再コンパイル
cd /usr/ports/graphics/gd make config
その後,次のように設定(全てのチェックを外す)
portupgrade -Nprv graphics/gd