Growl for LinuxをMac OS Xでビルドしてみた その2

Growl for LinuxをMac OS Xでビルドしてみた - すぎゃーんメモの続き。
前回、gtk+-2.0を自前でビルドしていたが こちらを使ってみることに。
GTK+ Download: Mac OS X
X-WindowではなくOSXのQuartzを使ってビルドしてくれるらしい。依存ライブラリなど、前回自前で色々やっていたのを自動で順番に特定ディレクトリにダウンロード、ビルド、インストールしてくれるようだ。

$ wget --no-check-certificate https://github.com/jralls/gtk-osx-build/raw/master/gtk-osx-build-setup.sh
$ sh gtk-osx-build-setup.sh
$ ~/.local/bin/jhbuild bootstrap --ignore-system
$ ~/.local/bin/jhbuild build meta-gtk-osx-bootstrap
$ ~/.local/bin/jhbuild build meta-gtk-osx-core

で、"~/gtk"以下にインストールされる。
これを使うように設定してgrowl-for-linuxをビルド。

$ PKG_CONFIG_PATH=$HOME/gtk/inst/lib/pkgconfig ./configure --prefix=$HOME/local
$ make
$ make install

で、実行すると…

$ gol

** (gol:61164): CRITICAL **: No display plugins found.

となる。
どうも調べてみると、"G_MODULE_SUFFIX"が"so"になっているのに対しビルドの際に作られる共有ライブラリのsuffixが"dylib"になっているためload_display_pluginsでpluginが一つも読み込めずに死んでしまっているようだ。

$ grep G_MODULE_SUFFIX $HOME/gtk/inst/lib/glib-2.0/include/*
#define G_MODULE_SUFFIX "so"
$ ls -l $HOME/local/lib/growl-for-linux/display
total 2504
-rwxr-xr-x  1 sugyan  staff  188748  5 11 20:15 libballoon.0.dylib
-rw-r--r--  1 sugyan  staff  234888  5 11 20:15 libballoon.a
lrwxr-xr-x  1 sugyan  staff      18  5 11 20:15 libballoon.dylib -> libballoon.0.dylib
-rwxr-xr-x  1 sugyan  staff    2092  5 11 20:15 libballoon.la
-rwxr-xr-x  1 sugyan  staff  183852  5 11 20:15 libdefault.0.dylib
-rw-r--r--  1 sugyan  staff  225416  5 11 20:15 libdefault.a
lrwxr-xr-x  1 sugyan  staff      18  5 11 20:15 libdefault.dylib -> libdefault.0.dylib
-rwxr-xr-x  1 sugyan  staff    2092  5 11 20:15 libdefault.la
-rwxr-xr-x  1 sugyan  staff  184340  5 11 20:15 libnico2.0.dylib
-rw-r--r--  1 sugyan  staff  223264  5 11 20:15 libnico2.a
lrwxr-xr-x  1 sugyan  staff      16  5 11 20:15 libnico2.dylib -> libnico2.0.dylib
-rwxr-xr-x  1 sugyan  staff    2080  5 11 20:15 libnico2.la

glibのインストール時にG_MODULE_SUFFIXがdylibになるように何か指定しないといけない…? じゃなくてgrowl-for-linuxでビルドする際に生成するライブラリを".so"に出来る…? よく分からない。。
とりあえず"gol.c"を書き換えて動くようにだけした。

diff --git a/gol.c b/gol.c
index e867d73..06951fd 100644
--- a/gol.c
+++ b/gol.c
@@ -1524,7 +1524,7 @@ load_display_plugins() {
 
   current_display = NULL;
   while ((filename = g_dir_read_name(dir))) {
-    if (!g_str_has_suffix(filename, G_MODULE_SUFFIX))
+    if (!g_str_has_suffix(filename, "0.dylib"))
       continue;
 
     gchar* fullpath = g_build_filename(path, filename, NULL);
@@ -1596,7 +1596,7 @@ load_subscribe_plugins() {
 
   sc.show = subscribe_show;
   while ((filename = g_dir_read_name(dir))) {
-    if (!g_str_has_suffix(filename, G_MODULE_SUFFIX))
+    if (!g_str_has_suffix(filename, "0.dylib"))
       continue;
 
     gchar* fullpath = g_build_filename(path, filename, NULL);

これで動くようになった。

メニューバーにアイコンが出て

メニューウィンドウが出て

設定画面が出る。
プログラムからGNTPで通知してみる。

#!/usr/bin/env perl
use strict;
use warnings;

use Growl::GNTP;

my $growl = Growl::GNTP->new(
    AppName => "my perl app"
);
$growl->register([
    { Name => "hoge" }
]);
$growl->notify(
    Event   => "hoge",
    Title   => "Test",
    Message => "Hello gol!",
    Icon    => "http://www.st-hatena.com/users/su/sugyan/user_p.gif",
);

出た!

…が、他のアプリケーションがアクティブになっているとそのウィンドウに隠れてしまう。最前面に出て欲しいところ…どうすればいいのかな。


とりあえず、これが普通に使えるようになると、TCP(GNTP)でGrowlへ通知を行うことができるようになるので、リモートマシンからGrowl通知をできるようにしようとして挫折した話で諦めたポートフォワードによるリモートからローカルへの通知が可能になる。"~/.ssh/config"で

Host ****
     RemoteForward 23053 localhost:23053

と設定しておくだけで、上記と同じコードをリモートマシン上で実行するとローカルのgolに通知されるようになる!


gtkとかまだ全然よく分かっていないのでもう少し勉強する…。