sci

最果て風呂

Vim のビルド時における configure の流れを少し知った

秘密は src/auto にあり

7.3.555 にアップデート。warning があることに気付いてはいたのだけど、放置していた部分を調べてみることにした。LuaRuby は問題ないようだけど、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.xsif_perlsfio.c というものがある。何だ何だ?どうやら if_perl.xs ファイルをテンプレートにして生成されるのがこの if_perl.c みたい。Don't Touch Me.

src/auto/configurePERL_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"」というオプションが付くんだね。

あ〜、なんだか昔に「MacOSXUNIXdarwin がなんとかかんとか」というのを見た記憶がある。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/lvyacc の代りに 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 でも問題なく使える。軽くていいわ、ほんと。