From: Nobuyoshi Nakada Date: 2009-04-10T15:17:05+09:00 Subject: [ruby-dev:38300] Re: MinGW における拡張ライブラリ作成と Ruby 1.8/1.9 共存について なかだです。 At Wed, 8 Apr 2009 12:40:09 +0900, Akinori MUSHA wrote in [ruby-dev:38290]: > > > 1. のために Ruby コンパイル時の configure に --program-suffix 引数をつけた場合、 > > > ライブラリのファイル名も変わってしまうため、 2. の条件が満たされません。 > > > > [ruby-dev:38255]も含めて、--program-suffixにライブラリ名やパス名 > > まで影響を受けるのは利点よりも面倒なことのほうが多い気がします。 > >  利点としては、同じprefix下に複数のバージョンをインストールできる > ということがあって、パッケージシステム等の都合上それは失いたくない > です。 --program-transform-nameではどうでしょうか。sedを完全にエミュレー トしたわけではありませんが、sとyコマンドは対応してみました。 >  パス名はわかりませんが、ライブラリ名は影響を受けてもよいのでは > ないでしょうか。少なくともsonameを指定するオプションは残してほしい > です。 --with-sonameとか? Index: Makefile.in =================================================================== --- Makefile.in (revision 23166) +++ Makefile.in (working copy) @@ -67,4 +67,5 @@ BUILTIN_TRANSSRCS = @BUILTIN_TRANSSRCS@ BUILTIN_TRANSOBJS = @BUILTIN_TRANSOBJS@ +RUBY_BASE_NAME=@RUBY_BASE_NAME@ RUBY_INSTALL_NAME=@RUBY_INSTALL_NAME@ RUBY_SO_NAME=@RUBY_SO_NAME@ Index: configure.in =================================================================== --- configure.in (revision 23166) +++ configure.in (working copy) @@ -114,4 +114,6 @@ fi RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"` RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"` +AC_SUBST(RUBY_BASE_NAME) +AC_SUBST(RUBYW_BASE_NAME) AC_CANONICAL_TARGET @@ -1926,5 +1928,8 @@ case "$target_os" in esac -RUBY_SO_NAME='$(RUBY_INSTALL_NAME)' +AC_ARG_WITH(soname, + AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]), + [RUBY_SO_NAME=$withval], [RUBY_SO_NAME='$(RUBY_BASE_NAME)']) + LIBRUBY_LDSHARED=$LDSHARED LIBRUBY_DLDFLAGS=$DLDFLAGS @@ -2014,5 +2019,5 @@ if test "$enable_shared" = 'yes'; then LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_* $(XLDFLAGS)' LIBRUBY_SO='lib$(RUBY_SO_NAME).dylib' - LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).$(MAJOR).$(MINOR).dylib lib$(RUBY_INSTALL_NAME).dylib' + LIBRUBY_ALIASES='lib$(RUBY_BASE_NAME).$(MAJOR).$(MINOR).dylib lib$(RUBY_INSTALL_NAME).dylib' ;; when(interix*) @@ -2104,14 +2109,15 @@ case "$target_os" in ;; when(cygwin*|mingw*) + RUBY_SO_NAME="${RUBY_SO_NAME}${MAJOR}${MINOR}${TEENY}" LIBRUBY_DLDFLAGS="${DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)' case "$target_os" in when(cygwin*) if test x"$enable_shared" = xyes; then - LIBRUBY_SO='cyg$(RUBY_SO_NAME)'${MAJOR}${MINOR}${TEENY}.dll + LIBRUBY_SO='cyg$(RUBY_SO_NAME)'.dll LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)' fi ;; when(mingw*) - RUBY_SO_NAME=${rb_cv_msvcrt}-'$(RUBY_INSTALL_NAME)'${MAJOR}${MINOR}${TEENY} + RUBY_SO_NAME="${rb_cv_msvcrt}-${RUBY_SO_NAME}" if test x"$enable_shared" = xyes; then LIBRUBY_SO='$(RUBY_SO_NAME)'.dll @@ -2269,12 +2275,18 @@ test "$program_suffix" != NONE && ri_suffix=$program_suffix -RUBY_INSTALL_NAME="${ri_prefix}${RUBY_BASE_NAME}${ri_suffix}" +RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}" case "$target_os" in when(cygwin*|mingw*) - RUBYW_INSTALL_NAME="${ri_prefix}${RUBYW_BASE_NAME}${ri_suffix}" - rubyw_install_name="$RUBYW_INSTALL_NAME" + RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}" + rubyw_install_name='$(RUBYW_INSTALL_NAME)' ;; esac -RUBY_LIB_PREFIX=`eval echo \\"${libdir}/${RUBY_INSTALL_NAME}\\"` + +rubylibprefix='${libdir}/${RUBY_BASE_NAME}' +AC_ARG_WITH(rubylibprefix, + AS_HELP_STRING([--with-rubylibprefix=DIR], [prefix for ruby libraries [[LIBDIR/RUBY_INSTALL_NAME]]]), + [rubylibprefix=$withval]) +RUBY_LIB_PREFIX=`eval echo \\"${rubylibprefix}\\"` +AC_SUBST(rubylibprefix) AC_ARG_WITH(ruby-version, @@ -2308,12 +2320,18 @@ AC_ARG_WITH(sitedir, AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]]]), [sitedir=$withval], - [sitedir='${libdir}/${RUBY_INSTALL_NAME}/site_ruby']) -SITE_DIR=`eval echo \\"${sitedir}\\"` + [sitedir='${rubylibprefix}/site_ruby']) +dir="${sitedir}" +until SITE_DIR=`eval echo \\"${dir}\\"`; test "${dir}" = "${SITE_DIR}"; do + dir="${SITE_DIR}" +done AC_ARG_WITH(vendordir, AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]]]), [vendordir=$withval], - [vendordir='${libdir}/${RUBY_INSTALL_NAME}/vendor_ruby']) -VENDOR_DIR=`eval echo \\"${vendordir}\\"` + [vendordir='${rubylibprefix}/vendor_ruby']) +dir="${vendordir}" +until VENDOR_DIR=`eval echo \\"${dir}\\"`; test "${dir}" = "${VENDOR_DIR}"; do + dir="${VENDOR_DIR}" +done if test "${LOAD_RELATIVE+set}"; then @@ -2417,7 +2435,7 @@ fi AC_ARG_WITH(rubyhdrdir, - AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_INSTALL_NAME/RUBY_VERSION]]]), + AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_BASE_NAME/RUBY_VERSION]]]), [rubyhdrdir=$withval], - [rubyhdrdir='${includedir}/${RUBY_INSTALL_NAME}-${ruby_version}']) + [rubyhdrdir='${includedir}/${RUBY_BASE_NAME}-${ruby_version}']) AC_ARG_WITH(sitehdrdir, @@ -2488,5 +2506,5 @@ AC_SUBST(BUILTIN_TRANSSRCS) AC_SUBST(BUILTIN_TRANSOBJS) -PACKAGE=$RUBY_INSTALL_NAME +PACKAGE=$RUBY_BASE_NAME AC_SUBST(PACKAGE) AC_MSG_RESULT($PACKAGE library version = $ruby_version) Index: lib/mkmf.rb =================================================================== --- lib/mkmf.rb (revision 23166) +++ lib/mkmf.rb (working copy) @@ -1451,4 +1451,5 @@ AR = #{CONFIG['AR']} EXEEXT = #{CONFIG['EXEEXT']} +RUBY_BASE_NAME = #{CONFIG['RUBY_BASE_NAME']} RUBY_INSTALL_NAME = #{CONFIG['RUBY_INSTALL_NAME']} RUBY_SO_NAME = #{CONFIG['RUBY_SO_NAME']} Index: win32/Makefile.sub =================================================================== --- win32/Makefile.sub (revision 23166) +++ win32/Makefile.sub (working copy) @@ -33,6 +33,9 @@ LIB = $(pathlist:;=/lib;) srcdir = .. !endif +!ifndef RUBY_BASE_NAME +RUBY_BASE_NAME = ruby +!endif !ifndef RUBY_INSTALL_NAME -RUBY_INSTALL_NAME = $(PROGRAM_PREFIX)ruby$(RUBY_SUFFIX) +RUBY_INSTALL_NAME = $(PROGRAM_PREFIX)$(RUBY_BASE_NAME)$(RUBY_SUFFIX) !endif !if !defined(RUBYW_INSTALL_NAME) || "$(RUBYW_INSTALL_NAME)" == "$(RUBY_INSTALL_NAME)" @@ -117,5 +120,5 @@ ruby_version = $(MAJOR).$(MINOR).$(TEENY !ifndef RUBY_SO_NAME -RUBY_SO_NAME = $(RT)-$(RUBY_INSTALL_NAME)$(MAJOR)$(MINOR)$(TEENY) +RUBY_SO_NAME = $(RT)-$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)$(TEENY) !endif !ifndef RUBY_PLATFORM @@ -530,5 +533,5 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/ #define DLEXT ".so" #define RUBY_LIB_VERSION_STYLE 3 /* full */ -#define RUBY_LIB_PREFIX "/lib/$(RUBY_INSTALL_NAME)" +#define RUBY_LIB_PREFIX "/lib/$(RUBY_BASE_NAME)" #define RUBY_LIB RUBY_LIB_PREFIX"/"RUBY_LIB_VERSION #define RUBY_SITE_LIB RUBY_LIB_PREFIX"/site_ruby" @@ -646,4 +649,5 @@ s,@RDOCTARGET@,,;t t s,@LIBRUBY_LDSHARED@,$(LIBRUBY_LDSHARED),;t t s,@LIBRUBY_DLDFLAGS@,$(LIBRUBY_DLDFLAGS),;t t +s,@RUBY_BASE_NAME@,$(RUBY_BASE_NAME),;t t s,@RUBY_INSTALL_NAME@,$(RUBY_INSTALL_NAME),;t t s,@rubyw_install_name@,$(RUBYW_INSTALL_NAME),;t t @@ -687,7 +691,8 @@ s,@arch@,$(ARCH)-$(PLATFORM),;t t s,@sitearch@,$(ARCH)-$(RT),;t t s,@ruby_version@,$(ruby_version),;t t -s,@sitedir@,$${prefix}/lib/$${RUBY_INSTALL_NAME}/site_ruby,;t t -s,@vendordir@,$${prefix}/lib/$${RUBY_INSTALL_NAME}/vendor_ruby,;t t -s,@rubyhdrdir@,$$(includedir)/$${RUBY_INSTALL_NAME}-$$(ruby_version),;t t +s,@rubylibprefix@,$${prefix}/lib/$${RUBY_BASE_NAME},;t t +s,@sitedir@,$${rubylibprefix}/site_ruby,;t t +s,@vendordir@,$${rubylibprefix}/vendor_ruby,;t t +s,@rubyhdrdir@,$$(includedir)/$${RUBY_BASE_NAME}-$$(ruby_version),;t t s,@sitehdrdir@,$$(rubyhdrdir)/site_ruby,;t t s,@vendorhdrdir@,$$(rubyhdrdir)/vendor_ruby,;t t -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦