注意
記事を書こうと思ったのが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 することにしました。
インストール手順は、大抵ここに書いてあるとおりなのですが、Windows / Linux での説明なので、Mac OSX でのビルドに苦労したよ、という話です。
環境
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
make -v
GNU Make 3.81
1.Finkのダウンロード
Fink のインストール
Fink は OSX 上に X Window System を導入するためのパッケージ管理システムです。brew で install した GTK+ では、インクルードパスが見つからず、コンパイルに失敗するため、Fink で X Window System を導入します。
Fink
installer(Install Fink.tool)のリポジトリ
いくつかの質問に答えるだけで良いのですが、インストールされるまでが長いので、時間に余裕があるときにインストールすることをお勧めします。
/sw にインストールされます。
Fink でセットアップ
パッケージのインストールやらパスの設定やらをします。こちらを参考にしました。
足りないパッケージは、
sw/bin/fink install hoge
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
また、下記をしておきます。
export USE_MACOS_OPENGL=Yes
export GTK_BASE=/sw
# x11 ではなく、quartz を利用する
export GTK_MAC=Yes
quarts 依存にする
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 を使用することを前提とします。
# 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 は luaconf.h が書き換えらえており、これによって、
package.cpath = package.cpath..";./lib?51.so"
のように cpath を追加しなくても
require "iuplua"
できるようになっています。
3. IM (An Imagking Tool) のコンパイル
IUP は IM と CD というライブラリに依存しており、CD は IM に依存しています。なので、まず IM からインストールします。
IM のダウンロードはこちら(自分がダウンロードしたのは、im-3.9_Sources.zip)
解凍して、適当なディレクトリに展開後下記でコンパイルします。
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 を編集します。
# 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 の両バージョン向けにコンパイルしても無駄なので、所望のバージョンだけコンパイルしましょう。
# imlua5 以外の箇所も同様です
imlua5:
# @$(TECMAKE_CMD) MF=imlua5 USE_LUA51=Yes
@$(TECMAKE_CMD) MF=imlua5 USE_LUA52=Yes
今度は成功し、下記のライブラリが生成されました。
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-5.8.1_Sources.zip)
cdgdk + cairo の組み合わせで作成します。
このため、下記のように Makefile / .mak を変更します。
# 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/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
cd cd
sudo make
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のダウンロードはこちら(自分がダウンロードしたのは、iup-3.12_Sources.zip)
(最新は 3.1.3 であったが、lib/MacOS1010x86 ではなく、lib/MacOS1010 に lib が生成されてしまったため、3.1.2 にしました。)
例によって、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
そして、
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関連のライブラリが見つからないようなので、これを解決するため(良いのか不明であるが)下記のようにするとコンパイルが通る。
export OPENGL_LIB=/usr/X11R6/lib
また、上記解決後、今度は iupweb のコンパイルに失敗したので、下記をインストールする。
/sw/bin/fink install webkit-1.0.2
/sw/bin/fink install libsoup2.4.1-ssl
これでようやくコンパイルがとおり、iup/lib/MacOS1010x86 にライブラリが生成されました。
適当なディレクトリに生成されたライブラリをコピーし、そのディレクトリで下記のようにして、動作することを確認。
package.cpath = package.cpath..";./lib?52.so"
iup = require "iuplua"
iup.Message('YourApp','Finished Successfully!')
とりあえず、動かすことには成功しましたが、生成するライブラリの組み合わせ/オプション/参照すべきパス等間違っている可能性はあります。