Perl/PrimaでGUI(Windows7/MSYS2)

Windows7(+MSYS2)上で、Perl/GUIを模索していたところPrimaを用いることで、一部制約はありそうだが(及び確実に設定が足りてないところもあるが。。)、容易に構築出来たの備忘メモ。当初は、MSYS2+Perl/GTK2を目指したが、力量不足により挫折。。
Primaについては http://www.prima.eu.org/ 参照。

なお、環境は Windows7 Professional 64bit。

1. 準備
2. MSYS2のインストール
3. 各種パッケージをインストール
4. CPAN経由でPrimaインストール
5. お試し実行

# 準備

該当PCの
「コントロール パネル\すべてのコントロール パネル項目\システム\システム詳細設定\環境変数」
で関連しそうなパスが無いか確認し、影響ありそうだったら適宜修正(cygwinやperlなどなど)。

# MSYS2のインストール

基本、[Officalサイト](https://msys2.github.io/)の手順通り。

1. インストーラのダウンロード＆インストール。2016/01/20時点では、msys2-x86_64-20150916.exe を利用。
2. 起動したMSYS2のシェル上で、`pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime`を実行。
3. 一旦、終了。`exit`コマンドで抜けようとすると、以下の様なエラーがでるが、めげずに`exit`していると終了する。（多分×で終わらしてもよいかと）
    1 [main] bash 8504 fork: child -1 - forked process 14544 died unexpectedly, retry 0, exit code 0x1, errno 11
    bash: fork: retry: No child processes

4. スタートメニューより。MSYS2(MSYS2 Shell(msys2_shell.bat))を起動し、`pacman -Syu`を実行
5. 再び終了。`exit`する。

# 各種パッケージのインストール

二つのパッケージを指定するだけで、とりあえず問題無さそう。ただ、MSYS2の起動batだけは、mingw側を用いる。

1. インストールしたフォルダ(例えば：C:\msys64配下)の`mingw64_shell.bat`を用いてMSYS2を起動する。通常の`msys2_shell.bat`を用いたいところだが、後者を用いて単純にPrimaのmakeすると、X11ライブラリがらみで失敗するので、前者の`mingw64_shell.bat`を利用する。(32bit環境の場合は、試していないが、`mingw32_shell.bat`でいけるかな。)
2. 起動したshellから、以下を実行する。この時、依存パッケージも含めてインストールされる。

~~~~sh
$ pacman -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-perl
~~~~

# CPAN経由でPrimaインストール

以下を実行。

~~~~sh
$ perl -MCPAN -e "install Prima"
~~~~

一発目のCPAN起動なので、以下の様な問い合わせがでるが、そのままEnter。関連モジュールも合わせてビルド＆インストールされる。


    CPAN.pm requires configuration, but most of it can be done automatically.
    If you answer 'no' below, you will enter an interactive dialog for each
    configuration option instead.
    
    Would you like to configure as much as possible automatically? [yes]

# お試し実行

https://github.com/dk/Prima の "Hello world"を試してみる。

~~~~perl:sample.pl
use Prima qw(Application Buttons);

new Prima::MainWindow(
        text     => 'Hello world!',
        size     => [ 200, 200],
)-> insert( Button =>
        centered => 1,
        text     => 'Hello world!',
        onClick  => sub { $::application-> close },
);

run Prima;
~~~~

~~~~bash
$ perl sample.pl
~~~~

以下の様なダイアログが、表示され、一応満足。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/91771/71c439a0-cf48-effb-3e1c-1b8f6eb73302.png)

## 実行時に表示されるエラー

なお、実行時に、以下の様なエラーがターミナル上に、Primaロゴがロード出来ないと、表示されるが、今のところ回避出来ていない

    Failed to load standard bitmap 'C:/msys64/mingw64/lib/perl5/site_perl/Prima/sys/win32/sysimage.gif':No appropriate codec found. Did you compile Prima with GIF support?

確かに、ビルド時に以下の様な警告が出ていた。

    ** Warning: the following image libraries weren't found:
    
    jpeg png tiff gif Xpm

そこで、`pacman -Ss` で見つけたライブラリを突っ込んで、再度ビルド＆インストール。

~~~~bash
$ pacman -S mingw-w64-x86_64-giflib mingw-w64-x86_64-libtiff mingw-w64-x86_64-libjpeg mingw-w64-x86_64-libpng
$ cpan
cpan[1]> force install Prima
cpan[2]> quit
~~~~

これで、ビルド時のWarning(jpeg/png/tiff/gif)は消えた。しかし、目的の実行時のエラーは消えないままとなる。。
保留。。。

## Sample

Primaを用いたサンプルコードは以下にコピーされている。

    /mingw64/lib/perl5/site_perl/Prima/examples

以下は、サンプル群の一部キャプチャ。また、サンプルで実行できないものも何点か存在したが、一応、それなりのことはでいる模様。ちなみに、gifファイルもデコード出来たようなので、libgifのインストールは無駄ではなかった。(一部サンプルでは、前述のWarningは出ない)

![amba.png](https://qiita-image-store.s3.amazonaws.com/0/91771/cb3dae49-d61b-c52a-a76a-b330ef6ed6a7.png)

![canvas.png](https://qiita-image-store.s3.amazonaws.com/0/91771/9c9c0572-f681-0501-ad92-d7feb7861e58.png)

![cv.png](https://qiita-image-store.s3.amazonaws.com/0/91771/8cd74e18-af13-7d64-b355-923cf7cf182f.png)

![eyes.png](https://qiita-image-store.s3.amazonaws.com/0/91771/19f31675-c3e7-c076-0447-1394916c884b.png)

![f_fill.png](https://qiita-image-store.s3.amazonaws.com/0/91771/260ca404-f5c8-8229-3a58-77b8b9d62881.png)

![grid.png](https://qiita-image-store.s3.amazonaws.com/0/91771/41b1cc76-1f31-5eeb-8ce8-f2494017f865.png)

![iv.png](https://qiita-image-store.s3.amazonaws.com/0/91771/f8219729-6764-1b09-7757-b54eb32d9eba.png)

![matrix.png](https://qiita-image-store.s3.amazonaws.com/0/91771/dbc62bf5-e4ef-15d0-f878-71fb3606046e.png)

![mdi.png](https://qiita-image-store.s3.amazonaws.com/0/91771/6ce804b4-5f13-c56e-204f-6e2263b40316.png)

![notebook.png](https://qiita-image-store.s3.amazonaws.com/0/91771/f52cb519-e128-4d24-eab4-e453dc5b0249.png)

![outline.png](https://qiita-image-store.s3.amazonaws.com/0/91771/ad059d57-6bbe-b6b2-ccb5-3dc7caad9a16.png)

![periodic.png](https://qiita-image-store.s3.amazonaws.com/0/91771/f64b7820-f8cd-00cd-0c93-eed65c7cfdd2.png)

![pointers.png](https://qiita-image-store.s3.amazonaws.com/0/91771/51ddd681-f746-7f3b-0d02-187544d323a6.png)


# その他

その他

## msys2_shell.batでの構築

本来は、`msys2_shell.bat` 上で、前述を行いたかったのだが、Primaのconfigureで、X11のヘッダーが無いと怒られてしまう。

    Checking for X11 headers...no
    Prima needs X11 headers for compilation! Set X11BASE='/path/to/X' or INCPATH+='/path/to/X/include' if you have a non-standard path to X. (see also makefile.log for details)

`msys2_shell.bat`で、makeした場合は、`Checking for X11 library... no, using built-in`で、うまくパスしてくれたのだが、msys2版だとX11ライブラリが必要となる模様。
そこで、`pacman -Ss`でそれっぽいライブラリを探したのだが、回避に至らず。。。

ちなみに、`msys2_shell.bat`でmakeする場合は、同batで起動したshell上で以下の様に、msys2用のツール環境を改めてインストールする必要がある。

~~~~bash
pacman -S base-devel
~~~~