mfiler2のebuildの更新とRubyと鬼車
Rubyのバージョンを1.8.6-r1から下げたところ、mfiler2のビルドが不明な理由によりエラーが出るようになってしまった。上のバージョンに上げてもダメだった。
x86_64-pc-linux-gnu-gcc -c isearch.cpp -I . -L/usr/local/lib -g -I /usr/lib64/ruby/1.8/x86_64-linux -DDATADIR=\"/usr/share\" isearch.cpp: In function 'bool match_back(int)': isearch.cpp:91: error: expected initializer before '*' token isearch.cpp:92: error: 'p' was not declared in this scope isearch.cpp:100: error: 'p' was not declared in this scope isearch.cpp:103: error: 'p' was not declared in this scope isearch.cpp:106: error: 'p' was not declared in this scope isearch.cpp:109: error: 'p' was not declared in this scope isearch.cpp:145: error: 'OnigUChar' was not declared in this scope isearch.cpp:145: error: 'str2' was not declared in this scope isearch.cpp:145: error: expected primary-expression before ')' token isearch.cpp:145: error: expected `;' before 'file' isearch.cpp: In function 'bool match_next(int)': (同様の流れが繰り返されるため、中略) make: *** [bin/isearch.o] Error 1
色々調べてみたところ、以下のことが判明。
- 鬼車ライブラリは、USE=cjkを使うことでRubyの中に含めることができるが、単独で配布されているものより古い(バージョン2系)
- mfiler2はRubyのライブラリを使用しているため、RubyがUSE=cjkでビルドされていれば単独配布の鬼車を使用する必要はない。しかし、OnigUChar型が無い代わりにUChar型になっている*1など、違いがある
- USE=cjkが指定されていても、例外的に組み込みの鬼車が無効になっていたバージョンのRuby 1.8.6-r1*2を使用し、かつ、単独版の鬼車を入れていた状態だったため、これまでは、たまたまビルドが通っていたのが、Rubyのバージョンが変わったことにより、Rubyに組み込まれた/usr/lib/ruby/1.8/x86_64-linux/oniguruma.hを参照することになり、ビルドエラーとなったと考えられる*3
Ruby組み込みの鬼車を使用して、isearch.cpp内の「OnigUChar」を「UChar」に置換すると、
isearch.cpp: In function 'bool match_back(int)': isearch.cpp:100: error: invalid conversion from 'const UChar*' to 'UChar*' isearch.cpp:100: error: initializing argument 2 of 'int onig_new(regex_t**, UChar*, UChar*, OnigOptionType, OnigEncodingType*, OnigSyntaxType*, OnigErrorInfo*)'
のようになってしまう。変数のconstを外すとビルドが通るようだが、これは、ヘッダファイルにおける以下の違いからも分かる(2.5.7ではconst無し)。
2.5.7(Ruby組み込み) int onig_new P_((regex_t**, UChar* pattern, UChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); 5.9.0(単独配布・最新版) int onig_new P_((OnigRegex*, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));
「UChar」が「OnigUChar」に変わった理由は、他のパッケージと重なることがあって問題になったかららしい。
以上を踏まえた上で、修正したebuildを書き直した。使用するパッチに関しては、前回(r1)のものと同じ。
ファイル名: mfiler2-3.1.7-r2.ebuild
# Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ inherit ruby autotools DESCRIPTION="a two pane file manager under UNIX console." HOMEPAGE="http://www.geocities.jp/daisuke530221jp/" SRC_URI="http://www.geocities.jp/daisuke530221jp/${P}.tgz" LICENSE="GPL-2" SLOT="0" KEYWORDS="~amd64 ~x86" IUSE="migemo onig gtk" RESTRICT="strip" RDEPEND="virtual/libiconv >=sys-libs/ncurses-5 >=dev-lang/ruby-1.8 >=dev-ruby/needle-1.3.0 >=dev-ruby/net-sftp-1.1.0 >=dev-ruby/net-ssh-1.0.10 migemo? ( >=app-text/cmigemo-1.3 onig? ( >=dev-libs/oniguruma-4.6.1 ) ) gtk? ( >=dev-ruby/ruby-gtk2-0.15.0 )" DEPEND="${RDEPEND} >=sys-devel/libtool-1.5" RUBY_ECONF="--with-ruby-header-path=$($RUBY -r rbconfig -e 'print Config::CONFIG["archdir"]') \ --with-ruby-lib-name=$($RUBY -r rbconfig -e 'print Config::CONFIG["RUBY_SO_NAME"]')" EXTRA_ECONF="$(use_enable migemo) ${RUBY_ECONF}" pkg_setup() { if use migemo && ! use onig; then if has_version "=dev-lang/ruby-1.8.6-r1"; then # ruby-1.8.6-r1 lacks "cjk" USE flag eerror eerror "C/Migemo support requires oniguruma library" eerror "You need to enable \"onig\" use flag" eerror " or install other version of Ruby with USE=cjk enabled" eerror die "Please enable \"onig\" use flag or install other version of Ruby with USE=cjk" elif ! built_with_use dev-lang/ruby cjk; then eerror eerror "C/Migemo support requires oniguruma library" eerror "You need to enable \"onig\" use flag" eerror " or rebuild dev-lang/ruby with USE=cjk enabled" eerror die "Please enable \"onig\" use flag or rebuild dev-lang/ruby with USE=cjk" fi fi } src_unpack() { unpack ${A} cd "${S}" epatch ${FILESDIR}/${P}-gentoo.patch epatch ${FILESDIR}/${P}-string_h.patch epatch ${FILESDIR}/${P}-migemo_detect.patch # Ruby/Oniguruma(2.x) if use migemo && ! use onig; then sed -i -e 's/ONIG=-lonig/ONIG=/' Makefile.in sed -i -e 's/const \(OnigUChar\)/\1/g' -e 's/OnigUChar/UChar/g' isearch.cpp fi eautoconf } src_compile() { export CC="$(tc-getCC) ${CFLAGS}" CXX="$(tc-getCXX) ${CXXFLAGS}" econf --sysconfdir=/etc/mfiler2 || die "econf failed" emake || die "emake failed" } src_install() { einstall sysconfdir="${D}"/etc/mfiler2 || die "einstall failed" dodoc README README.utf8.jp dohtml *.html }
ファイル名: mfiler2-3.1.7-gentoo.patch (以前と同一の内容)
diff -ur mfiler2-3.1.7.orig/Makefile.in mfiler2-3.1.7/Makefile.in --- mfiler2-3.1.7.orig/Makefile.in +++ mfiler2-3.1.7/Makefile.in @@ -24,8 +24,8 @@ RUBYINCPATH=@RUBYINCPATH@ RUBYLIBPATH=@RUBYLIBPATH@ -ONIG=onig-4.6.1/.libs/libonig.a -ONIGINC=-I onig-4.6.1 +ONIG=-lonig +ONIGINC= MIGEMO=@MIGEMO@ MIGEMOINC=-I /usr/local/include @@ -80,8 +80,6 @@ minato_lib/minato_lib.a: cd minato_lib && ./configure --with-ruby-header-path="$(RUBYINCPATH)" $(DEBUG_CONFIGURE) && make -$(ONIG): - cd onig-4.6.1 && ./configure && make ############################################################################### @@ -183,9 +181,6 @@ # インストール ############################################################################### install: $(STRIP) - cd net-ssh-1.0.10 && $(RUBY) setup.rb config && $(RUBY) setup.rb setup && $(RUBY) setup.rb install - cd needle-1.3.0 && $(RUBY) setup.rb config && $(RUBY) setup.rb setup && $(RUBY) setup.rb install - cd net-sftp-1.1.0 && $(RUBY) setup.rb config && $(RUBY) setup.rb setup && $(RUBY) setup.rb install mkdir -p $(bindir) mkdir -p $(sysconfdir) mkdir -p $(datadir)/mfiler/cp932 diff -ur mfiler2-3.1.7.orig/etc/api.rb mfiler2-3.1.7/etc/api.rb --- mfiler2-3.1.7.orig/etc/api.rb +++ mfiler2-3.1.7/etc/api.rb @@ -1,3 +1,4 @@ +require 'rubygems' require 'etc' require 'fileutils'
ファイル名: mfiler2-3.1.7-string_h.patch (以前と同一の内容)
diff -ur mfiler2-3.1.7.orig/minato_lib/minato_extra.c mfiler2-3.1.7/minato_lib/minato_extra.c --- mfiler2-3.1.7.orig/minato_lib/minato_extra.c +++ mfiler2-3.1.7/minato_lib/minato_extra.c @@ -5,6 +5,7 @@ #include <sys/types.h> #include <pwd.h> #include <grp.h> +#include <string.h> //////////////////////////////////////////////////////////////////////////////// // 拡張子名を返す diff -ur mfiler2-3.1.7.orig/minato_lib/minato_hash.c mfiler2-3.1.7/minato_lib/minato_hash.c --- mfiler2-3.1.7.orig/minato_lib/minato_hash.c +++ mfiler2-3.1.7/minato_lib/minato_hash.c @@ -2,6 +2,7 @@ #include "minato_hash.h" #include "minato_debug.h" #include <stdio.h> +#include <string.h> //////////////////////////////////////////////////////////////////////////////// // 内部関数 diff -ur mfiler2-3.1.7.orig/minato_lib/minato_string.c mfiler2-3.1.7/minato_lib/minato_string.c --- mfiler2-3.1.7.orig/minato_lib/minato_string.c +++ mfiler2-3.1.7/minato_lib/minato_string.c @@ -1,3 +1,4 @@ +#include <string.h> #include "config.h" #include "minato_string.h" #include "minato_debug.h" diff -ur mfiler2-3.1.7.orig/minato_lib/minato_vector.c mfiler2-3.1.7/minato_lib/minato_vector.c --- mfiler2-3.1.7.orig/minato_lib/minato_vector.c +++ mfiler2-3.1.7/minato_lib/minato_vector.c @@ -2,6 +2,7 @@ #include "minato_vector.h" #include "minato_debug.h" #include <stdlib.h> +#include <string.h> //////////////////////////////////////////////////////////////////////////////// // 初期化
ファイル名: mfiler2-3.1.7-migemo_detect.patch (以前と同一の内容)
diff -ur mfiler2-3.1.7.orig/configure.in mfiler2-3.1.7/configure.in --- mfiler2-3.1.7.orig/configure.in +++ mfiler2-3.1.7/configure.in @@ -125,20 +125,32 @@ ############################################################################### # migemo ############################################################################### -AC_MSG_CHECKING(HaveMigemo) -if test -e "/usr/local/lib/libmigemo.so" || test -e "/usr/local/lib/libmigemo.dll.a" || test -e "/usr/local/lib/libmigemo.dylib"; then - echo "yes" - AC_DEFINE(HAVE_MIGEMO, 1) - MIGEMO="-L/usr/local/lib -lmigemo" - AC_SUBST(MIGEMO) -elif test -e "/usr/lib/libmigemo.so" || test -e "/usr/lib/libmigemo.dll.a" || test -e "/usr/lib/libmigemo.dylib"; then - echo "yes" - AC_DEFINE(HAVE_MIGEMO, 1) - MIGEMO="-lmigemo" - AC_SUBST(MIGEMO) -else - echo "no" +AC_ARG_ENABLE(migemo, +[ --enable-migemo enable Japanese incremental search (C/Migemo) ], +[if test "${enableval}" = "yes"; then +AC_MSG_CHECKING([for cmigemo >= 1.3]) +AC_RUN_IFELSE([ +AC_LANG_PROGRAM([ +#include <stdlib.h> +#include <migemo.h> +],[ + double ver = atof (MIGEMO_VERSION); + if (ver >= 1.3) + return EXIT_SUCCESS; + else + return EXIT_FAILURE; +])], +[ + MIGEMO="-lmigemo -L$(dirname $(which cmigemo))/../lib" + AC_DEFINE(HAVE_MIGEMO, 1) + AC_SUBST(MIGEMO) + AC_MSG_RESULT([yes]) +], +[ + AC_MSG_RESULT([no]) +]) fi +]) ############################################################################### # ruby
今回は、鬼車ライブラリについて、単独版とRuby組み込み版とを選択できるようにし、「onig」USEフラグを有効にすると、単独版のほう(dev-libs/oniguruma)を使用し、「USE=-onig」では、その代わりに、RubyをUSE=cjkでビルドしたときの組み込み版鬼車を使用、いずれも無い場合(Rubyのバージョンが1.8.6-r1の場合も含む)はエラーとするようにした。
Ruby組み込みの鬼車を使用すると、機能的には同じで、実行時に動的リンクするライブラリを1つ減らすことができる。
(単独版鬼車使用時) $ ldd /usr/bin/mfiler2 libonig.so.2 => /usr/lib/libonig.so.2 (0x00002b9f4d261000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x00002b9f4d4c8000) libncurses.so.5 => /lib/libncurses.so.5 (0x00002b9f4d6fc000) libmigemo.so.1 => /usr/lib/libmigemo.so.1 (0x00002b9f4d95a000) libruby18.so.1.8 => /usr/lib/libruby18.so.1.8 (0x00002b9f4db61000) libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/libstdc++.so.6 (0x00002b9f4de4f000) libm.so.6 => /lib/libm.so.6 (0x00002b9f4e153000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00002b9f4e3a9000) libc.so.6 => /lib/libc.so.6 (0x00002b9f4e5b7000) libdl.so.2 => /lib/libdl.so.2 (0x00002b9f4e8f4000) libpthread.so.0 => /lib/libpthread.so.0 (0x00002b9f4eaf8000) /lib64/ld-linux-x86-64.so.2 (0x00002b9f4d044000) (Ruby組み込み版鬼車使用時) $ ldd /usr/bin/mfiler2 libcrypt.so.1 => /lib/libcrypt.so.1 (0x00002ab1ca282000) libncurses.so.5 => /lib/libncurses.so.5 (0x00002ab1ca4b6000) libmigemo.so.1 => /usr/lib/libmigemo.so.1 (0x00002ab1ca713000) libruby18.so.1.8 => /usr/lib/libruby18.so.1.8 (0x00002ab1ca91b000) libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/libstdc++.so.6 (0x00002ab1cac17000) libm.so.6 => /lib/libm.so.6 (0x00002ab1caf1a000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00002ab1cb171000) libc.so.6 => /lib/libc.so.6 (0x00002ab1cb37f000) libdl.so.2 => /lib/libdl.so.2 (0x00002ab1cb6bb000) libpthread.so.0 => /lib/libpthread.so.0 (0x00002ab1cb8c0000) /lib64/ld-linux-x86-64.so.2 (0x00002ab1ca065000)
(2008/10/16)mfiler3ははじめRubyを使用せず、途中から再びRubyを要求するようになったが、GentooのRubyは、その後バージョン1.8.6_p286から(古い)鬼車を含まなくなっている(「USE=cjk」も無くなった)ため、これが原因でトラブルになることはなくなっている。