|
From: Kouhei S. <ko...@co...> - 2013-11-02 13:32:39
|
In <CAE...@ma...> 須藤です。 "Re: [ruby-gnome2-devel-ja] Windows用gemのクロスコンパイルと動作確認について" on Fri, 1 Nov 2013 22:41:50 +0900, Masafumi Yokoyama <my...@gm...> wrote: >> noでした。。。何か足りてないでしょうか。(configureログを含めて貼り直しました↓) >> https://gist.github.com/myokoym/7235664 > > checking whether we are cross compiling... が no になっていた > 理由ですが、Windows用プログラムが実行できるかどうかで判定して > いるらしく、Wineがインストールされているせいで実行できてしま > ってnoになっているようです。とりあえず/usr/bin/wineをリネーム > して試してみると、yesになって先に進みました。 あぁ、なるほど! 手元でも試してみたら、確かに再現しました。 で、調べてみたんですが、これはGLibの問題ですねぇ。 まず、どうしてこのファイルをビルドしようとしているかを確認し ます。 エラーが起きているところ付近は次のようになっています。 make[4]: ディレクトリ `/home/kou/work/ruby/ruby-gnome2.win32/glib2/tmp/glib/glib-2.38.1/tests/gobject' に入ります i686-w64-mingw32-gcc -g -O2 -mms-bitfields -fvisibility=hidden -I/home/kou/work/ruby/rcairo.win32/vendor/local/include -I/home/kou/work/ruby/ruby-gnome2.win32/glib2/vendor/local/include -L/home/kou/work/ruby/rcairo.win32/vendor/local/lib -L/home/kou/work/ruby/ruby-gnome2.win32/glib2/vendor/local/lib ../../gobject/glib-genmarshal.c -o ../../gobject/glib-genmarshal ../../gobject/glib-genmarshal.c:20:20: fatal error: config.h: そのようなファイルやディレクトリはありません compilation terminated. tests/gobject以下でglib-genmarshalを作ろうとしていることがわ かります。ということで、tests/gobject/Makefile.amをのぞいてみ ます。 genmarshalをキーワードに探してみると以下のあたりがみつかりま す。 https://git.gnome.org/browse/glib/tree/tests/gobject/Makefile.am?id=2.38.1#n54 51 if CROSS_COMPILING 52 glib_genmarshal=$(GLIB_GENMARSHAL) 53 else 54 glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal 55 endif ... 58 @true 59 stamp-testmarshal.h: @REBUILD@ testmarshal.list $(glib_genmarshal) 今回はCROSS_COMPILINGじゃないので 54 glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal が使われているはずです。 stamp-testmarshal.hが$(glib_genmarshal)に依存しているので $(top_builddir)/gobject/glib-genmarshalがないかチェックして、 ないと判断してビルドしようとしているのでしょう。 では、本当にないのか確認してみましょう。 % ls -la gobject/ | grep genmarshal -rw-r--r-- 1 kou kou 35699 5月 8 03:26 glib-genmarshal.c -rwxr-xr-x 1 kou kou 32768 11月 2 21:19 glib-genmarshal.exe -rw-r--r-- 1 kou kou 60889 11月 2 21:19 glib-genmarshal.o たしかにありません。が、glib-genmarshal.exeがあります。 Windowsでは実行ファイルの拡張子は.exeになるのでした。しかし、 tests/gobject/Makefile.amは.exeなしのパスを探しています。な ので、実は欲しいものがあるのに無理やりビルドしようとしてエラー になっています。 ということで、glib_genmarshalのパスを正しいものに直してやれ ば動くはずです。 実は、この.exeなしのやつはWindows上でビルドしていないときは よくある問題で、これは以下のように$(EXEEXT)を使えば解決でき るパターンです。 -glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal +glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal$(EXEEXT) ^^^^^^^^^ EXEEXTはAutomakeが自動で定義してくれる(*)変数です。実行ファイ ルの拡張子が設定されていて、環境ごとに固有の値を自動で検出し ています。UNIX系のプラットフォームでは空文字列でWindowsだと 「.exe」になっています。 (*) もう少し詳しく言うとAutoconfが生成するconfigureがEXEEXTに 設定する値を検出してAutomakeがその値をEXEEXTという変数に 設定しています。 参考: http://www.gnu.org/software/automake/manual/html_node/EXEEXT.html なので、よりポータブルなMakefile.amにする場合は実行ファイル のパスの最後には$(EXEEXT)をつけるべきなのですが、実行ファイ ルに拡張子がない環境でだけビルドしているときはこれに気づかな いんですよ。 で、私達はこういうときはどうするかというと本家(アップストリー ム)に報告します。手元でパッチを当ててこのプロジェクトでだけ 回避することもできますが、そうせずに、本家に報告してあるべき ところで修正します。そうすれば、私達だけでなく、他の人たちも この問題に困ることはなくなります。少しでもそんな世界に近づく ために、私達は本家に報告します。 私達もユーザーのみなさんからバグレポートなどをもらってよりよ くしていっています。なので、私達がユーザーのプロジェクトに対 してもバグレポートを送ってそのプロジェクトをよりよくしていき ます。 ということで、GLibにバグレポートを送るわけですが、まず、これ で本当に直るか確認します。 実は、Ruby-GNOME2のビルドシステムにはクロスコンパイルすると きにパッチを当てる仕組みが入っているのでそれを使います。 そのために、まず、パッチを作ります。tmp/download/以下にtarが あるのでそれを展開します。 ruby-gnome2.win32/glib/tmp% tar xf download/glib-2.38.1.tar.xz 変更するファイルをコピーします。このとき、もとのファイル名 に.origをつけます。これは、バージョン管理システムで管理され ていないファイルに対するパッチを作るときのよくある慣習です。 ruby-gnome2.win32/glib/tmp% cp -p glib-2.38.1/tests/gobject/Makefile.am{,.orig} ファイルを変更します。 ruby-gnome2.win32/glib/tmp% editor glib-2.38.1/tests/gobject/Makefile.am ruby-gnome2.win32/glib/tmp% diff -u glib-2.38.1/tests/gobject/Makefile.am{.orig,} --- glib-2.38.1/tests/gobject/Makefile.am.orig 2013-09-23 23:02:08.000000000 +0900 +++ glib-2.38.1/tests/gobject/Makefile.am 2013-11-02 21:48:21.991908689 +0900 @@ -51,7 +51,7 @@ if CROSS_COMPILING glib_genmarshal=$(GLIB_GENMARSHAL) else - glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal + glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal$(EXEEXT) endif testmarshal.h: stamp-testmarshal.h $(EXEEXT)を追加しただけです。 diffをみて変更が意図したものか確認したらglib2/patches/以下に パッチを置きます。 ruby-gnome2.win32/glib/tmp% diff -u glib-2.38.1/tests/gobject/Makefile.am{.orig,} > ../patches/glib-2.38.1-add-missing-exeext.diff パッチの名前に制限はありませんが、内容がわかりやすいように以 下のフォーマットにしてください。ファイル名なので「簡潔な説明」 にはスペースなど普通はファイル名に使わない文字は避けてくださ い。 #{パッケージ名}-#{バージョン}-#{簡潔な説明}.diff 今回の場合は以下のようになっています。 パッケージ名: glib バージョン: 2.38.1 簡潔な説明: add-missing-exeext パッチを置いたらglib2/Rakefileを以下のように変更します。 diff --git a/glib2/Rakefile b/glib2/Rakefile index 9452f1b..960683f 100644 --- a/glib2/Rakefile +++ b/glib2/Rakefile @@ -32,6 +32,9 @@ package = GNOME2Package.new do |_package| "--disable-modular-tests", ], :need_autoreconf => true, + :patches => [ + "glib-2.38.1-add-missing-exeext.diff" + ], }, }, { external_packagesのGLib用のエントリーの中の [:windows][:patches]の中にpatches/以下のファイル名を指定して います。 { :name => "glib", :download_site => :gnome, :label => "GLib", :version => "2.38.1", :compression_method => "xz", :windows => { :configure_args => [ "LIBFFI_CFLAGS=-I#{include_dir}", "LIBFFI_LIBS=-L#{libffi_lib_dir} -lffi", "--disable-modular-tests", ], :need_autoreconf => true, :patches => [ "glib-2.38.1-add-missing-exeext.diff" ], }, } これで、パッチの登録は完了です。もう一度ビルドすると自動でパッ チを当ててビルドしてくれます。 ruby-gnome2.win32/glib% rake win32:build これで、GLibのビルドがうまく通ったらこのパッチで問題がないこ とがわかります。それでは、本家に報告しましょう。 まず、GLibのソースをcloneします。 % git clone git://git.gnome.org/glib masterでも同じ問題があるか確認します。 https://git.gnome.org/browse/glib/tree/tests/gobject/Makefile.am#n54 54 glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal $(EXEEXT)がないので同じ問題がありそうです。 本当はmasterでも同じ問題が発生するかを確認したほうがいいんで すが、明らかに問題があることがわかるので省略します。というか、 うまくビルドできないなぁとわかった時点でmasterでは直っている かも?と思って確認するほうがいいですね。もし、直っていたらそ の修正をバックポートすればいいので。 問題があることがわかったのでパッチを作ります。 glib% git checkout -b add-missing-exeext glib% editor tests/gobject/Makefile.am glib% git diff diff --git a/tests/gobject/Makefile.am b/tests/gobject/Makefile.am index 84f7410..2bce8b5 100644 --- a/tests/gobject/Makefile.am +++ b/tests/gobject/Makefile.am @@ -51,7 +51,7 @@ endif if CROSS_COMPILING glib_genmarshal=$(GLIB_GENMARSHAL) else - glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal + glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal$(EXEEXT) endif testmarshal.h: stamp-testmarshal.h glib% git add tests/gobject/Makefile.am コミットする前に過去のコミットログを確認してどんな感じでコミッ トメッセージを書くか雰囲気を確認します。 glib% git log --stat -p 「/^commit」で検索して、「n」していくと次々にコミットを見れ て便利です。ざっくり最近の数10個を確認すると 分類: 一言説明 詳細な情報 みたいになっていることがわかります。「分類」はファイル名だっ たりクラス名だったりするので、そんなに厳密なものではなさそうで す。「一言説明」もそんなに厳密ではなさそうです。現在形なら大 文字始まりでも小文字始まりでもよさそうです。小文字始まりが少 し多いかなぁというくらいです。 ということで、雰囲気がわかったのでコミットします。私ならこん な感じにします。 glib% git commit glib% git log -1 commit 3a9710f74e055813667d1d60b8a60668676da197 Author: Kouhei Sutou <ko...@cl...> Date: Sat Nov 2 22:07:19 2013 +0900 test: add missing $(EXEEXT) $(EXEEXT) is needed for executable file path. Because some platforms such as Windows require extension such as .exe for executable file path. コミットしたらパッチを作ります。 glib% git format-patch origin/master 0001-test-add-missing-EXEEXT.patch カレントディレクトリに0001-test-add-missing-EXEEXT.patchとい うファイル名でパッチができます。これをGLibに報告します。 GLibは https://bugzilla.gnome.org/ でバグレポートを受け付け ています。まず、ログインします。 バグレポートをする前にすでに同じ問題がないか確認します。とい うか、直す前にまず確認したほうがいいですね!ここに同じ問題が 報告されていてパッチもついていてそれでよさそうならそれを使え ばいいので。 まぁ、それはいいとして画面上部の検索フォームにキーワードを入 れて「Find」ボタンを推します。今回の場合は「EXEEXT」でいいで しょう。 https://bugzilla.gnome.org/buglist.cgi?quicksearch=EXEEXT 昔、私が報告したEXEEXTが足りないよバグレポートが放置されてい たりしますが、 https://bugzilla.gnome.org/show_bug.cgi?id=690879 今回はこっちが少し似ているかもですねえ。 https://bugzilla.gnome.org/show_bug.cgi?id=711047 が、これはVisual StudioでビルドするためにVisual Studio用の Makefileを追加する方向みたいなので少し違いそうです。 ということで、問題を報告します。 画面上部のメニューの「New」→「All」→「glib」とリンクをたど ります。(ページ内検索しないと見つけるのが大変でしょう。) バグレポートのフォームがでてきますね。 「Component」は「win32」で「Version」は「2.39.x」で「OS」は 難しいところですが「Linux」ですかねぇ。Linux上でクロスコンパ イルしているので。 「Summary」に一言説明を書きます。うーん、私なら 「Cross compiling on Linux with Wine for Windows with mingw64 fails to build test/gobject/.」ですかねぇ。 「Description」には以下を含めます。 * 何が問題かの説明 * 再現方法 * 期待する結果 * 実際の結果 問題を解決するために必要な情報ですね。私達も開発者なので、自 分がどんな情報をもらえば問題を解決しやすいかは考えやすいと思 います。 今回の場合は「再現方法」でクロスコンパイルしないといけないで すねぇ。。。ruby-gnome2をcloneしてとかは敷居が高いのでできれ ばコマンドラインの羅列にしたいところですが、依存ライブラリー とか用意するの面倒ですよねぇ。。。 本質的には↓だけでいいんですが、 % ./configure --host=i686-w64-mingw32 FFIとか用意しないといけないんですよねぇ。 私の過去の報告をみると再現方法書いていないですね。。。 https://bugzilla.gnome.org/show_bug.cgi?id=690879 ま、まぁ、今回は再現方法はいいかなぁ。。。 「Attachment」に0001-....patchを添付して、Descriptionにはパッ チの説明を書きます。私は「A patch that fixes the problem.」 とか書いています。 最後に「Commit」でバグレポートは完了です。 と長々書きましたが、私はいつもこんな感じでやっています! |