試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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系)
  • mfiler2Rubyのライブラリを使用しているため、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を要求するようになったが、GentooRubyは、その後バージョン1.8.6_p286から(古い)鬼車を含まなくなっている(「USE=cjk」も無くなった)ため、これが原因でトラブルになることはなくなっている。

*1:それ自体はどちらも符号なしchar型

*2:IUSEから「cjk」が除外されている。詳しくは/usr/portage/dev-lang/ruby/ruby-1.8.6-r1.ebuildを参照

*3:単独版鬼車を入れてある状態で、isearch.cppに「#include "/usr/include/oniguruma.h"」と書くとビルドエラーにならないことも裏付けとなった