金子邦彦研究室インストールFreeBSDFreeBSD で GNU コンパイラコレクション・バージョン 4.4 / 4.5 のインストールと設定`

FreeBSD で GNU コンパイラコレクション・バージョン 4.4 / 4.5 のインストールと設定

◆ この Web ページで行うこと

FreeBSD のシステム(本体)は gcc 4.2.1 ベースです.gcc のバージョンアップの予定は無いらしいです. なので, make buildworld, make buildkernel にはバージョン 4.4 や 4.5 を使わずに,システムに付属のものを使うこと.

※ 参考ファイル: hoge4.sh

前準備

システムの更新

「FreeBSD システムの更新,ポーツコレクションの維持更新」 のページを参考に,次のことを行っておく.

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 が依存するソフトウェア(前提ソフトウェア)自動的にインストールされる(はず.)

■ 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

[image]

[image]

[image]

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の場合

[image]

バージョン 4.4の場合

[image]

◆ (参考)ls /usr/local/bin/*45*

[image]

[image]
ls /usr/local/lib/gcc45

[image]

(オプション)ポーツ・ツリーでのビルドに 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 を使うように設定したことに注意.

「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

後処理

ここで、次の判断を行う

FreeBSD のポーツ・ツリーでのビルドにおいて,gcc バージョン 4.4 や 4.5 などに起因するエラーの例

ここでは,エラーの例と対処法の例も示している. ここに示した対処法をやみくもに試してはいけません. まず,エラーの中身を確認し,それに応じた対処のみを実施すること.

ports-mgmt/psearch におけるエラーの例

◆ エラーの例

ポーツツリーの ports-mgmt/psearch でのビルド.

portupgrade -Nprv -B 'make rmconfig' ports-mgmt/psearch

[image]

すると,次のように 「psearch.cpp:209:41: error: 'strncmp' was not declared in this scope」というエラーメッセージが出る ことがある.

(原因)これは g++ 4.3 以上が gcc++ 4.2 と互換性がないことに起因する(と思われる)

[image]
[image]

◆ 対処法の例

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

[image]

graphics/libGL, graphics/libGLU, graphics/dri におけるエラーの例

◆ エラーの例

ポーツツリーの graphics/libGL, graphics/libGLU でのビルド.

portupgrade -Nprv -B 'make rmconfig' graphics/libGL

[image]

すると,次のように 「..._x86-64.o: relocation R_X86_64_PC32 against symbol '_gl_DispatchTSD' can not be used when making a shred object: remompile with -fPIC」というエラーメッセージが出ることがある.

[image]

◆ 対処法の例

/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

[image]

graphics/gd

ポーツツリーの graphics/gd でのビルド.

portupgrade -Nprv 'make rmconfig' graphics/gd

[image]

◆ エラーの例

ポーツツリーの graphics/gd で, 「undefined reference to 'FcPatternDestroy

(原因)fontconfig 等のライブラリが 4.5 よりも古いコンパイラでコンパイルされていた(と思われる)

[image]

◆ 対処法の例

1つの方法は,下のように graphics/gd でライブラリを使わないように設定しなおすこと

※ 他の方法としては,ライブラリを再コンパイル

cd /usr/ports/graphics/gd
make config

その後,次のように設定(全てのチェックを外す)

[image]

portupgrade -Nprv graphics/gd