メモ

覚書です

MinGW、MSYSと日本語関係

2009-01-24 20:36:41 | MinGW
MinGW、MSYSと日本語関係

■MSYSの表示関係
☆rxvt(sh)の場合
1.msys.batのfont指定を-fn Terminal-14とする。
2.lsのalias設定。
~/.profile($HOME/.profile)を編集して、
alias ls='ls --show-control-chars --color=auto'
を追加する。--color=autoは好みで。

※日本語入力ができないみたいなので、日本語名のファイルやフォルダの作成はできない。

☆cmd.exeの場合
1.msys.batを編集して、rxvt,shを使わないようにして、環境変数などを設定する。
set PATH=C:\msys\1.0\bin;C:\MingW\bin;%PATH%
set HOME=C:\msys\1.0\home\USERNAME
cd %HOME%
doskey ls=ls --color=auto --show-control-chars $*
cmd.exe /D
exit

4.エディタでNTEmacsを使う場合。
☆rxvt(sh)の場合
~/.profile($HOME/.profile)を編集して、
alias emacs='C:/emacs/22.2/bin/runemacs -rv'
を追加。-rvはお好みで。

☆cmd.exeの場合
doskey emacs=C:/emacs/22.2/bin/runemacs -rv

~/.emacs($HOME/.emacs)を適宜設定する。
(setq inhibit-startup-message t)

参考サイト
プログラマーになりたい!: NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その1
2007-10-04 ■[memo]msysのls.exeで日本語ファイル名を…


■gccのcharset関係
MinGWのgcc-3.4.5(mingw-vista special r3)は-finput-charset,-fexec-charsetが使えないみたい。
r2も使えなさそう。

ただr1とr2,r3は基本的に同じものらしく、Vistaで動作するように修正されているかどうかの違いみたい。

☆Vistaじゃない場合
r1を使えば、今までどおり、上のオプションが使える。
http://downloads.sourceforge.net/mingw/gcc-core-3.4.5-20060117-1.tar.gz?big_mirror=1
http://downloads.sourceforge.net/mingw/gcc-g++-3.4.5-20060117-1.tar.gz?big_mirror=1

☆Vistaの場合
環境がないので確認できませんが、↓が使えるかも知れません。
http://downloads.sourceforge.net/mingw/gcc-core-3.4.5-20060117-1-vista.tar.gz?big_mirror=1
http://downloads.sourceforge.net/mingw/gcc-g++-3.4.5-20060117-1-vista.tar.gz?big_mirror=1

あとはcc1.exe、cc1plus.exeを自力でコンパイルするといけるかも知れません。
iconv-1.12のDLLをmingwPORTで作成して、そのDLLを利用する形でコンパイルして、XPで動作することは一応確認しました。

☆自力コンパイルする場合
gcc-3.4.5-v3-release_notes.txtを参考にソースをダウンロード。
全言語をコンパイルしようとしたけど、エラーに遭遇して結局対処できなかったので、coreとg++だけにしました。

http://downloads.sourceforge.net/mingw/gcc-core-3.4.5-20060117-2-src.tar.gz?big_mirror=1
http://downloads.sourceforge.net/mingw/gcc-g++-3.4.5-20060117-2-src.tar.gz?big_mirror=1


gcc-build-3.4.5-20060117-3.tar.gzを入手して修正する。

export PATH=/mingw/bin:$PATH
export GCC_EXEC_PREFIX=/mingw/lib/gcc/

LDFLAGS="-liconv.dll" ../gcc-3.4.5-20060117-2/configure --with-gcc --with-gnu-ld --with-gnu-as \
--host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads \
--disable-nls --enable-languages=c,c++ \
--disable-win32-registry --disable-shared --enable-sjlj-exceptions \
--enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm \
--disable-libgcj-debug --enable-interpreter --enable-hash-synchronization \
--enable-libstdcxx-debug --with-libiconv-prefix=/mingw/

make CFLAGS="-O2 -fomit-frame-pointer -D__USE_MINGW_ACCESS" \
BOOT_CFLAGS="-O2 -fomit-frame-pointer -D__USE_MINGW_ACCESS" \
CFLAGS_FOR_TARGET="-O2 -fomit-frame-pointer -D__USE_MINGW_ACCESS" \
BOOT_CXXFLAGS="-mthreads -fno-omit-frame-pointer -O2" \
BOOT_LDFLAGS=-s \
bootstrap

make -C gcc CFLAGS=-O2 LDFLAGS=-s gnatlib_and_tools #エラーがでる。

make CFLAGS="-O2 -fomit-frame-pointer -D__USE_MINGW_ACCESS" \
BOOT_CFLAGS="-O2 -fomit-frame-pointer -D__USE_MINGW_ACCESS" \
CFLAGS_FOR_TARGET="-O2 -fomit-frame-pointer -D__USE_MINGW_ACCESS" \
BOOT_CXXFLAGS="-mthreads -fno-omit-frame-pointer -O2" \
BOOT_LDFLAGS=-s \
quickstrap


gcc以下に複数のcc1.exe、cc1plus.exeができているけど、多分gcc以下かstage2以下でよいんじゃないかな。自信なし。
cc1.exe、cc1plus.exeを/mingw/libexec/gcc/mingw32/3.4.5/にあるものと置き換える。
libiconv-2.dllを/mingw/binなどパスの通っている場所において置く。

☆その他のバージョンのgccを使う場合。
公式サイトのαリリースのgcc-4.3.0-20080502-mingw32-alphaは残念ながら対応していないみたい。
GccWinBinaries - Develer Open Source Projectsのgcc-4.1.2も対応していないみたい。
TDM's GCC/mingw32 Buildsの4.2.4、4.3.2は対応しているみたい。
ただ一部3.4.5、4.1.2で問題がなかったソースが、他のバージョンだと異常終了するコードをはくケースがあるみたい。
(Linuxのgcc-4.3.2だとエラーがでないソース。またLinuxでのMinGWを使ったクロスコンパイルでも問題ありませんでした。gcc version 4.2.1-sjlj (mingw32-2))
どうもグローバル変数で__m128iを使うと、異常終了する。
ためしにg++でコンパイルしてみたら、動いてしまった。
公式でリリースされていないのは、いろいろと問題があるからなのかなぁ。

追記:
__m128iの問題はbinutilsの問題のようです。
Current ReleaseのGNU ld (GNU Binutils) 2.19で発生します。
2.18.50.20080109もダメでした。

GNU ld version 2.17.50 20060824だと問題ないようです。
追記2:
__m128iの問題はbinutilsやgccの問題というよりは、PE COFF formatの問題らしい。
globalに宣言して、初期化されていない場合、この問題が発生するようです。
現時点のとりあえずの対処方法。
1.コンパイルオプションに-fno-commonを加える。
2.初期化する。__m128i dummy = { 0, 0 };
多分、どちらかで回避できると思います。
追記3
staticで宣言している場合も、同じ問題があるようです。
.commだけでなく、.lcommのalignの扱いについてもテスト用のパッチがあがってるみたい。
そのうち解決されるでしょうけど、回避策が、、、。
gcc 3.4.5なら初期化すれば、動いてくれるようです。
tdmがリリースしている4.1-4.3や公式のαリリースの4.3では回避策が見つかりませんでした。
gcc -S -msse2 test.cとでもして、test.sを手動で書き換える以外は^^;

あと関連してSSE2を使う場合。
gcc-3.4.5は異常終了する場合がある。(アラインメントの関係?)
遭遇したのはSSE2を使ったコードで作成したDLLのケースでした。
他バイナリから呼び出す場合、MinGWでコンパイルしたバイナリからだと異常終了しないけれど、MSVC++ 2008でコンパイルしたバイナリから呼び出すと異常終了したりする。インラインアセンブラを使って回避はできるみたい。
gcc-4.1.2、4.2.4、4.3.0、4.3.2ではこの点は大丈夫そう。