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

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

Ubuntu 14.10における幾つかの個人的なメモ(主にGTK+とWayland関係)

  1. 一部のGTK+ 3アプリケーションのウィンドウ装飾について
    1. 装飾部分の角の丸みとウィンドウの影について
  2. GNOME 3に含まれるパッケージのバージョンについて
  3. WestonとXWayland
  4. Google Chromeとlibudev0
  5. Sylpheedで使える迷惑メールフィルタbsfilter関係のメモ
  6. Mesaのバージョン
  7. gkrellm-cpufreqとPPAのパッケージについて

一部のGTK+ 3アプリケーションのウィンドウ装飾について

幾つかのGTK+ 3アプリケーションでは、ウィンドウの装飾がこれまでとは異なり、ウィンドウの一部として存在する形(クライアント側の装飾)となる。*1

画像はGTK+ 3.12のgtk3-widget-factory(パッケージ「gtk-3-examples」に含まれる)。使用テーマは「Adwaita」。
左上の丸はメニューのボタンで右上の「X」(閉じるボタン)の左が設定ボタンとなるが、このあたりの外観についてはGTK+ 3のテーマによって異なる。ウィンドウマネージャの装飾はなく、X11上ではウィンドウマネージャのテーマを変更しても外観は変わらない。
最近のGNOME 3アプリケーションではボタンなどが並ぶバー(「ヘッダバー」と呼ばれ、GTK+ 3.10からGtkHeaderBarクラスとして利用可能)の中に、メニューを出すボタンやウィンドウタイトル,「閉じる」のボタンがまとめて配置される形となっており、省スペースとなっている(メインの表示内容に場所が広く使えるようになっている)。ダブルクリックによるウィンドウの最大化/最大化解除の他、サイズ変更は従来のアプリケーションと同様に行える。最小化はヘッダバー部分のコンテキストメニューから行う。

装飾部分の角の丸みとウィンドウの影について
コンポジット対応の環境(X11ではCompiz,KWin,xfwm4などの対応ウィンドウマネージャ使用時・Waylandでは標準で対応)が利用可能な場合に該当プログラムを起動すると、上の画像のようにウィンドウ装飾部分の角が丸みをおびた形になるとともに、ウィンドウの影も描画される。このプログラムが動作している状態でコンポジット機能が動作していない状態に切り替える(例:CompizからOpenboxに切り替える)と外側に黒い領域が出てしまうが、コンポジット非対応環境で起動し直すことで、角の丸みや影はないものの、問題が出ない形で(コンポジット非対応環境向けに)描画される。

画像はGTK+ 3.12向けのバージョンの「Zukitwo」。
なお、1枚目の画像はCompizが動作している状態でキャプチャしたもので、ウィンドウの後ろに白一色のウィンドウをGIMPで作成して表示しているが、X11上のコンポジット対応環境で該当プログラムを起動してそのウィンドウのキャプチャを行うと、影の部分で周り(背面)のウィンドウや壁紙の内容が入ってしまう。これが嫌な場合はコンポジット非対応ウィンドウマネージャに切り替えた後で起動して上の画像のような形にキャプチャするのが良さそう。
また、ドキュメントビューアDevhelpをCompiz環境でネガ反転して閲覧したい場合にも、周りに白い枠が出てしまうのを防ぐのに役立つ。この場合のウィンドウのサイズ変更は装飾部分のコンテキストメニューから「サイズの変更」を選択後行える。

GNOME 3に含まれるパッケージのバージョンについて

2014年11月時点のGNOME 3の最新バージョンは3.14系だが、UbuntuではUnityなど色々な事情により3.12系や3.10系のプログラムが含まれている(GTK+も3.12系で、gnome-look.orgで配布されているテーマの新しいものは3.14系向けのため、GTK+ 3.12系では表示が崩れる)。

  • ppa:gnome3-team/gnome3-staging
  • ppa:gnome3-team/gnome3

のPPAリポジトリを用いてバージョン3.14を入れることはできる(戻すにはppa-purgeを用いる)ようだが、幾つかの問題点もあり、全ての人におすすめできるものではない。

WestonとXWayland

WaylandのディスプレイサーバWeston(パッケージ名「weston」)がインストールされた状態でCtrl-Alt-F[数字]を押すかchvt(sudoで使用)で端末画面に移ってテキストログインした後でweston-launch*2を実行すると生(DRMバックエンド)のWestonの環境に入れる*3が、WaylandのX11互換(X11向けのGUIプログラムを動かす)機能はこれまでWeston側のモジュール部分のみが提供されており、このモジュールから呼び出されるXサーバである「XWayland」はxorg-serverのバージョン1.16以上からの対応となっているため、X11向けのプログラムは公式のバージョンのパッケージとしてのxorg-serverでは実際には動作していなかった。
Ubuntu 14.10ではバージョン1.16系が入っているためにこの機能が利用でき、X11向けのプログラムが動作する。ただしパッケージ「xwayland」をインストールする必要があり、また、XWaylandを用いるためのモジュールを有効にするために

(テキストログイン後に実行)
$ weston-launch -- --modules=xwayland.so

として起動するか、もしくはWeston用の設定ファイルを編集する。
[一部]ファイル名: ${XDG_CONFIG_HOME}/weston.ini もしくは [ホームディレクトリ]/.config/weston.ini など

# XWaylandにはxwayland.soが必要
[core]
modules=xwayland.so,desktop-shell.so

# 日本語キーボードのレイアウト
[keyboard]
keymap_layout=jp

# 端末で使用したいフォントを指定
[terminal]
font=[端末に使用したいフォント名]
font-size=[フォントサイズの値]

Weston+XWayland上のX11アプリケーションにおける日本語入力については

  • GTK+ 2アプリケーションでuimのimmoduleを選択した状態での動作
  • X11バックエンド使用時のGTK+ 3アプリケーションでuimのimmoduleを選択した状態での動作(不安定?)
  • uim-ximを起動後のXIMによるEmacs上の動作

を確認し、JISかな入力での「ろ」と「ー」の区別もできている。
なお、GPUを用いた3Dゲームなどの用途ではXサーバを直接使用した場合よりも動作が遅くGPUの性能がプログラムを快適に動かすのに十分なレベルの場合を除いて現状ではX11環境でコンポジット無効のウィンドウマネージャを用いて動かすのが好ましい(WaylandはCompiz同様にGPU資源をある程度使ってしまう)。また、XWayland自体もまだ動作が安定していない印象があり、GIMPのツールオプションウィンドウと相性が悪い(Westonごと落ちる!!)などの問題点もある。

Google Chromeとlibudev0

過去にもlibudev.so.0が無くて起動しない問題があったが、Google Chromeの動作に限ってはシステムのlibudev.so.1(の実体)をlibudev.so.0という名前でそのまま使っても問題はないようだ。
下は該当するシンボリックリンクを作成する作業例。

(64bit/amd64版)
gksudo -- ln -s /lib/x86_64-linux-gnu/libudev.so.1.4.0 /lib/x86_64-linux-gnu/libudev.so.0

(32bit/i386版)
gksudo -- ln -s /lib/i386-linux-gnu/libudev.so.1.4.0 /lib/i386-linux-gnu/libudev.so.0

なお、Google Chromeのもとになっている自由なソフトウェアChromiumのパッケージではlibudev1のほうが(直接)使われている。

Sylpheedで使える迷惑メールフィルタbsfilter関係のメモ

メールクライアントSylpheedで迷惑メールフィルタとして使えるbsfilterを以前パッケージとしてではなく本家から入手して配置していたのだが、14.10にしたタイミングでまた動かなくなっていた*4
2014年11月時点の最新バージョンは1.0.19となっており、配布ファイルbsfilter-1.0.19.tgz内のbsfilter/bsfilterで古いファイルを置き換えたところ正常に動くようにはなったが、このbsfilterはかなり前からDebian/Ubuntuでは同名のパッケージが用意されていたことが今更になって分かったので、今後Ubuntuを使っている限りは手動での入手・配置は今後はやめてディストリのパッケージを使うことにした(今回もパッケージとして入れていればバージョン1.0.19が入ったので問題にはならなかった)。

Mesaのバージョン

Mesaライブラリのバージョンは10.1から10.3に上がっている。

(Radeon HD 4200での情報取得例)
$ glxinfo | grep OpenGL | grep -v extensions:
OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD RS880
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.3.0
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL version string: 3.0 Mesa 10.3.0
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 10.3.0
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.0

gkrellm-cpufreqとPPAのパッケージについて

今更ではあるが、GKrellMでcpufreqの情報をリアルタイムに表示するプラグイン「gkrellm-cpufreq」がUbuntu 13.10から標準でパッケージになっていることに気付いた。にも関わらず14.10までPPAリポジトリへアップロードしていたため、13.10からの分は削除した。

関連URL:

使用したバージョン:

  • GTK+ 3.12.2
  • Devhelp 3.12.1
  • Linux 3.16
  • Mesa 10.3
  • Weston 1.5.0
  • xorg-server 1.16.0
  • uim 1.8.6
  • GIMP 2.8.10

*1:これまで、Wayland環境でGTK+ 3アプリケーションを動かすと、ウィンドウに装飾がなく扱いにくかった

*2:「-launch」に注意

*3:X11環境に戻るにはCtrl-Alt-F7を押すか「sudo chvt 7」を端末アプリケーションで実行する

*4:以前にもRubyのバージョンによって動かなくなったことがあった

画像ビューアGImageViewにおけるxine-lib 1.2対応について(2014年10月時点)

先日PPAリポジトリ「ppa:kakurasan/unstable」のUbuntu 14.10向けのパッケージを単純に再ビルドするという形でアップロードした際、パッケージビルドの段階でエラーが発生したことによって判明したことだが、画像ビューアGImageViewで動画再生機能を利用するためのxine-libというライブラリのバージョン1.1(Debian/Ubuntuの「libxine1」)系のディストリのパッケージの提供が(Ubuntu 14.04までで)終了してしまい、依存関係が満たせなくなった。
一方で新しいxine-libのバージョン1.2(Debian/Ubuntuの「libxine2」)系はUbuntu 14.10でも利用可能となっており、こちらを利用してみることにしたのだが、そのままではうまくビルドできないことが分かった。

  1. configureスクリプトにおける検出について
  2. 最初のエラーメッセージ
  3. xine_vo_driver_t/xine_ao_driver_t型関係の対処
  4. 「undefined symbol: _」の対処(xine-lib 1.1系でも発生)
  5. 「undefined symbol: xine_gui_send_vo_data」の対処

configureスクリプトにおける検出について

$ ./configure --with-xine --prefix=[インストール先]

...

checking for XINE-LIB version >= 1.0.0... xine-config is DEPRECATED. Use pkg-con
fig instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
xine-config is DEPRECATED. Use pkg-config instead.
yes

...

Configure Result :

   C Compiler    : gcc

   ...

   Movie Support : Xine

...

xine-configは非推奨」というメッセージが出るが、configure.ac

AM_PATH_XINE($XINE_REQUIRED,

の行を

PKG_CHECK_MODULES(XINE, libxine >= $XINE_REQUIRED,

としてpkg-configを用いた検出に置き換えることで対処すればよいとして、そのままでも一応正しく検出はされる。

最初のエラーメッセージ

下のようなメッセージ(「error:」の行がエラーメッセージ)でビルドに失敗した。

$ LC_MESSAGES=C make

...

Making all in image_view
make[3]: Entering directory `/tmp/work/gimageview-master/plugins/image_view'
/bin/bash ../../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I../.. -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/harfbuzz    -I../.. -I../../src  -DDATADIR=\""/usr/local/share/gimageview"\"  -g -O2 -Wall -MT gimv_xine.lo -MD -MP -MF .deps/gimv_xine.Tpo -c -o gimv_xine.lo gimv_xine.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I../.. -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I../.. -I../../src -DDATADIR=\"/usr/local/share/gimageview\" -g -O2 -Wall -MT gimv_xine.lo -MD -MP -MF .deps/gimv_xine.Tpo -c gimv_xine.c  -fPIC -DPIC -o .libs/gimv_xine.o
In file included from gimv_xine.c:41:0:
gimv_xine_priv.h:91:4: error: unknown type name 'xine_vo_driver_t'
    xine_vo_driver_t        *vo_driver;
    ^
gimv_xine_priv.h:92:4: error: unknown type name 'xine_ao_driver_t'
    xine_ao_driver_t        *ao_driver;
    ^
gimv_xine.c:252:1: error: unknown type name 'xine_vo_driver_t'
 static xine_vo_driver_t *
 ^
gimv_xine.c: In function 'load_video_out_driver':
gimv_xine.c:264:4: error: unknown type name 'xine_vo_driver_t'
    xine_vo_driver_t *vo_driver;
    ^
gimv_xine.c:298:17: warning: assignment from incompatible pointer type [enabled by default]
       vo_driver = xine_open_video_driver (priv->xine,
                 ^
gimv_xine.c:308:4: warning: return from incompatible pointer type [enabled by default]
    return xine_open_video_driver (priv->xine, NULL,
    ^
gimv_xine.c: At top level:
gimv_xine.c:314:1: error: unknown type name 'xine_ao_driver_t'
 static xine_ao_driver_t *
 ^
gimv_xine.c: In function 'load_audio_out_driver':
gimv_xine.c:318:4: error: unknown type name 'xine_ao_driver_t'
    xine_ao_driver_t *ao_driver;
    ^

...

make[3]: *** [gimv_xine.lo] Error 1
make[3]: Leaving directory `/tmp/work/gimageview-master/plugins/image_view'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/tmp/work/gimageview-master/plugins'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/work/gimageview-master'
make: *** [all] Error 2

xine_vo_driver_t/xine_ao_driver_t型関係の対処

xine_vo_driver_t型とxine_ao_driver_t型は、既に1.1系でも非推奨なものとされている。
[引用]ファイル名: xine-lib-1.1.21/include/xine.h より

#ifndef XINE_DISABLE_DEPRECATED_FEATURES
/* convenience types: simple player UIs might want to call ports drivers */
typedef xine_audio_port_t xine_ao_driver_t XINE_DEPRECATED;
typedef xine_video_port_t xine_vo_driver_t XINE_DEPRECATED;
#endif

非推奨とは言え、型の名前が変えてあるだけということが分かったため、xine_video_port_tとxine_audio_port_tへそれぞれ置換してみた。

$ sed -i -e 's:xine_vo_driver_t:xine_video_port_t:g' -e 's:xine_ao_driver_t:xine_audio_port_t:g' plugins/image_view/*.*
$ make

するとビルドは無事に完了して起動はできたのだが

$ make install-strip
$ [インストール先]/bin/gimv

動画ファイルの再生を開始しようとすると

[インストール先]/bin/gimv: symbol lookup error: [インストール先]/lib/gimageview/image_view/libgimv_xine.so: undefined symbol: _

となって落ちる。この件についてはUbuntu 14.04上でxine-lib 1.1でも試したところ同様の問題が起こる(Ubuntu 14.04までのPPAのパッケージでも不具合が発生していた)ことが分かったため、1.2系特有のものではない。

「undefined symbol: _」の対処(xine-lib 1.1系でも発生)

_()はメッセージの国際化で用いられるが、本来gettext()に展開されるべきものがそのままの名前で参照している状態となっている。
試しにlibgimv_xine.soを構成するソース(plugins/image_view/Makefile.amlibgimv_xine_la_SOURCES)群の中の_()などの呼び出しを含んだソースファイル(gimv_xine_post.c,image_view_xine.c,prefs_xine.cの3つ)にGLibのglib/gi18n.hを参照するための

#include <glib/gi18n.h>

という記述を入れて再ビルド・インストールして再び試したところこの問題は解決し

[インストール先]/bin/gimv: symbol lookup error: [インストール先]/lib/gimageview/image_view/libgimv_xine.so: undefined symbol: xine_gui_send_vo_data

にメッセージが変わった。

「undefined symbol: xine_gui_send_vo_data」の対処

[引用]ファイル名: xine-lib-1.1.21/src/xine-engine/xine_interface.c より

#ifndef XINE_DISABLE_DEPRECATED_FEATURES
int xine_gui_send_vo_data (xine_stream_t *stream,
			   int type, void *data) {

  return stream->video_driver->gui_data_exchange (stream->video_driver,
						  type, data);
}
#endif

この関数も非推奨扱いとなっていたものでバージョン1.2系で消えているのだが、これはreturn文だけの関数なので、この内容を用いてplugins/image_view/gimv_xine.c内の

xine_gui_send_vo_data (priv->stream,
                       XINE_GUI_SEND_EXPOSE_EVENT, &event);

priv->stream->video_driver->gui_data_exchange (priv->stream->video_driver,
                                               XINE_GUI_SEND_EXPOSE_EVENT,
                                               &event);

のように置き換えてみた(同様の箇所が他にもう1つある)。すると

$ LC_MESSAGES=C make

...

Making all in image_view
make[3]: Entering directory `/tmp/work/gimageview-master/plugins/image_view'
/bin/bash ../../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I../.. -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/harfbuzz    -I../.. -I../../src  -DDATADIR=\""/tmp/work/prefix/share/gimageview"\"  -g -O2 -Wall -MT gimv_xine.lo -MD -MP -MF .deps/gimv_xine.Tpo -c -o gimv_xine.lo gimv_xine.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I../.. -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I../.. -I../../src -DDATADIR=\"/tmp/work/prefix/share/gimageview\" -g -O2 -Wall -MT gimv_xine.lo -MD -MP -MF .deps/gimv_xine.Tpo -c gimv_xine.c  -fPIC -DPIC -o .libs/gimv_xine.o
gimv_xine.c: In function 'filter_xine_event':
gimv_xine.c:362:19: error: dereferencing pointer to incomplete type
       priv->stream->video_driver->gui_data_exchange (priv->stream->video_driver,
                   ^
gimv_xine.c:362:66: error: dereferencing pointer to incomplete type
       priv->stream->video_driver->gui_data_exchange (priv->stream->video_driver,
                                                                  ^
gimv_xine.c:372:19: error: dereferencing pointer to incomplete type
       priv->stream->video_driver->gui_data_exchange (priv->stream->video_driver,
                   ^
gimv_xine.c:372:66: error: dereferencing pointer to incomplete type
       priv->stream->video_driver->gui_data_exchange (priv->stream->video_driver,
                                                                  ^
gimv_xine.c: In function 'gimv_xine_size_allocate':
gimv_xine.c:679:14: warning: variable 'this' set but not used [-Wunused-but-set-variable]
    GimvXine *this;
              ^
gimv_xine.c: In function 'gimv_xine_play':
gimv_xine.c:742:2: warning: #warning FIXME [-Wcpp]
 #warning FIXME
  ^
gimv_xine.c: In function 'gimv_xine_trick_mode':
gimv_xine.c:817:4: warning: implicit declaration of function 'xine_trick_mode' [-Wimplicit-function-declaration]
    return xine_trick_mode (priv->stream, mode, value);
    ^
make[3]: *** [gimv_xine.lo] Error 1
make[3]: Leaving directory `/tmp/work/gimageview-master/plugins/image_view'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/tmp/work/gimageview-master/plugins'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/work/gimageview-master'
make: *** [all] Error 2

「stream」のメンバ「video_driver」がうまく処理されていないように見える(メンバ名がコンパイラから認識されていない状態)。
まずxine_stream_t型は
[引用]ファイル名: xine.h より

typedef struct xine_stream_s xine_stream_t;

xine_stream_s型の別名となっているため、この型の構造体の定義部分を探すと
[引用]ファイル名: xine/xine_internal.h より

struct xine_stream_s {

  ...

  /* dxr3 use this one, should be possible to fix to use the port instead */
  vo_driver_t               *video_driver;

  ...

xine/xine_internal.hにあったので、このファイルを参照するようにplugins/image_view/gimv_xine.c

#include <xine.h>

の下に

#include <xine/xine_internal.h>

を付けてみたところビルドは通り、1.2系のプラグインが正しくインストールされた状態での動画再生機能が動作することも確認できた。
ただ、(バージョン1.2系に関係しているかは不明だが)ファイルの再生が最後まで終わったときなどに固まる場合があり、設定ダイアログのビデオドライバの選択によっては全く動かないこともある。再生自体も個人的にはMPlayerと比べると不安定な印象がある。


xine-lib 1.2ではVDPAU対応など大きな改善点もあるため、今回、Ubuntu 14.10向けと同時にUbuntu 14.04向けのPPAリポジトリ「ppa:kakurasan/unstable」のパッケージにもxine-lib 1.2対応の修正は追加して公開した。
パッケージ自体はかなり前のDebianのものをもとにしているため
launchpad.net/~kakurasan/+archive/ubuntu/unstable/+files/gimageview_0.3.0-0.20140905-2.debian.tar.gz
debianディレクトリの直下のファイル群は当時のパッケージ作者のライセンス(GPL-2)が適用されるが、新しく手元で作成したパッチ群(debian/patches/*.patch・本記事の内容のパッチを含む)についてはパブリックドメインとする。ただ、xine-lib 1.2対応のパッチについては、そのままの形で適用するとバージョンの非常に古いxine-libでの検出に問題が出る可能性があるため、PKG_CHECK_MODULESで検出されなかった場合に従来のAM_PATH_XINEによる検出を試す形にしたほうが本家のソースへ適用する場合には適しているかもしれない(なお、バージョン1.1系時点では.pcファイルは存在するためPKG_CHECK_MODULESによる検出は行える)。

使用したバージョン:

  • GImageView 2014/9/5版
  • xine-lib 1.1.21, 1.2.4

画像ビューア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版

Luaコード例#6:Luaにおける条件分岐(if文,関係演算子,論理演算子)とコマンド行引数の扱い(ページ3/3跡地)

(2019/4/16)本記事は「Luaにおける条件分岐(if文,関係演算子,論理演算子)とコマンド行引数の扱い」へ移動した。

Luaコード例#6:Luaにおける条件分岐(if文,関係演算子,論理演算子)とコマンド行引数の扱い(ページ2/3跡地)

(2019/4/16)本記事は「Luaにおける条件分岐(if文,関係演算子,論理演算子)とコマンド行引数の扱い」へ移動した。

Luaコード例#6:Luaにおける条件分岐(if文,関係演算子,論理演算子)とコマンド行引数の扱い(ページ1/3跡地)

(2019/4/16)本記事は「Luaにおける条件分岐(if文,関係演算子,論理演算子)とコマンド行引数の扱い」へ移動した。

Luaコード例#5:Luaにおける算術演算子(ページ2/2)跡地

本日の猫

(2018/11/14)本記事は「Luaにおける算術演算子」へ移動した。

-7 --> 7 --> -7

                                                                                                                                                              • -

> i = 1
i = 1
> i = i + 1
i = 2
> i = i - 10
i = -8
|