Vim のビルド時における configure の流れを少し知った
秘密は src/auto
にあり
7.3.555 にアップデート。warning があることに気付いてはいたのだけど、放置していた部分を調べてみることにした。Lua と Ruby は問題ないようだけど、Perl で出ている。どうやらリンクするライブラリに問題があるみたい。
gcc -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X_UNIX -no-cpp-precomp -g -O2 -I/usr/X11R6/include -I/usr/local/include -o objects/if_lua.o if_lua.c gcc -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X_UNIX -no-cpp-precomp -g -O2 -I/usr/X11R6/include -DFEAT_PERL -I/System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE -o objects/if_perl.o auto/if_perl.c In file included from /System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE/perl.h:1794, from vim.h:2181, from if_perl.xs:16: /System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE/handy.h:85:1: warning: "bool" redefined In file included from os_mac.h:50, from vim.h:338, from if_perl.xs:16: /usr/include/curses.h:117:1: warning: this is the location of the previous definition gcc -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X_UNIX -no-cpp-precomp -g -O2 -I/usr/X11R6/include -DFEAT_PERL -I/System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE -o objects/if_perlsfio.o if_perlsfio.c In file included from /System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE/perl.h:1794, from vim.h:2181, from if_perlsfio.c:16: /System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE/handy.h:85:1: warning: "bool" redefined In file included from os_mac.h:50, from vim.h:338, from if_perlsfio.c:16: /usr/include/curses.h:117:1: warning: this is the location of the previous definition
-DFEAT_PERL -I/System/...
のところが bundle 形式の古い方を差している。5.8.1 ってデフォルトでインストールされている方の Perl だよ?現在は 5.16.0 もインストールしてあるので、/usr/local/include
の方を見てもらいたいなぁと思ったのだけど、include 以下に perl のヘッダファイルが無い。どこにインストールされているのだろう?locate perl.h
で調べてみると、こんなところにあった。
/usr/local/lib/perl5/5.16.0/darwin-2level/CORE/perl.h
何で lib 以下にあんねん。
configure オプションでは指定する方法が無かったと思うので、直接指定しようと Makefile を見てみるのだけど何も書いてない。実は src/auto/config.mk
が本体みたい。そこで auto に移動してみると、こんなところに if_perl.c
が!src の場所には if_perl.xs
と if_perlsfio.c
というものがある。何だ何だ?どうやら if_perl.xs
ファイルをテンプレートにして生成されるのがこの if_perl.c
みたい。Don't Touch Me.
src/auto/configure
に PERL_CFLAGS="-DFEAT_PERL -I$darwindir/CORE"
が書いてあった。えっと、つまり darwindir の部分を変更すれば良い訳だね。darwindir=$dir/darwin-thread-multi-2level
となってた。version 5.16.0 は thread-multi が付いてないんですけど...。Perl のビルドし直しか?
とりあえず Vim 内の話を続けよう。configure を thread-multi で検索すると、5144 行目にあった。14000 行近い configure って何よ?ちょっと長いけど引用する。
if test "x$MACOSX" = "xyes"; then dir=/System/Library/Perl darwindir=$dir/darwin if test -d $darwindir; then PERL=/usr/bin/perl else dir=/System/Library/Perl/5.8.1 darwindir=$dir/darwin-thread-multi-2level if test -d $darwindir; then PERL=/usr/bin/perl fi fi if test -n "$PERL"; then PERL_DIR="$dir" PERL_CFLAGS="-DFEAT_PERL -I$darwindir/CORE" PERL_OBJ="objects/if_perl.o objects/if_perlsfio.o $darwindir/auto/DynaLoader/DynaLoader.a" PERL_LIBS="-L$darwindir/CORE -lperl" fi PERL_LIBS=`echo "$PERL_LIBS" | sed -e 's/-arch¥ ppc//' -e 's/-arch¥ i386//' -e 's/-arch¥ x86_64//'` PERL_CFLAGS=`echo "$PERL_CFLAGS" | sed -e 's/-arch¥ ppc//' -e 's/-arch¥ i386//' -e 's/-arch¥ x86_64//'` fi
MACOSX と判定されていると /System/Library/
以下の方が使われちゃうのか。で。MACOSX で検索すると、enable_darwin
が yes だと設定されるみたい。だから「CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
」というオプションが付くんだね。
あ〜、なんだか昔に「MacOSX と UNIX と darwin がなんとかかんとか」というのを見た記憶がある。darwin なんだけど UNIX として使うなら darwin を切れというやつだったかなぁ。--disable-darwin にして configure をやり直してみた。diff を取ると、
diff config.mk.BAK config.mk 23c23 < CPPFLAGS = -DMACOS_X_UNIX -no-cpp-precomp --- > CPPFLAGS = 27c27 < LIBS = -lm -ltinfo -liconv -lintl -framework Cocoa --- > LIBS = -lm -ltinfo -liconv -lintl 56c56 < PERL_LIBS = -L/System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE -lperl --- > PERL_LIBS = -L/usr/local/lib -L/usr/local/lib/perl5/5.16.0/darwin-2level/CORE -lperl -ldl -lm -lc 59c59 < PERL_OBJ = objects/if_perl.o objects/if_perlsfio.o /System/Library/Perl/5.8.1/darwin-thread-multi-2level auto/DynaLoader/DynaLoader.a --- > PERL_OBJ = objects/if_perl.o objects/if_perlsfio.o 61c61 < PERL_CFLAGS = -DFEAT_PERL -I/System/Library/Perl/5.8.1/darwin-thread-multi-2level/CORE --- > PERL_CFLAGS = -DPERL_DARWIN -fno-strict-aliasing -I/usr/local/include -I/usr/local/lib/perl5/5.16.0/darwin-2level/CORE 161,162c161,162 < OS_EXTRA_SRC = os_macosx.m os_mac_conv.c < OS_EXTRA_OBJ = objects/os_macosx.o objects/os_mac_conv.o --- > OS_EXTRA_SRC = > OS_EXTRA_OBJ = diff config.h.BAK config.h 303c303 < #define NO_STRINGS_WITH_STRING_H 1 --- > /* #undef NO_STRINGS_WITH_STRING_H */
のようになって新しい方の Perl が指定されている。でもこれでビルドがうまく行くのだろうか?
gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -I/usr/X11R6/include -I/usr/local/include -o objects/if_lua.o if_lua.c gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -I/usr/X11R6/include -DPERL_DARWIN -fno-strict-aliasing -I/usr/local/include -I/usr/local/lib/perl5/5.16.0/darwin-2level/CORE -o objects/if_perl.o auto/if_perl.c gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -I/usr/X11R6/include -DPERL_DARWIN -fno-strict-aliasing -I/usr/local/include -I/usr/local/lib/perl5/5.16.0/darwin-2level/CORE -o objects/if_perlsfio.o if_perlsfio.c gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -I/usr/X11R6/include -I/usr/local/include/ruby-1.9.1 -I/usr/local/include/ruby-1.9.1/powerpc-darwin7.9.0 -DRUBY_VERSION=19 -o objects/if_ruby.o if_ruby.c
となって、エラーもなく新しい方をリンクしてくれた。また、Test results: ALL DONE となって無事、7.3.555 になった。X11R6 も要らないので、次回のパッチ祭の時に調べてみよう。
と安心していたのだけど、hello を表示しようとしたら「Vim: Caught deadly signal TRAP」などといって端末ごと死んでしまった。これは Perl 側のビルドに問題があるのかなぁ。
X11 を無効に
7.3.556 にアップデート。今回は --without-x
を付けて X11 を無効にした。Perl の thread-multi については手を付けていないのでそのまにした。Perl を動かさなければ良いのだ。
Perl のシェアードライブラリを作る
Ruby の時と同じような落ちかただったので、Perl 側を小細工することに。対話式 configure で shared と thread を yes にして、less
の代りに /usr/local/bin/lv
、yacc
の代りに bison -y
を指定してビルドした。make test
で db 関係、それと Socket 関係でエラーが出ていた。どちらも使わないので問題はないと思う。
cpan/Socket/t/getnameinfo .....................................
# Failed test '$err == 0 for {family=AF_INET,port=80,sinaddr=127.0.0.1}/NI_NUMERICHOST'
# at t/getnameinfo.t line 39.
# got: 11
# expected: 0
FAILED at test 12
最終的には
Failed 1 test out of 2263, 99.96% okay.
../cpan/Socket/t/getnameinfo.t
### Since not all tests were successful, you may want to run some of
### them individually and examine any diagnostic messages they produce.
### See the INSTALL document's section on "make test".
### You have a good chance to get more information by running
### ./perl harness
### in the 't' directory since most (>=80%) of the tests succeeded.
### You may have to set your dynamic library search path,
### DYLD_LIBRARY_PATH, to point to the build directory:
### setenv DYLD_LIBRARY_PATH `pwd`:$DYLD_LIBRARY_PATH; cd t; ./perl harness
### DYLD_LIBRARY_PATH=`pwd`:$DYLD_LIBRARY_PATH; export DYLD_LIBRARY_PATH; cd t; ./perl harness
### export DYLD_LIBRARY_PATH=`pwd`:$DYLD_LIBRARY_PATH; cd t; ./perl harness
### for csh-style shells, like tcsh; or for traditional/modern
### Bourne-style shells, like bash, ksh, and zsh, respectively.
u=79.26 s=32.49 cu=4745.88 cs=835.67 scripts=2263 tests=530549
make: *** [test] Error 1
となった。インストールしてしまうけど。
Vim に戻って make clean
をしてから下記のオプションで configure
。
./configure --enable-multibyte --with-features=big --enable-gui=no --without-x --enable-rubyinterp=yes --with-ruby-command=/usr/local/bin/ruby --enable-luainterp=yes --with-lua-prefix=/usr/local --enable-perlinterp=yes --disable-darwin
make
時に下記のような処理が行われたけれど、バイナリは完成した。
/usr/local/bin/perl -e 'unless ( $] >= 5.005 ) { for (qw(na defgv errgv)) { print "#define PL_$_ $_\n" }}' > auto/if_perl.c /usr/local/bin/perl /usr/local/lib/perl5/5.16.0/ExtUtils/xsubpp -prototypes -typemap \ /usr/local/lib/perl5/5.16.0/ExtUtils/typemap if_perl.xs >> auto/if_perl.c gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -DPERL_DARWIN -fno-strict-aliasing -I/usr/local/include -I/usr/local/lib/perl5/5.16.0/darwin-thread-multi-2level/CORE -o objects/if_perl.o auto/if_perl.c gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -DPERL_DARWIN -fno-strict-aliasing -I/usr/local/include -I/usr/local/lib/perl5/5.16.0/darwin-thread-multi-2level/CORE -o objects/if_perlsfio.o if_perlsfio.c
perl のコマンドを実行してもターミナルごと落ちなくなった。成功と書いてないのはコマンドラインに表示されないからなのだ。Vim を終了するとドバッと表示される。
Lua は簡単だった
5.2.1 にアップデート。Perl に比べたらあっという間の時間でビルドできてしまった。Vim でも問題なく使える。軽くていいわ、ほんと。