IUPのインストールで苦労する話


## 注意
記事を書こうと思ったのが2015年3月頃、公開しようと思ったのが2016年4月なので色々事情が変わっている可能性があります。

## 文脈
IUP は Lua から扱える GUI Tool Kit です。

Lua から扱える　GUI Tool Kit には他にも、 wxLua が挙げられます。wxLua はその名のとおり、wxWidgets ベースになっており、wxLua という wxWidgets アプリケーションに Lua スクリプトを渡すことで、Lua による GUI アプリケーション構築を可能としています。しかし、メンテナンスが 2005 年を境に止まっており、2015 年である現在、使用するのは気が引けます。

一方、IUP は GTK+ ベースであり、ここ最近もメンテナンスされいるようなので、幾分か安心して使用できそうです。
ただし、IUP は Binary Package が配布されているものの、少なくとも自分の Mac OSX 環境(Yosemite 10.10.2)では共有ライブラリのダイナミックローディングに失敗するため、source から install することにしました。

インストール手順は、大抵[ここ](http://webserver2.tecgraf.puc-rio.br/iup/en/building.html
)に書いてあるとおりなのですが、Windows / Linux での説明なので、Mac OSX でのビルドに苦労したよ、という話です。

## 環境
```bash
gcc -v
```
>
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

```bash
make -v
```
> GNU Make 3.81

## 1.Finkのダウンロード

#### Fink のインストール

Fink は OSX 上に X Window System を導入するためのパッケージ管理システムです。brew で install した GTK+ では、インクルードパスが見つからず、コンパイルに失敗するため、Fink で X Window System を導入します。

[Fink](http://www.finkproject.org/index.php?phpLang=en)
[installer(Install Fink.tool)のリポジトリ](https://github.com/fink/scripts/blob/master/srcinstaller/Install%20Fink.tool
)

いくつかの質問に答えるだけで良いのですが、インストールされるまでが長いので、時間に余裕があるときにインストールすることをお勧めします。
/sw にインストールされます。

#### Fink でセットアップ

パッケージのインストールやらパスの設定やらをします。[こちら](http://www.sci.hokudai.ac.jp/~okuoku/programs/misc_docs/install_mac.html
)を参考にしました。

足りないパッケージは、

```bash
sw/bin/fink install hoge
```

```bash
sw/bin/pkg-config --cflags gtk+-2.0
```

で 下記のように /sw 以下のパスを見ているようであればok.

>
-I/sw/include/gtk-2.0 -I/sw/lib/gtk-2.0/include -I/sw/include/gtk-2.0 -I/sw/include/pango-1.0 -I/sw/include/atk-1.0 -I/sw/include/cairo -I/sw/include/pango-1.0 -I/sw/include/glib-2.0 -I/sw/lib/glib-2.0/include -I/opt/X11/include -I/opt/X11/include/freetype2

また、下記をしておきます。

```bash
export USE_MACOS_OPENGL=Yes
export GTK_BASE=/sw
# x11 ではなく、quartz を利用する
export GTK_MAC=Yes
```

## quarts 依存にする
```bash
brew tap acornejo/quartz

brew install gtk+-quartz
brew install pango-quartz
brew install cairo-quartz

export USE_PKGCONFIG=Yes
export PKG_CONFIG_PATH=/opt/loca/lib/pkgconfig:/opt/X11/lib/pkgconfig
```

## 2. Lua のインストール
一部のライブラリの生成には Lua のスタティックライブラリ必要なため、なければソースからコンパイルしてインストールしておきましょう。
IUP の Lua Binding のライブラリを生成するため、下記でパスを設定しておきます。
以降の解説では、Lua 5.2 を使用することを前提とします。

```bash
# Lua5.1 で使用する場合
# export LUA_SUFFIX=5.1
# export LUA_INC=/usr/local/include/lua5.1
# Lua5.2 で使用する場合
export LUA_SUFFIX=52
export LUA_INC=/usr/local/include/lua5.2
export LUA_LIB=/usr/local/lib
```

あるいは、本家　Lua に luaconf.h に修正が加えられた LuaBinaries があるので、これを利用することも可能です。 この場合にも include と lib のパスは設定しておきましょう。

[LuaBinaries はこちら](http://webserver2.tecgraf.puc-rio.br/iup/en/download_tips.html)

なお、LuaBinaries は luaconf.h が書き換えらえており、これによって、

```lua
package.cpath = package.cpath..";./lib?51.so"
```

のように cpath を追加しなくても 

```lua
require "iuplua"
```

できるようになっています。

## 3. IM (An Imagking Tool) のコンパイル
IUP は IM と CD というライブラリに依存しており、CD は IM に依存しています。なので、まず IM からインストールします。

[IM のダウンロードはこちら](http://sourceforge.net/projects/imtoolkit/files/)(自分がダウンロードしたのは、[im-3.9_Sources.zip](http://sourceforge.net/projects/imtoolkit/files/3.9/Docs%20and%20Sources/im-3.9_Sources.zip/download))

解凍して、適当なディレクトリに展開後下記でコンパイルします。

```bash
cd im
# sudo つけないと tar.gz でダウンロードした場合にうまくいかなかった。zip 形式でダウンロードした場合は sudo つけなくても良かった。
sudo make
```

しかし、下記のエラーでコンパイル失敗。

> 
Tecmake: linking libim_process_omp.dylib ...
g++ -dynamiclib -Wl -fno-common -headerpad_max_install_names -undefined dynamic_lookup -install_name libim_process_omp.dylib -o ../lib/MacOS1010x86/libim_process_omp.dylib ../obj/im_process_omp/MacOS1010x86/im_arithmetic_bin.o ../obj/im_process_omp/MacOS1010x86/im_morphology_gray.o ../obj/im_process_omp/MacOS1010x86/im_quantize.o ../obj/im_process_omp/MacOS1010x86/im_arithmetic_un.o ../obj/im_process_omp/MacOS1010x86/im_geometric.o ../obj/im_process_omp/MacOS1010x86/im_render.o ../obj/im_process_omp/MacOS1010x86/im_color.o ../obj/im_process_omp/MacOS1010x86/im_histogram.o ../obj/im_process_omp/MacOS1010x86/im_resize.o ../obj/im_process_omp/MacOS1010x86/im_convolve.o ../obj/im_process_omp/MacOS1010x86/im_houghline.o ../obj/im_process_omp/MacOS1010x86/im_statistics.o ../obj/im_process_omp/MacOS1010x86/im_convolve_rank.o ../obj/im_process_omp/MacOS1010x86/im_logic.o ../obj/im_process_omp/MacOS1010x86/im_threshold.o ../obj/im_process_omp/MacOS1010x86/im_effects.o ../obj/im_process_omp/MacOS1010x86/im_morphology_bin.o ../obj/im_process_omp/MacOS1010x86/im_tonegamut.o ../obj/im_process_omp/MacOS1010x86/im_canny.o ../obj/im_process_omp/MacOS1010x86/im_distance.o ../obj/im_process_omp/MacOS1010x86/im_analyze.o ../obj/im_process_omp/MacOS1010x86/im_kernel.o ../obj/im_process_omp/MacOS1010x86/im_remotesens.o ../obj/im_process_omp/MacOS1010x86/im_point.o ../obj/im_process_omp/MacOS1010x86/im_process_counter.o ../obj/im_process_omp/MacOS1010x86/im_convertbitmap.o ../obj/im_process_omp/MacOS1010x86/im_convertcolor.o ../obj/im_process_omp/MacOS1010x86/im_converttype.o  -L../lib/MacOS1010x86 -lgomp -lim -lz -lm
ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../lib/MacOS1010x86/libim_process_omp.dylib] Error 1
make[1]: *** [im_process_omp] Error 2
make: *** [do_all] Error 2

調べてみると、llvm-gcc は Open MP をまだサポートしてないらしい。
というわけで src/Makefile を編集します。

```Makefile
# do_all: im_zlib im im_jp2 im_process im_process_omp im_fftw im_lzo imlua5 imlua_jp2 imlua_process5 imlua_process_omp5 imlua_fftw5 $(WINLIBS)
# omp はコンパイルしない
do_all: im_zlib im im_jp2 im_process im_fftw im_lzo imlua5 imlua_jp2 imlua_process5 imlua_fftw5 $(WINLIBS)
```

また、Lua5.1 と Lua5.2 の両バージョン向けにコンパイルしても無駄なので、所望のバージョンだけコンパイルしましょう。

```Makefile
# imlua5 以外の箇所も同様です
imlua5:
	# @$(TECMAKE_CMD) MF=imlua5 USE_LUA51=Yes
	@$(TECMAKE_CMD) MF=imlua5 USE_LUA52=Yes
```

今度は成功し、下記のライブラリが生成されました。

```bash
find lib/MacOS1010x86 -iname "lib*"
```
>
lib/MacOS1010x86/libim.a
lib/MacOS1010x86/libim.dylib
lib/MacOS1010x86/libim_fftw.a
lib/MacOS1010x86/libim_fftw.dylib
lib/MacOS1010x86/libim_jp2.a
lib/MacOS1010x86/libim_jp2.dylib
lib/MacOS1010x86/libim_lzo.a
lib/MacOS1010x86/libim_lzo.dylib
lib/MacOS1010x86/libim_process.a
lib/MacOS1010x86/libim_process.dylib
lib/MacOS1010x86/libim_process_omp.a
lib/MacOS1010x86/libimlua52.a
lib/MacOS1010x86/libimlua52.so
lib/MacOS1010x86/libimlua_fftw52.a
lib/MacOS1010x86/libimlua_fftw52.so
lib/MacOS1010x86/libimlua_jp252.a
lib/MacOS1010x86/libimlua_jp252.so
lib/MacOS1010x86/libimlua_process52.a
lib/MacOS1010x86/libimlua_process52.so
lib/MacOS1010x86/libz.a
lib/MacOS1010x86/libz.dylib

## 4.CD (Canvas Draw) のコンパイル
IM のインストールとほぼ同様です。

[CDのダウンロードはこちら](http://sourceforge.net/projects/canvasdraw/files/)

(自分がダウンロードしたのは、[cd-5.8.1_Sources.zip](http://sourceforge.net/projects/canvasdraw/files/5.8.1/Docs%20and%20Sources/cd-5.8.1_Sources.zip/download))

cdgdk + cairo の組み合わせで作成します。
このため、下記のように Makefile / .mak を変更します。

```Makfile
# do_all: cd_zlib cd_freetype cd_ftgl cd cd_pdflib cdpdf cdgl cdcontextplus cdlua5 cdluapdf5 cdluagl5 cdluacontextplus5 cdluaim5
# cdx11 と cdgdk, cario も生成する
do_all: cd_zlib cd_freetype cd_ftgl cdgdk cd_pdflib cdpdf cdgl cdcontextplus cdcairo cdlua5 cdluapdf5 cdluagl5 cdluacontextplus5 cdluacairo5 cdluaim5

cdcontextplus:
	# @$(TECMAKE_CMD) MF=cdcontextplus
	@$(TECMAKE_CMD) MF=cdcontextplus CD_SUFFIX=
cdcairo:
	# @$(TECMAKE_CMD) MF=cdcairo
	@$(TECMAKE_CMD) MF=cdcairo USE_GDK=Yes CD_SUFFIX=
```

```src/Makefile

```src/config.mak
# 下記がコメントアウトになっているので外しておく
ifneq ($(findstring MacOS, $(TEC_UNAME)), )
  SRC += cairo/cdcairoprn_unix.c
  ifdef USE_GTK3
    INCLUDES += $(GTK)/include/gtk-3.0/unix-print
    SRC += drv/cd0emf.c
  else
    INCLUDES += $(GTK)/include/gtk-unix-print-2.0
  endif 
endif
```

```bash
cd cd
sudo make
```

```bash
find lib/MacOS1010x86 -iname "lib*"
```

>
lib/MacOS1010x86/libcd.a
lib/MacOS1010x86/libcd.dylib
lib/MacOS1010x86/libcdcairo.a
lib/MacOS1010x86/libcdcairo.dylib
lib/MacOS1010x86/libcdcontextplus.a
lib/MacOS1010x86/libcdcontextplus.dylib
lib/MacOS1010x86/libcdgl.a
lib/MacOS1010x86/libcdgl.dylib
lib/MacOS1010x86/libcdlua52.a
lib/MacOS1010x86/libcdlua52.so
lib/MacOS1010x86/libcdluacairo52.a
lib/MacOS1010x86/libcdluacairo52.so
lib/MacOS1010x86/libcdluacontextplus52.a
lib/MacOS1010x86/libcdluacontextplus52.so
lib/MacOS1010x86/libcdluagl52.a
lib/MacOS1010x86/libcdluagl52.so
lib/MacOS1010x86/libcdluaim52.a
lib/MacOS1010x86/libcdluaim52.so
lib/MacOS1010x86/libcdluapdf52.a
lib/MacOS1010x86/libcdluapdf52.so
lib/MacOS1010x86/libcdpdf.a
lib/MacOS1010x86/libcdpdf.dylib
lib/MacOS1010x86/libfreetype.a
lib/MacOS1010x86/libfreetype.dylib
lib/MacOS1010x86/libftgl.a
lib/MacOS1010x86/libftgl.dylib
lib/MacOS1010x86/libpdflib.a
lib/MacOS1010x86/libpdflib.dylib
lib/MacOS1010x86/libz.a
lib/MacOS1010x86/libz.dylib


##5. IUP のコンパイル

いよいよ IUP のインストールです。やれやれ...

[IUPのダウンロードはこちら](http://sourceforge.net/projects/luabinaries/files/)(自分がダウンロードしたのは、[iup-3.12_Sources.zip](
http://sourceforge.net/projects/iup/files/3.12/Docs%20and%20Sources/iup-3.12_Sources.zip/download))

(最新は 3.1.3 であったが、lib/MacOS1010x86 ではなく、lib/MacOS1010 に lib が生成されてしまったため、3.1.2 にしました。)

例によって、Makefile を修正します。

```Makefile
# do_all: iup iupcd iupcontrols iupgl iupglcontrols iup_plot iup_pplot iup_mglplot iup_scintilla iupim iupimglib $(WINLIBS) iupweb iuptuio ledc iupview iuplua5 iupconsole
do_all: iupgtk iupcd iupcontrols iupgl iupglcontrols iup_plot iup_pplot iup_mglplot iup_scintilla iupim iupimglib ledc iupview $(WINLIBS) iupweb iuptuio iuplua5 iupconsole
```

また、srclua5/Makefile で所望の Lua バージョンのみコンパイルするようにしておく。

さらに、srcconsole/Makefile では、下記のようにしておきましょう。

```
do_all: iuplua5gtk

iuplua5gtk:
	@$(TECMAKE_CMD) USE_GTK=Yes USE_LUA52=Yes
```

そして、

```bash
cd iup
sudo make
```

すると下記のエラー。
>
Tecmake: linking libiup_plot.dylib ...
g++ -dynamiclib -Wl -fno-common -headerpad_max_install_names -undefined dynamic_lookup -install_name libiup_plot.dylib -o ../lib/MacOS1010x86/libiup_plot.dylib ../obj/iup_plot/MacOS1010x86/iup_plot.o ../obj/iup_plot/MacOS1010x86/iupPlotCalc.o ../obj/iup_plot/MacOS1010x86/iupPlot.o ../obj/iup_plot/MacOS1010x86/iupPlotDraw.o ../obj/iup_plot/MacOS1010x86/iupPlotTick.o ../obj/iup_plot/MacOS1010x86/iup_plot_attrib.o  -L../lib/MacOS1010x86 -L../../cd/lib/MacOS1010x86 -liup -liupgl -liupcd -lcdgl -lcd -lGLU -lGL -lm
ld: library not found for -lGLU
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../lib/MacOS1010x86/libiup_plot.dylib] Error 1
make[1]: *** [iup_plot] Error 2
make: *** [iup_plot] Error 2

GL関連のライブラリが見つからないようなので、これを解決するため(良いのか不明であるが)下記のようにするとコンパイルが通る。

```bash
export OPENGL_LIB=/usr/X11R6/lib
```

また、上記解決後、今度は iupweb のコンパイルに失敗したので、下記をインストールする。

```bash
/sw/bin/fink install webkit-1.0.2
/sw/bin/fink install libsoup2.4.1-ssl
```

これでようやくコンパイルがとおり、iup/lib/MacOS1010x86 にライブラリが生成されました。

適当なディレクトリに生成されたライブラリをコピーし、そのディレクトリで下記のようにして、動作することを確認。

```lua
package.cpath = package.cpath..";./lib?52.so"
iup = require "iuplua"
iup.Message('YourApp','Finished Successfully!')
```

とりあえず、動かすことには成功しましたが、生成するライブラリの組み合わせ/オプション/参照すべきパス等間違っている可能性はあります。