Building the GNU Readline Library on Leopard
先日のエントリで軽く触れたTeX関連のビルドを終了したので、gnuplotのビルドに取りかかりました。しかし、makeはリンクエラーで終了しました。
> tar zxvf gnuplot-4.2.2.tar.gz > cd gnuplot-4.2.2 > ./configure > make : g++ -g -O2 -o gnuplot alloc.o axis.o breaders.o bitmap.o color.o command.o contour.o datafile.o dynarray.o eval.o fit.o gadgets.o getcolor.o graph3d.o graphics.o help.o hidden3d.o history.o internal.o interpol.o matrix.o misc.o mouse.o parse.o plot.o plot2d.o plot3d.o pm3d.o readline.o save.o scanner.o set.o show.o specfun.o standard.o stdfn.o tables.o term.o time.o unset.o util.o util3d.o variable.o version.o -lreadline -lncurses -lz Undefined symbols: "_rl_forced_update_display", referenced from: _restore_prompt in command.o "_rl_ding", referenced from: _alert in mouse.o "_history_list", referenced from: _write_history_list in history.o "_rl_complete_with_tilde_expansion", referenced from: _rl_complete_with_tilde_expansion$non_lazy_ptr in plot.o ld: symbol(s) not found collect2: ld returned 1 exit status make[3]: *** [gnuplot] Error 1 make[2]: *** [all-recursive] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2
リンクエラーが出ている関数群は、GNU Readline Library特有のもののようです。どうやら、Mac OS X 10.5のReadline LibraryはGNU Readline Libraryと完全互換ではないようです*1。
折角ですので、GNU Readline Libraryのビルドを試みたのですが、こちらもリンクエラーで終了してしまいました。
> tar zxvf readline-5.2.tar.gz > cd readline-5.2 > ./configure --disable-static > make : rm -f libreadline.5.2.dylib gcc -dynamic -arch_only `/usr/bin/arch` -install_name /usr/local/lib/libreadline.5.2.dylib -current_version 5.2 -compatibility_version 5 -v -o libreadline.5.2.dylib readline.so vi_mode.so funmap.so keymaps.so parens.so search.so rltty.so complete.so bind.so isearch.so display.so signals.so util.so kill.so undo.so macro.so input.so callback.so terminal.so text.so nls.so misc.so xmalloc.so history.so histexpand.so histfile.so histsearch.so shell.so mbutil.so tilde.so compat.so -lncurses Using built-in specs. Target: i686-apple-darwin9 Configured with: /var/tmp/gcc/gcc-5465~16/src/configure --disable-checking -enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.0/ --with-gxx-include-dir=/include/c++/4.0.0 --with-slibdir=/usr/lib --build=i686-apple-darwin9 --with-arch=apple --with-tune=generic --host=i686-apple-darwin9 --target=i686-apple-darwin9 Thread model: posix gcc version 4.0.1 (Apple Inc. build 5465) i686-apple-darwin9-gcc-4.0.1: -compatibility_version only allowed with -dynamiclib make[1]: *** [libreadline.5.2.dylib] Error 1 make: [shared] Error 2 (ignored)
Mac OS X 10.5のDarwinのヴァージョンは9.0.0です*2。そのため、configureする際に用いられるsupport/shobj-confに渡されるhost_osの値はdarwin9.0.0となります。しかし、このヴァージョンのGNU Readline Libraryに含まれているsupport/shobj-confは、darwin8.x.xまでを想定した記述でした。
support/shobj-conf: : # Darwin/MacOS X darwin8*) SHOBJ_STATUS=supported SHLIB_STATUS=supported SHOBJ_CFLAGS='-fno-common' SHOBJ_LD='MACOSX_DEPLOYMENT_TARGET=10.3 ${CC}' SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' SHLIB_LIBSUFF='dylib' SHOBJ_LDFLAGS='-undefined dynamic_lookup' SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 ;; darwin*|macosx*) SHOBJ_STATUS=unsupported SHLIB_STATUS=supported SHOBJ_CFLAGS='-fno-common' SHOBJ_LD='${CC}' SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' SHLIB_LIBSUFF='dylib' case "${host_os}" in darwin[78]*) SHOBJ_LDFLAGS='' SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' ;; *) SHOBJ_LDFLAGS='-dynamic' SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' ;; esac SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 ;; :
今回は、とりあえずの対処として、support/shobj-confに以下のようなパッチを当て、再ビルドしました。
> diff -u support/shobj-conf{.orig,} --- support/shobj-conf.orig 2006-04-11 06:15:43.000000000 -0700 +++ support/shobj-conf 2007-11-08 01:15:43.000000000 -0800 @@ -171,7 +171,7 @@ SHLIB_LIBSUFF='dylib' case "${host_os}" in - darwin[78]*) SHOBJ_LDFLAGS='' + darwin[789]*) SHOBJ_LDFLAGS='' SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' ;; *) SHOBJ_LDFLAGS='-dynamic'
何故Darwin 8.x.xに関するコードが2カ所に分かれて記述されているか*3、SHOBJ_STATUSの値がどのようにライブラリに影響するか等は追いかけていませんが、この方法でビルドすれば、GNU Readline Libraryを含んだgnuplotもとりあえずビルド出来るようです。