[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:4668] cygwin で mingw-runtime 3.2 を使ってビルドするには?
- X-ml-count: 4668
- Subject: [MD:4668] cygwin で mingw-runtime 3.2 を使ってビルドするには?
- From: "M.Fujii" <boochang@xxxxxxxxxxxx>
- Date: Fri, 17 Oct 2003 00:07:32 +0900 (JST)
- X-mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI)
藤井です。
以下のように mingw-runtime 3.2 をインストールすると cygwin でビルドで
きない問題が meadow-users-jp ML で報告されていますが、一応ビルドできる
ようになりました。
# こんな対処で良いのかどうかは不明なので、とりあえず meadow-develop の
# 方に投稿します。
From: MIYOSHI Masanori <miyoshi@xxxxxxxxxxxxxxxx>
Subject: Re: mingw-runtime 3.2-1 でコンパイルエラー(Meadow2)
Date: Thu, 16 Oct 2003 07:23:24 +0900
Message-ID: <ufzhu9m3n.wl%miyoshi@xxxxxxxxxxxxxxxx>
> >>>>> [meadow-users-jp : No.4782] にて
> >>>>> "広松" = Takashi Hiromatsu <takashi-hiromatsu@xxxxxxxxxxx> さんは書きました:
> 広松> Windows95 上の、Cygwin でコンパイルをしていますが、
> 広松> 20031004版のPatch適用
> 広松> mingw-runtime 3.2-1
> 広松> だと、emacs.cのコンパイル時に、エラーが出ます。
>
> この現状を確認しました。
>
> Mingw の stdio.h と s/ms-w32.h の #define が衝突しているようです
> ね。
>
> これは CVS Head の NTEmacs でも発生する問題です。
>
> 直すのはちょっと面倒ですので、NTEmacs で対処されるのを待ってから、
> Meadow2 に取り込みたいと思います。
これは、ad hoc な対応になりますが、以下のように fileno のマクロによる
リネームをしないようにすれば、とりあえずコンパイル *は* 出来るようにな
ります。
--- src/s/ms-w32.h.orig 2003-06-18 03:18:56.000000000 +0900
+++ src/s/ms-w32.h 2003-10-16 21:50:26.281250000 +0900
@@ -355,7 +355,12 @@
#define fcloseall _fcloseall
#define fdopen _fdopen
#define fgetchar _fgetchar
+#ifdef __MINGW32__
+#include <_mingw.h>
+#endif
+#if !defined(__MINGW32__) || !(__MINGW32_MAJOR_VERSION >= 4 || __MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 2)
#define fileno _fileno
+#endif
#define flushall _flushall
#define fputchar _fputchar
#define fsync _commit
これで、コンパイルは可能になりますが、以下のようにダンプ時に実行時エラー
が発生するので結局ビルドはできません。
bash-2.05b$ make install
(snip)
cd oo-spd/i386 && ./temacs.exe -nd -batch -l loadup dump
Loading loadup...
Using load-path (../../../lisp)
Loading byte-run...
Loading subr...
Loading version.el (source)...
Loading widget...
Loading custom...
Loading emacs-lisp/backquote...
Loading map-ynp...
Loading env...
Loading cus-start...
Note, built-in variable `x-bitmap-file-path' not bound
Note, built-in variable `x-stretch-cursor' not bound
Loading international/mule...
Loading international/mule-conf.el (source)...
Loading format...
Loading bindings...
Loading simple...
Loading files...
Lists of integers (garbage collection statistics) are normal output
while building Emacs; they do not indicate a problem.
((10265 . 4459) (3885 . 0) (496 . 3) 120540 30495 (3 . 0) (16 . 0) (6024 . 465))
Loading loaddefs.el (source)...
((21788 . 14178) (5804 . 0) (507 . 5) 172484 30495 (5 . 0) (16 . 0) (9857 . 160))
Loading help...
Loading international/mule-cmds...
Loading case-table...
Loading international/utf-8...
Loading international/utf-16...
Loading international/characters...
End of file during parsing: d:/home/fujii/work/setup/Meadow-2.00b1/lisp/internat
ional/characters.elc
Signal 127
make[1]: *** [oo-spd/i386/Meadow.exe] Error 255
make[1]: Leaving directory `/home/fujii/work/setup/Meadow-2.00b1/src'
make: *** [all-other-dirs-gmake] Error 2
このエラーの原因についても調べてみました。
これは、mingw-runtime 3.2 での変更点として getc などの関数のインライン
関数化が含まれているのですが、このインライン関数の実装にバグがあるよう
に思われます。
getc は 0 〜 UCHAR_MAX もしくは EOF を返す訳ですが、mingw-runtime 3.2
のインライン版は 0x80 以上のキャラクタをバッファから読み込むと負の数を
返すようです。
Meadow(Emacs) では read1()@lread.c において読み込んだキャラクタコード
が負の場合に EOF と判定するようにコーディングされており、mingw-runtime
3.2 のインライン版 getc などを用いた場合に 0x80 以上のキャラクタを読み
込んだ時に EOF と誤認してしまいます。
このため、上記エラーメッセージ "End of file during parsing: ..." を出
力してエラー終了します。
これを修正するには、以下の方法が考えられます。
(1) MinGW の stdio.h を編集してインライン関数版 getc/getchar を
修正する。
(2) インライン関数版 getc/getchar を使わないようにビルドする。
(1) は Meadow 側ではどうにもならないので、(2) のアプローチを考えてみま
した。
stdio.h を見ると、getc などのインライン関数版はスレッドセーフではない
ため、マルチスレッドアプリとしてビルドすると、ランタイムライブラリ版の
getc を使うように条件コンパイルできるようになっています。
ですので、gcc のコンパイルオプションに -mthreads を追加するとインライ
ン関数版を使用せず、ランタイムライブラリの関数がリンクされるようになり
ます。
ですので、gmake.meadow.defs を以下のように修正してみました。
--- nt/gmake.meadow.defs.orig 2003-10-16 07:53:44.947875000 +0900
+++ nt/gmake.meadow.defs 2003-10-16 23:50:34.651375000 +0900
@@ -267,7 +267,7 @@
endif
ifdef NOCYGWIN
-NOCYGWIN = -mno-cygwin
+NOCYGWIN = -mno-cygwin -mthreads
endif
ifeq "$(ARCH)" "i386"
これで正常にビルドできるようになります。
ここまでやるぐらいなら mingw-runtime 3.1 のままにした方が良さそうな気
もしますが、一応原因が分かったということでご報告します。
また、最適化オプションをはずすことによっても、gcc のインライン関数の展
開が抑止されるため、ランタイムライブラリの getc/getchar が使用されるよ
うになるようです。
文章が長くなりましたが、以上ご報告まで。
--
藤井 正行 / Masayuki FUJII ( boochang@xxxxxxxxxxxx )