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もとりあえずビルド出来るようです。

まとめ

  • Mac OS X 10.5に搭載されているReadline Libraryは、GNU Readline Library(少なくとも5.2)と完全互換ではなさそうだ
  • Mac OS X 10.5では、GNU Readline Libraryをそのままビルド出来ない(と思う)
  • 今回はsupport/shobj-confにパッチを当て対処した

*1:ライセンスの関係でしょうか

*2:発売と共に購入したMac OS X 10.5でのヴァージョン

*3:後者のcase文は決して評価されないように思う