FreeBSD で GNU コンパイラコレクション・バージョン 4.4 / 4.5 のインストールと設定
◆ この Web ページで行うこと
- (オプション)インストール済みのアプリケーションソフトウェアの全削除
- FreeBSD で GNU コンパイラコレクション・バージョン 4.4 や 4.5 のインストール
- インストールしたコンパイラを使い,ポーツ・ツリーのアプリケーションソフトウェアをビルドしてみる.
FreeBSD のシステム(本体)は gcc 4.2.1 ベースです.gcc のバージョンアップの予定は無いらしいです. なので, make buildworld, make buildkernel にはバージョン 4.4 や 4.5 を使わずに,システムに付属のものを使うこと.
* 参考ファイル: hoge4.sh
前準備
システムの更新
「FreeBSD システムの更新,ポーツコレクションの維持更新」 のページを参考に,次のことを行っておく.
- FreeBSD のセキュリティパッチ
- ポーツ・コレクション(ports collection) のダウンロード,アップデート(更新)
GNU コンパイラコレクション・バージョン 4.4 / 4.5 のインストールと設定
(オプション)前準備として,インストール済みのアプリケーションソフトウェアの全削除
GNU コンパイラコレクション・バージョンのバージョンをあげる前に, インストール済みのアプリケーションソフトウェアの全削除 を行うことを検討してください. メリットとデメリットがあります.
<メリット> 異なるバージョンでコンパイルされたソフトウェア(特に 4.2 以下と 4.3 以上)が混在していると,ビルド時に不可解なエラーが出る可能性がある(私の経験上).これを避けることが出来ます.
<デメリット> ソフトウェアを全部入れ直しです.設定ファイルなど,いろいろカスタマイズしているときは本当に面倒.
* pkg_deinstall -a, pkg_delete -a は冗長な操作ですが、最悪、どちらかはうまくいくだろうと考えて書いています.
pkg_deinstall -a
pkg_delete -a
GNU コンパイラコレクション・バージョン 4.4 / 4.5 のインストール
次の操作で,GNU コンパイラコレクション・バージョン 4.4 / 4.5 のインストールを行う.
* 次の操作により,次のgcc が依存するソフトウェア(前提ソフトウェア)も自動的にインストールされる(はず.)
- devel/binutils
- devel/bison
- devel/gettext
- devel/gmake
- math/gmp
- converters/libiconv
- devel/libtool22
- devel/m4
- math/mpc ※ バージョン 4.5 のみ
- math/mpfr
- lang/perl
- archivers/unzip ※ バージョン 4.5 のみ
- archivers/zip ※ バージョン 4.5 のみ
* portupgrade を使わない場合の手順例
バージョン 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
* portupgrade を使う場合の手順例
バージョン 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*



(オプション)ポーツ・ツリーでのビルドに gcc 4.4 / 4.5 を使うように設定してみる(ヒント)
◆ ここ以降の記述はオプションです(推奨ではありません). 手間もかかりますし,デメリットもありますので,よく検討の上,行ってください.
せっかくインストールしたので使ってみることにする.
/etc/make.conf の設定
これも,バージョン 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
バージョン 4.4 / 4.5 を用いた再コンパイルと再インストールの例
ここでは,先ほど言及した gcc が依存するソフトウェア(前提ソフトウェア)と,それに加えて 次のソフトウェアを再コンパイルし再インストールしてみる. 先ほど /etc/make.conf に,GNU コンパイラコレクション・バージョン 4.4 や 4.5 を使うように設定したことに注意.
- devel/ppl
「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
後処理
ここで、次の判断を行う
- /etc/make.conf を元に戻す.あるいは,
- バージョン 4.4 や 4.5 でビルドしたいものがあれば,上に書いた手順を参考にビルドする
→ アプリケーションソフトウェアによっては,ビルドがうまくいかない場合が出てきます. そうなると,かなり手間がかかります. 対処法は,個々違う. 下に,対処の事例を書いています.
FreeBSD のポーツ・ツリーでのビルドにおいて,gcc バージョン 4.4 や 4.5 などに起因するエラーの例
ここでは,エラーの例と対処法の例も示している. ここに示した対処法をやみくもに試してはいけません. まず,エラーの中身を確認し,それに応じた対処のみを実施すること.
ports-mgmt/psearch におけるエラーの例
◆ エラーの例
ポーツツリーの 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, graphics/dri におけるエラーの例
◆ エラーの例
ポーツツリーの 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
ポーツツリーの 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