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とかまだ全然よく分かっていないのでもう少し勉強する…。