Ubuntu 14.04 で vim パッケージをリビルドする

Ubuntu 14.04 で vim をインストールすると python3 インターフェースが無効になっています。python3 インターフェースを有効にするために deb パッケージをリビルドしてみます。vim拡張機能をチェックするには以下のようにバージョンを表示します。

$ vim --version  # vim.gtk を使ってます
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan  2 2014 19:39:59)
適用済パッチ: 1-52
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Huge 版 with GTK2 GUI.  機能の一覧 有効(+)/無効(-)
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
+balloon_eval    +float           +mouse_urxvt     -tag_any_white
+browse          +folding         +mouse_xterm     +tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+cindent         +gettext         -mzscheme        +textobjects
+clientserver    -hangul_input    +netbeans_intg   +title
+clipboard       +iconv           +path_extra      +toolbar
+cmdline_compl   +insert_expand   +perl            +user_commands
+cmdline_hist    +jumplist        +persistent_undo +vertsplit
+cmdline_info    +keymap          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
...

自分で vim のソースをダウンロードしてきてビルドする方法もありますが、なるべくディストリビューションのもの (と同じ設定) を使いたいと思う人もいるでしょう。ここでは deb パッケージをリビルドすることで python3 インターフェースを有効にしてみます。

前準備

まずビルドに必要な依存パッケージをまとめてインストールします。私の環境では以下のパッケージを追加するとビルドできましたが、これはそれぞれの環境によって違うかもしれません。

$ sudo apt-get build-dep vim  # vim のビルドに必要な依存パッケージをインストール
$ sudo apt-get install python3-dev ruby-dev tcl8.5-dev  # vim の拡張機能のビルドに必要な依存パッケージをインストール
$ sudo apt-get install devscripts  # deb パッケージのビルドツールをインストール

次にソースをダウンロードします。

$ mkdir /tmp/vim-build
$ cd /tmp/vim-build/
$ apt-get source vim
$ ls
vim-7.4.052  vim_7.4.052-1ubuntu3.debian.tar.gz  vim_7.4.052-1ubuntu3.dsc  vim_7.4.052.orig.tar.gz
$ cd vim-7.4.052
  • vim の configure オプションを調べる
$ ./configure --help
ビルド

バージョン番号もここで指定したものに置き換えられるようです。ディストリビューション名やメールアドレスなど、適切な内容を changelog に書かないとビルド時にエラーになります。

$ debchange -i
vim (2:7.4.052-1ubuntu4) trusty; urgency=medium
                                                                               
  * enabled python3 interface.
                                                                               
 -- t2y <email>  Sat, 26 Apr 2014 18:43:45 +0900
  • rules ファイルの編集

python3 インターフェースを有効にするための configure オプションを追加します。また vim-nox のテスト中にエラーになったのでここではビルド後にテストを実行しないように編集しています。

$ vim debian/rules
--- orig-vim-7.4.052/debian/rules	2014-04-26 15:42:19.264743944 +0900
+++ vim-7.4.052/debian/rules	2014-04-26 16:42:47.818878711 +0900
@@ -27,11 +27,11 @@
 BUILDER := $(shell echo $${DEBEMAIL:-$${EMAIL:-$$(echo $$LOGNAME@$$(cat /etc/mailname 2> /dev/null))}})
 
 MAKETEST := no
-ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
-  ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
-    MAKETEST := yes
-  endif
-endif
+#ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
+#  ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+#    MAKETEST := yes
+#  endif
+#endif
 
 ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
     NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
@@ -108,7 +108,7 @@
 ALLINTERPFLAGS+=--disable-mzschemeinterp
 ALLINTERPFLAGS+=--enable-perlinterp
 ALLINTERPFLAGS+=--enable-pythoninterp --with-python-config-dir=$(shell python-config --configdir)
-ALLINTERPFLAGS+=--disable-python3interp
+ALLINTERPFLAGS+=--enable-python3interp --with-python3-config-dir=$(shell python3-config --configdir)
 ALLINTERPFLAGS+=--enable-rubyinterp
 ALLINTERPFLAGS+=--enable-tclinterp
  • ビルド
$ debuild -us -uc
$ ls ../  # 親ディレクトリにパッケージが作成される

インストール

必要なパッケージをインストールします。私は vim-gtk を使っています。

$ cd ../
$ sudo dpkg -i vim_7.4.052-1ubuntu4_amd64.deb \
               vim-common_7.4.052-1ubuntu4_amd64.deb \
               vim-doc_7.4.052-1ubuntu4_all.deb \
               vim-runtime_7.4.052-1ubuntu4_all.deb \
               vim-tiny_7.4.052-1ubuntu4_amd64.deb \
               vim-gui-common_7.4.052-1ubuntu4_all.deb \
               vim-gtk_7.4.052-1ubuntu4_amd64.deb 

$ dpkg -l | grep vim
ii  vim               2:7.4.052-1ubuntu4     amd64     Vi IMproved - enhanced vi editor
ii  vim-common        2:7.4.052-1ubuntu4     amd64     Vi IMproved - Common files
ii  vim-doc           2:7.4.052-1ubuntu4     all       Vi IMproved - HTML documentation
ii  vim-gtk           2:7.4.052-1ubuntu4     amd64     Vi IMproved - enhanced vi editor - with GTK2 GUI
ii  vim-gui-common    2:7.4.052-1ubuntu4     all       Vi IMproved - Common GUI files
ii  vim-runtime       2:7.4.052-1ubuntu4     all       Vi IMproved - Runtime files
ii  vim-tiny          2:7.4.052-1ubuntu4     amd64     Vi IMproved - enhanced vi editor - compact version

オリジナルの vim --version の出力と比べると python3 インターフェースが有効になっているのが分かります。

$ diff -u orig-vim.gtk-version.txt <(vim --version)
--- orig-vim.gtk-version.txt	2014-04-26 15:48:29.234466537 +0900
+++ /dev/fd/63	2014-04-26 17:12:13.006045318 +0900
@@ -1,7 +1,7 @@
-VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan  2 2014 19:39:59)
+VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 26 2014 16:45:41)
 適用済パッチ: 1-52
 Modified by pkg-vim-maintainers@lists.alioth.debian.org
-Compiled by buildd@
+Compiled by t2y@...
 Huge 版 with GTK2 GUI.  機能の一覧 有効(+)/無効(-)
 +acl             +farsi           +mouse_netterm   +syntax
 +arabic          +file_in_path    +mouse_sgr       +tag_binary
@@ -18,8 +18,8 @@
 +cmdline_info    +keymap          +postscript      +virtualedit
 +comments        +langmap         +printer         +visual
 +conceal         +libcall         +profile         +visualextra
-+cryptv          +linebreak       +python          +viminfo
-+cscope          +lispindent      -python3         +vreplace
++cryptv          +linebreak       +python/dyn      +viminfo
++cscope          +lispindent      +python3/dyn     +vreplace
 +cursorbind      +listcmds        +quickfix        +wildignore
 +cursorshape     +localmap        +reltime         +wildmenu
 +dialog_con_gui  +lua             +rightleft       +windows

python/dyn, python3/dyn に変わってしまいました。vim のドキュメントによると、Windows だと DLL を探すように書いてあります。Linux だと関係ないのかな?これでも Python 拡張が動いたので気にしないことにします。

$ vim
:help python-dynamic
----
9. Dynamic loading                                      python-dynamic         
                                                                               
On MS-Windows the Python library can be loaded dynamically.  The :version      
output then includes +python/dyn.                                              
                                                                               
This means that Vim will search for the Python DLL file only when needed.      
When you don't use the Python interface you don't need it, thus you can use    
Vim without this DLL file.

Oracle 11g XE を Ubuntu 11.10 にインストールする

最近リリースされたばかりの Ubuntu 11.10 に Oracle 11g XE をインストールしようとしたら少しはまったので原因と対策を簡単にまとめておきます。

Emerge Technology: Oracle 11g XEをUbuntuにインストール の手順通りでほぼできますが、最後の configure スクリプトを実行したとき、データベース設定に失敗します。

$ sudo /etc/init.d/oracle-xe configure
...
Starting Oracle Net Listener...Done
Configuring database...
Database Configuration failed.  Look into /u01/app/oracle/product/11.2.0/xe/config/log for details

これからインストールする人にとって、分かりやすいように、ここでは最初からの手順を記載しておきます。

Oracle 11g XE のダウンロードと展開

Oracle Database Express Edition 11g Release 2のダウンロード からダウンロードします。ダウンロードするには、ユーザー登録が必要なようです。会社名等も登録の必須項目なので少し面倒です。

インストールに必要なパッケージ群をインストールします。

$ sudo aptitude install alien libaio1 unixodbc

ダウンロードした Oracle 11g XE は RPM パッケージなので deb パッケージに変換します。

$ ls oracle-xe-11.2.0-1.0.x86_64.rpm.zip 
oracle-xe-11.2.0-1.0.x86_64.rpm.zip
$ unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip 
Archive:  oracle-xe-11.2.0-1.0.x86_64.rpm.zip
   creating: Disk1/
   creating: Disk1/upgrade/
  inflating: Disk1/upgrade/gen_inst.sql  
   creating: Disk1/response/
  inflating: Disk1/response/xe.rsp   
  inflating: Disk1/oracle-xe-11.2.0-1.0.x86_64.rpm    
$ cd Disk1/
$ sudo alien --to-deb --scripts oracle-xe-11.2.0-1.0.x86_64.rpm 
oracle-xe_11.2.0-2_amd64.deb generated

おそらく RPM パッケージがベースになっているために chkconfig コマンドを作ってあげないといけないようです。この辺は面倒なのでそのまま従っておきましょう。

元記事はシェバングが /sbin/bash になっていますが /bin/bash の間違い?
$ sudo vi /sbin/chkconfig
#!/bin/bash
# Oracle 11gR2 XE installer chkconfig hack for Debian by Dude
file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
   echo >> $file
   echo '### BEGIN INIT INFO' >> $file
   echo '# Provides:             OracleXE' >> $file
   echo '# Required-Start:       $remote_fs $syslog' >> $file
   echo '# Required-Stop:        $remote_fs $syslog' >> $file
   echo '# Default-Start:        2 3 4 5' >> $file
   echo '# Default-Stop:         0 1 6' >> $file
   echo '# Short-Description:    Oracle 11g Express Edition' >> $file
   echo '### END INIT INFO' >> $file
fi
update-rc.d oracle-xe defaults 80 01
$ sudo chmod 755 /sbin/chkconfig 

awk のシンボリックリンクも作成しておきます
$ sudo ln -s /usr/bin/awk /bin/awk

これで準備は整いました。deb パッケージをインストールします。

$ sudo dpkg --install ./oracle-xe_11.2.0-2_amd64.deb 

インストールできましたね。最後の configure スクリプトです。

$ sudo /etc/init.d/oracle-xe configure
...
Starting Oracle Net Listener...Done
Configuring database...
Database Configuration failed.  Look into /u01/app/oracle/product/11.2.0/xe/config/log for details

何か失敗してしまいました (> <)

configure スクリプトの原因調査

Cannot Install Oracle 11gR2 Express Edition on Ubuntu Linux 11.04 (64-bit) Howto によると、以下のログを調べろと言ってるので調べてみます。

$ sudo cat /u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log 
Mon Oct 17 20:54:11 2011
Starting ORACLE instance (normal)
WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires 
the /dev/shm file system to be mounted for at least 419430400 bytes.
/dev/shm is either not mounted or is mounted with available space less than this size.
Please fix this so that MEMORY_TARGET can work as expected. Current available is 0 and
used is 0 bytes. Ensure that the mount point is /dev/shm for this directory.
memory_target needs larger /dev/shm

memory_target とか /dev/shm が悪さをしてそうだと分かります。

ubuntu 11.10 ORA-00845: MEMORY_TARGET not supported on this system によると、Ubuntu 11.10 から /dev/shm が /run/shm へ移行されたことが原因のようだと分かります *1

$ ls -l /dev/shm
lrwxrwxrwx 1 root root 8 2011-10-17 20:44 /dev/shm -> /run/shm

/dev/shm は /run/shm のシンボリックリンクになっていますが、configure スクリプトはこの状態だとうまく動作しないようです。フォーラムのやり取りの中で memory_target のパラメーターを削除して、pga_aggregate_target と sga_target を追加しなさいとあります。

以下の2つのファイルに同じ設定をする必要があるようです。メモリのサイズは適当なので、環境に応じて適切な値を設定してください *2

$ sudo vi /u01/app/oracle/product/11.2.0/xe/config/scripts/init.ora
$ sudo vi /u01/app/oracle/product/11.2.0/xe/config/scripts/initXETemp.ora 

#memory_target=418381824
pga_aggregate_target=200540160
sga_target=601620480

先ほどの configure スクリプトの実行で Listener は起動しているので kill しておきます。

$ ps ax|grep oracle
15318 ?        Ssl    0:00 /u01/app/oracle/product/11.2.0/xe/bin/tnslsnr LISTENER -inherit
$ sudo kill 15318

再度、configure スクリプトを実行します。

$ sudo /etc/init.d/oracle-xe configure
...
Configuring database...Done
Starting Oracle Database 11g Express Edition instance...Done
Installation completed successfully.

今度は成功しましたね!sqlplus でも接続してみましょう o(^ ^)o

$ source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
$ sqlplus system/oracle
SQL*Plus: Release 11.2.0.2.0 Production on 月 1017 21:57:17 2011
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> 

2011/10/26 追記

Ubuntu 11.04 にインストールしたのを 11.10 にアップグレードしたときの解決方法のようです。
Emerge Technology: Ubuntu 11.04に入れたOracle XE 11gを11.10で動かす方法