2013年03月20日

GCC 4.8のビルド、いつやるか?今でしょ!

GCC 4.8のRC版、gcc-4.8.0-RC-20130316がリリースされたので、MinGWでビルドしてみました。

ビルドするのに必要な環境などは、GCC 4.7の記事を参考にしてください。
GCC 4.7のビルド

mingwrtとw32apiの代わりに、mingw-w64をインストールします。
mingw-w64-v1.0.6
mingw-w64も自前でビルドしたい方は、こちらを参考にしてください。
MinGW-w64のビルド

以下のライブラリを、GCC 4.7でコンパイルしてインストールします。
winpthreads
zlib-1.2.7
libiconv-1.14
gmp-5.1.1
mpfr-3.1.2
mpc-1.0.1
isl-0.11.1
cloog-0.18.0

GCC 4.7のビルドに必要だったPPLは、GCC 4.8では不要になりました。


GCC 4.8のソースコードは、このページから適当なサーバを選んでダウンロードしてください。
http://gcc.gnu.org/mirrors.html

この辺りから、
http://ftp.tsukuba.wide.ad.jp/software/gcc/snapshots/4.8.0-RC-20130316/
gcc-4.8.0-RC-20130316.tar.bz2
を、ダウンロードします。

そのままビルドすると、libstdc++-v3の所で、こんなエラーが出ます。
../../../../../gcc-4.8.0-RC-20130316/libstdc++-v3/src/c++11/thread.cc:67:4: error: #error "No sleep function known for this target"
# error "No sleep function known for this target"

libstdc++-v3/configureで、sleep関数とusleep関数をチェックして見つからない場合、次にWindowsのSleep関数が見つかれば、thread.ccでそちらを使う仕組みになっているのですが、誤記のせいで、WindowsのSleep関数のチェック自体がスルーされていました。

libstdc++-v3/configure の19903行目
if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
「x"nono"」を「x"no"」に修正します。

その他、libiberty/make-temp-file.c に、「GCC 4.5辺りからずっと適用していて、いまだに必要なのかよくわからないパッチ」を、念のため適用します。
make-temp-file.diff

$ tar xjf gcc-4.8.0-RC-20130316.tar.bz2
$ cd gcc-4.8.0-RC-20130316
$ patch -p1 < ../make-temp-file.diff
$ sed -i.orig 's/nono/no/g' libstdc++-v3/configure

GCCのソースコードと同じ階層にbuildディレクトリを作成して、configureを実行します。

$ cd ..
$ mkdir build
$ cd build
$ ../gcc-4.8.0-RC-20130316/configure --prefix=/mingw --build=mingw32 --with-arch=i686 --with-tune=generic --enable-threads=posix --enable-languages=c,c++,objc,obj-c++ --enable-libgomp --disable-sjlj-exceptions --with-dwarf2 --enable-version-specific-runtime-libs --disable-win32-registry --disable-werror --disable-nls --enable-lto --with-system-zlib --enable-libstdcxx-debug --enable-cxx-flags='-fno-function-sections -fno-data-sections' --enable-fully-dynamic-string --disable-libstdcxx-pch --disable-bootstrap

「--enable-lto」はデフォルトでenableになっているので、必要ないかもしれません。
ここまで、追加ライブラリーなどのエラーがなければ、makeします。

$ make -j3 CFLAGS="-O2 -D__USE_MINGW_ACCESS" CFLAGS_FOR_TARGET="-O2 -D__USE_MINGW_ACCESS" CXXFLAGS="-mthreads -O2" CXXFLAGS_FOR_TARGET="-mthreads -O2" LDFLAGS="-s" 2>err.log 1>out.log

「-j3」の数値は、PC環境に合わせて、適当に増やしたり減らしたりしてください。
logを見て、エラーで止まっていなければOKです。

いきなりMinGW環境に上書きして失敗すると取り返しがつかないので、こんな感じで仮インストールします。
仮インストール先のディレクトリは、TDM-GCCのビルドスクリプトを参考にしています。

$ make DESTDIR=/develop/sandpit/dw2 install

エラーで止まらなければ完成です。
あとは、以下のようにMinGW環境に丸ごとコピーします。

$ cp -pr /develop/sandpit/dw2/mingw /c/.

これで、GCC 4.8が使えるようになります。


試しに、自前ビルドしたGCC 4.8でx264を「make fprofiled」してみたら、x264.exeがクラッシュしてしまいました(笑)

ffmpegとlibvpxは、エラーもなくmakeできて、VP8動画のエンコードもできました。

いち早くGCC 4.8を使ってみたいという方は、参考にしてください。


2013/03/24 追記
RC版が出てすぐ、3/22にGCC 4.8.0がリリースされました。
http://gcc.gnu.org/gcc-4.8/

ソースコードは、この辺りからダウンロードしてください。
http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.0/
gcc-4.8.0.tar.bz2

ビルドの手順は、「gcc-4.8.0-RC-20130316」が「gcc-4.8.0」になるだけで、RC版と変わりません。

x264は、configureオプションに「--enable-debug」を追加して、
$ ./configure --enable-win32thread --prefix=/mingw --enable-debug
としてみたら、「make fprofiled」できました。

その他、当サイトで紹介しているライブラリなど、自前ビルドしたGCC 4.8.0で全部makeし直してみましたが、特に問題なさそうです。


2013/03/27 追記
問題なさそうと思ったら、いろいろ問題がありました。

x264のconfigureオプションについては、「--extra-cflags="-fno-aggressive-loop-optimizations"」を追加して、
$ ./configure --enable-win32thread --prefix=/mingw --extra-cflags="-fno-aggressive-loop-optimizations"
としたら、「make fprofiled」できました。

「-fno-aggressive-loop-optimizations」は、GCC 4.8.0で追加されたオプションです。
http://gcc.gnu.org/gcc-4.8/changes.html

GCC 4.8.0でビルドしたffmpegは、wmv9のデコードに問題があるようで、wmv9の動画を入力にするとクラッシュします。

他にも問題が出てくるかもしれませんので、しばらくは様子見です。


2013/04/26 追記
x264がクラッシュする問題は、r2276で修正されました。

Fix array overreads that caused miscompilation in gcc 4.8
http://git.videolan.org/gitweb.cgi?p=x264.git;a=commitdiff;h=89aecb440e2939be7fb72d8362eb12504711b94f

その他、ffmpegのwmv9のデコードに問題があると思ったら、avisynthと相性が悪いようです。
携帯動画変換君で、avisynthを経由してwmvファイルを読み込む時に、avisynthがエラーになっていました。
avisynth「AVS 2.6.0 Alpha 4」をインストールすれば、エラーになりませんでした。

または、携帯動画変換君でavisynthを使わないように、
C:\Program Files\3GP_Converter\
にある、3GP_Converter.ini の、
DisableAVS=0

DisableAVS=1
に修正すればOKです。
posted by あべちん at 19:23 | Comment(4) | TrackBack(0) | GCC自前ビルド
この記事へのコメント
自ビルドしたGCC 4.8.0でx264の「make fprofiled」を行おうとして同じようにエラーに悩まされました。。
情報をもとに試してみた所、「--enable-debug」でうまくいくのは最適化オプションの -O1 が使用される為の様です。

x264はデフォルト(debug: no)だと -O3 でビルドされるのですがコレにエラー要因が含んでまれている様で、試しに CFLAGS に -O1、-O2、-O3、-Os、-Ofast をそれぞれ指定してみると -O2 以上でエラーが発生します。
(後、4.8.0で追加された -Og は -O1 と同じようにエラーが発生しない事を確認)

最適化オプションの差異を詳細に調査すればどのオプションがエラー要因となっているのかも判別できそうですが、とりあえずここまでの情報をコメントに書かせていただきます。
Posted by maki at 2013年03月25日 21:01
makiさん、こんにちは。管理人です。

情報ありがとうございます。
上手く行ったのは -g オプションのためかと思っていたのですが、 -O1 でコンパイルされていたからだとは気が付きませんでした。

http://gcc.gnu.org/gcc-4.8/changes.html
このページを見たら、
-fno-aggressive-loop-optimizations
というコンパイルオプションが書いてあったので、x264のconfigureオプションに
--extra-cflags="-fno-aggressive-loop-optimizations"
を付けて「make fprofiled」したら、-O3 でも最後までmakeできました。

makiさんの情報がヒントになり、解決できました。
ありがとうございました。
Posted by あべちん at 2013年03月27日 04:04
コンパイルオプションの確認情報、ありがとうございます。

「開発版だとどうなる?」と考えx264-develで fprofiled を試した所、クラッシュせずに動作したのでコミット内容を確認してみたら、とっくに修正が入ってました。。
https://github.com/DarkShikari/x264-devel/commit/e0625fe8f43c90eb2c91ee5164d60a0b2a97cbd9

せっかくの新機能をOFFにするのももったいないので、4.8 でビルドしたい場合は
・r2274 にx264-develの修正を取り入れてビルド
・大人しく次のx264リリースを待つ
も推奨しておきます。
Posted by maki at 2013年03月28日 00:29
makiさん

開発版ではすでに修正されているんですね。

-fno-tree-vectorize を付けているのと同じように、コンパイルオプションでエラーが出なくなったので、とりあえずいいやと思ってました。

たしかに、オプションでエラーを回避するよりは、コードを修正する方が良いですね。

x264の正式版に、修正が反映されるのを待ちます。
Posted by あべちん at 2013年03月28日 22:54
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/63901089
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック