いけむランド

はてダからやってきました

road to e17 (3)

Evas に限った話ではなく、実行時に動的にライブラリをロードするような仕組みを持っているものを cygwin に移植する場合には気をつけないといけないことがある。


Evas はさまざまなフォーマットの画像ファイルをサポートしているが、それらは別モジュールとして、提供されている。そして、Evas が処理するフォーマットに応じて、それを動的にロードする仕組みとなっているため、ローダとなる部分を修正しておく必要がある。そうしておかないと cygwin の共有ライブラリの拡張子は dll であるが、linux などでは so であるため、ローダが所定のディレクトリの module.so を探そうとして、こけてしまうことになる。*1
Evas では具体的にはローダが module.dll を探せるような修正を加えておく必要がある。これはコンパイル時にはわからないため、気をつけておかなければならない。ソースは幸いなことに先の Windows 対応で既にある程度は修正されているため、それに便乗すれば良い。

--- origsrc/evas-0.9.9.042/src/lib/file/evas_module.c   2007-10-17 18:29:18.000000000 +0900
+++ src/evas-0.9.9.042/src/lib/file/evas_module.c       2008-02-10 23:41:39.812500000 +0900
@@ -317,7 +317,7 @@
    if (em->loaded) return 1;
 
 /*   printf("LOAD %s\n", em->name); */
-#ifdef _WIN32
+#if defined(_WIN32) || defined(__CYGWIN__)
    snprintf(buf, sizeof(buf), "%s/%s/%s/module.dll", em->path, em->name, MODULE_ARCH);
 #else
    snprintf(buf, sizeof(buf), "%s/%s/%s/module.so", em->path, em->name, MODULE_ARCH);

Evas は多様なフォーマットに対応しているが、cygwin を標準インストールしただけでは、configure において、そのほとんどが認識されない。SVG とか cairo とかも欲しいという人は Cygwin Ports から、それらをインストール後にビルドすると良いだろう。

*1:libtool を使用せずに拡張子が so となるように Makefile で決めうちしているものは別。