試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

画像ビューアGImageViewの開発のその後(2014年10月時点)とlibmngのテストプログラムの問題について

  1. 開発版ソースの新しいリポジトリについて
  2. リポジトリ移行後の修正点
  3. libmngの検出に失敗する件とその対処

開発版ソースの新しいリポジトリについて

これまでSubversionを用いて管理されていたソースはその後
github.com/ashie/gimageview
で管理されており
sourceforge.net/p/gtkmmviewer/code/HEAD/tree/
の最終リビジョンであるr1215(2010年11月)より後の変更はここで適用されている。

リポジトリ移行後の修正点

PPAリポジトリ「ppa:kakurasan/unstable」で公開しているUbuntu向けの自作パッケージ(これまでの公開バージョンはr1215)で

  • 内部アイコンファイルのインストールに関する記述の重複対策
  • Ubuntu 13.04のときに発生したリンクエラー対策

として独自に作成して入れていたパッチと同様の修正がともに2014年9月に入っている。r1215から後にはこれ以外の修正点はない。

libmngの検出に失敗する件とその対処

MNG形式のアニメーション画像を扱える(GImageView内で表示できる)ようにするライブラリlibmngが(開発パッケージ含め)システムにインストールされていても検出に失敗することが分かった。

(configureスクリプトの出力)
$ ./configure

...

checking libmng.h usability... yes
checking libmng.h presence... yes
checking for libmng.h... yes
checking for mng_initialize in -lmng... yes
checking for libmng functions... configure: WARNING: *** MNG library (libmng) is
 found but it is too old ***
no

...

Configure Result :

   C Compiler    : gcc

   ...

   MNG  (libmng) : no

...

(libmngのバージョンを確認)
$ pkg-config --modversion libmng
2.0.2

[引用]ファイル名: config.log より

configure:16737: checking for libmng functions
configure:16766: gcc -c -g -O2  conftest.c >&5
In file included from /usr/include/libmng_types.h:203:0,
                 from /usr/include/libmng.h:386,
                 from conftest.c:26:
/usr/include/jpeglib.h:1000:30: error: unknown type name 'FILE'
 EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
                              ^
/usr/include/jpeglib.h:1001:29: error: unknown type name 'FILE'
 EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
                             ^
configure:16766: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "gimageview"
| #define PACKAGE_TARNAME "gimageview"
| #define PACKAGE_VERSION "0.3.0"
| #define PACKAGE_STRING "gimageview 0.3.0"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| #define PACKAGE "gimageview"
| #define VERSION "0.3.0"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| #define HAVE_PROGRESSIVE_JPEG 1
| #define ENABLE_JPEG 1
| #define ENABLE_EXIF 1
| /* end confdefs.h.  */
|  #include <libmng.h>
| int
| main ()
| {
|  mng_handle handle;
|                  mng_version_text();
|                  handle = mng_initialize(NULL, NULL, NULL, MNG_NULL);
|                  mng_setcb_errorproc(handle, NULL);
|                  mng_setcb_openstream(handle, NULL);
|                  mng_setcb_closestream(handle, NULL);
|                  mng_setcb_readdata(handle, NULL);
|                  mng_setcb_gettickcount(handle, NULL);
|                  mng_setcb_settimer(handle, NULL);
|                  mng_setcb_processheader(handle, NULL);
|                  mng_setcb_getcanvasline(handle, NULL);
|                  mng_setcb_refresh(handle, NULL);
|                  mng_get_userdata(handle);
|                  mng_set_canvasstyle(handle, MNG_CANVAS_RGB8);
|                  mng_set_bgcolor(handle, 0, 0, 0);
|                  mng_readdisplay(handle);
|                  mng_readdisplay_resume(handle);
|   ;
|   return 0;
| }
configure:16773: WARNING: *** MNG library (libmng) is found but it is too old ***
configure:16777: result: no

FILE型は標準Cライブラリを用いたファイル入出力で用いられるが、これを用いるにはヘッダファイルstdio.hを取り込めばよいため、同ファイルが先に取り込まれるようにすればよい。
実際としてはconfigure.ac

AC_TRY_COMPILE([ #include <libmng.h> ],

の行を

AC_TRY_COMPILE([ #include <stdio.h>
                 #include <libmng.h> ],

とすることで

$ ./configure

...

checking libmng.h usability... yes
checking libmng.h presence... yes
checking for libmng.h... yes
checking for mng_initialize in -lmng... yes
checking for libmng functions... yes

...

Configure Result :

   C Compiler    : gcc

   ...

   MNG  (libmng) : yes

...

無事に検出され、ビルドした実行ファイルを用いて正常にMNGファイルが開けることも確認できた。
ただ、この件についてはメッセージの内容からも分かる通り、原因はlibmngもしくはlibjpegのヘッダファイルの側にあり
bugs.launchpad.net/ubuntu/+source/libmng/+bug/1342459
の件とも同じものと思われるため、GImageView側を修正するのが適切なのかどうかは分からない。ただ、configure.acを見るとlibjpegの(ヘッダファイルの)検出ではテストプログラムに「#include <stdio.h>」が入っているので、libmngのテストプログラムに入れても問題はないような気もする。

使用したバージョン:

  • GImageView 2014/9/5版