[2020/08/17追記]
本家が対応したみたいなので、以下のパッチをあてなくてもよくなりました。めでたしめでたし。
[2020/02/08追記][2020/03/25パッチ適用方法一部修正]
割と前から追記しようと思ってましたが、忙しくて今更ながらになっちゃいました(というか2019/12/15に雑に追記してはいたのですが)。
vimをリポジトリからpullしてビルドして最新版を使う人なんてレアかとは思いますが、ココを見てくださったり、ストックしてくださってる方もぼちぼちおられるようなので、いま私が運用している範囲での記事更新はしておきたいと思いました。
深く追ってないのですがmacOS10.15ぐらいから、Tcl.frameorkのパス変更により、従来のconfigureのオプションをいじくってもどうにもならない感じだったので、試行錯誤の結果、最終的にconfigure.acに手を入れてOS X FrameworksのTcl.frameworkを使用するように変更してことなきを得た感じです。たしかMacPortsなどのサードパーティでインストールしたtclのヘッダファイルも、configureオプションだけではどうにもならずお手上げだった記憶があります。あとLuaJITについてはうまくいかなくなったので諦めてたりします…。
configure.acのpatchはこちらを参考にしてみてください。なお、configure.acからconfigureを生成するのにautoconfが必要です。MacPortsやHomebrewなどで事前にインストールしておいてください。
https://gist.github.com/zurazurataicho/26fe48028c7ca0042d32ed5f27218858
パッチの適用方法は、以下の通りです。ここでは、/opt/local/src/vimディレクトリがvimリポジトリのルートとしています。
configure.ac.patchは事前にcurlやwgetなどでvimルートのsrcディレクトリ内に保存しておきます(たぶん別ディレクトリでも大丈夫だと思いますが、リダイレクト元に注意)。
cd /opt/local/src/vim
git checkout .
git pull
cd src
patch -p1 < ./configure.ac.patch
autoconf
cd ..
# 「はじめに」以下に書いてある手順を参考に./configure && makeしてください
ただし、本家側でconfigure.acに修正が入った場合は、上記パッチをそのまま適用するのは難しいので、patchがあたらない場合は適宜調整してみてください(src/configure.acファイルはあまり変更修正がないのですが、ときどきtypo修正とかがはいったりすることもあるようです)。
一応、いま私が実行しているconfigure && makeを書いておきます。
MBP2019を(とうとう)買ってしまい、新たにvimをビルドするにあたって調整したものです。すでにOSに付属している言語系はサードパーティーからのインストールはしていません(10.15以前だと、Python3は入ってなかったかもしれないので注意)。--with-luajitは外しています(とりあえず諦めた)。
make distclean clean && ./configure \
--prefix=/opt/local \
--enable-multibyte \
--enable-nls \
--enable-perlinterp -with-perl-command=/usr/bin/perl \
--enable-pythoninterp --with-python-command=/usr/bin/python \
--enable-python3interp --with-python3-command=/usr/bin/python3 \
--enable-rubyinterp --with-ruby-command=/usr/bin/ruby \
--enable-luainterp --with-lua-prefix=/opt/local \
--enable-tclinterp --with-tclsh=/usr/bin/tclsh \
--enable-cscope \
--enable-fail-if-missing=yes \
--with-features=huge \
--without-x \
--disable-xim \
--disable-gui \
--disable-sysmouse \
--disable-netbeans \
--disable-xsmp \
CC=/usr/bin/clang \
CFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" && make
はじめに
私はmacOSを日々使用していますが、宗教上の理由から(うそ)、Homebrew(brew)を使っていません。
FreeBSD育ちということもあり、基本的にはports的なものを好みます。
ということで、macOSでのパッケージマネージャはもっぱらMacPortsに頼っています。
とはいえMacPortsでは、lua付きのvim8がない。
lua付きでないと、開発などでこよなく愛しているプラグインがロクに使えないという事態に陥ってしまうため、とにかくvim8+luaの存在は私にとってはある意味死活問題…。
毎回ビルドしてインストールしているけど、なんだかいつも忘れてしまう…ということで、自分用メモとしてvim8+luaのインストール手順を書き残します。
環境
以下の通りです。
- macOS Mojave 10.14.2
ディレクトリ作成
ビルドするディレクトリを作成し、移動します。
ホームディレクトリや/tmpで展開してビルド&インストールでも別にいいんですが、私は習慣的なこともあって/opt/local/srcディレクトリを作り、その下に展開します。
いちいちrootになっての作業なので、めんどくさい、気が引ける、という方はmkdir ~/tmpとかして、cd tmpのあとにビルド作業を行なってください(ただし、MacPortsでのインストールや、/opt/local配下にvim8+luaをインストールする場合はroot権限が必要になります)。
$ sudo su - root
# mkdir -p /opt/local/src
# cd /opt/local/src
以降、ここではroot権限での作業が続きます。
必要パッケージ
vim8+luaに必要なパッケージ類は、事前にインストールしておく必要があります。
私はMacPortsで以下をインストールしています(一部主要パッケージ、コマンドラインのみ。結果や詳細は省略)。
Homebrewでも実行パスが適切に通っていれば問題ないかと思います(ライブラリ類は別かも)。
# port selfupdate && port upgrade outdated
# port install lua luajit
# port install iconv
# port install gettext libintl
lua、luajitはluaに必要なのでインストールします。
iconvは多言語対応の文字コード変換などに必要なライブラリです。
getext、libintlは多言語表示に必要なライブラリ群です。
他にperl、python、python3などが必要な場合は、適宜インストールしてください。
ソースの取得
vim8のソースコードをGitHubから取得します。パッチが当てられている状態なので、git cloneするだけで最新パッチが当たっているソースです。
# git clone https://github.com/vim/vim.git
ビルド設定
古き良きUNIX系OS向けのビルドシステムなので、automakeが使われています。ということで、configureスクリプトを使ったビルドになります。
ここでは、一部私がハマッた経験も交えながら解説します。
configureオプション
configureオプションには様々ありますが、lua付き(かつ日本語化)では主に以下が重要となります。
オプション | 意味 |
---|---|
--prefix=/opt/local | インストール先パスのprefix |
--enable-luainterp | luaを有効にする |
--with-lua-prefix=/opt/local | luaインストール先パスのprefix(bin、libなどの手前まで) |
--with-luajit | luajitを有効にする |
--enable-multibyte | ファイル編集の多言語対応 |
--enable-nls | メッセージ・ヘルプ等の日本語化対応 |
たとえばホームディレクトリの配下など、システムディレクトリ以外にインストールしたい場合は、--prefixを/Users/[アカウント名]/myvim8など、適宜変更してください。
Makefile作成
configureスクリプトを実行して、Makefileを作成します。
# make distclean clean && \
./configure \
--prefix=/opt/local \
--enable-multibyte \
--enable-nls \
--enable-perlinterp \
--enable-pythoninterp --with-python-command=/opt/local/bin/python2 \
--enable-python3interp --with-python3-command=/opt/local/bin/python \
--enable-rubyinterp --with-ruby-command=/opt/local/bin/ruby2.5 \
--enable-luainterp --with-lua-prefix=/opt/local \
--enable-tclinterp --with-tclsh=/opt/local/bin/tclsh \
--enable-cscope \
--enable-fail-if-missing=yes \
--with-features=huge \
--with-luajit \
--without-x \
--disable-xim \
--disable-gui \
--disable-sysmouse \
--disable-netbeans \
--disable-xsmp \
CC=`which clang`
make distclean cleanは、以前のビルド(configure && make)の残骸などをいっさいがっさい消して初期状態にするものと思ってください。
./configureスクリプトで、上記の一覧表以外のものもあります。perl、python{2,3}、rubyなどは必要に応じて設定してください。
ちなみにrubyについてはハマりどころがあったので、最後に余談で触れておきます。
--disable-XXXについては端的に「不要だから機能を除外」と思ってください。X Window System(UNIX系OSのウィンドウシステム関連)や、GUIモード、NetBeans連携などは外しています。
最後のCCについては特になくても問題はないと思います。
macOSではclangが標準のCコンパイラとなっているのでclangを使うようにしています。何も設定しないとgccでmakeされるようです。
configureスクリプトが無事に通ったかどうか確認します。
:
:
checking how to create tags... ctags -I INIT+ --fields=+S
checking how to run man with a section nr... man -s
checking --disable-nls argument... no
checking for msgfmt... msgfmt
checking for NLS... gettext() doesn't work <<<=== おや???
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
:
:
configure: updating cache auto/config.cache
configure: creating auto/config.status
config.status: creating auto/config.mk
config.status: creating auto/config.h
一応、エラーもなくconfigureスクリプトは実行を終えたようです。
「おや???」の部分は…そう、ハマりどころでした。
ハマり処: NLS(gettext)
結論から言うと、libintlまわりがconfigureになぜか認識されませんでした。
このままの状態でmakeコマンドを実行してビルドしても、できたvimは日本語化されていません。
# make
Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && /Applications/Xcode.app/Contents/Developer/usr/bin/make first
/bin/sh install-sh -c -d objects
touch objects/.dirstamp
CC="/usr/bin/clang -Iproto -DHAVE_CONFIG_H -DMACOS_X -DMACOS_X_DARWIN " srcdir=. sh ./osdef.sh
/usr/bin/clang -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X -DMACOS_X_DARWIN -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -o objects/arabic.o arabic.c
:
:
/usr/bin/clang -DMACOS_X -DMACOS_X_DARWIN -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -L. -L/opt/local/lib -Wl,-headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -fstack-protector -L/opt/local/lib -L/usr/local/lib -DUNIX -o xxd xxd.c
無事ビルドが終わりましたが、念の為インストール(make install)前に、バージョン確認実行をしてみます。
# src/vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Dec 15 2018 17:22:49)
macOS version
Included patches: 1-585
Compiled by zura@beretta.local
Huge version without GUI. Features included (+) or not (-):
+acl +extra_search +mouse_netterm +tag_old_static
+arabic +farsi +mouse_sgr -tag_any_white
+autocmd +file_in_path -mouse_sysmouse +tcl
+autochdir +find_in_path +mouse_urxvt +termguicolors
-autoservername +float +mouse_xterm +terminal
-balloon_eval +folding +multi_byte +terminfo
+balloon_eval_term -footer +multi_lang +termresponse
-browse +fork() -mzscheme +textobjects
++builtin_terms -gettext -netbeans_intg +textprop
+byte_offset -hangul_input +num64 +timers
+channel -iconv +packages +title
+cindent +insert_expand +path_extra -toolbar
-clientserver +job +perl +user_commands
+clipboard +jumplist +persistent_undo +vartabs
+cmdline_compl +keymap +postscript +vertsplit
+cmdline_hist +lambda +printer +virtualedit
+cmdline_info +langmap +profile +visual
+comments +libcall +python/dyn +visualextra
+conceal +linebreak +python3/dyn +viminfo
+cryptv +lispindent +quickfix +vreplace
+cscope +listcmds +reltime +wildignore
+cursorbind +localmap +rightleft +wildmenu
+cursorshape +lua +ruby +windows
+dialog_con +menu +scrollbind +writebackup
+diff +mksession +signs -X11
+digraphs +modify_fname +smartindent -xfontset
-dnd +mouse +startuptime -xim
-ebcdic -mouseshape +statusline -xpm
+emacs_tags +mouse_dec -sun_workshop -xsmp
+eval -mouse_gpm +syntax -xterm_clipboard
+ex_extra -mouse_jsbterm +tag_binary -xterm_save
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
defaults file: "$VIMRUNTIME/defaults.vim"
fall-back for $VIM: "/opt/local/share/vim"
Compilation: /usr/bin/clang -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X -DMACOS_X_DARWIN -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: /usr/bin/clang -L. -L/opt/local/lib -Wl,-headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -fstack-protector -L/opt/local/lib -L/usr/local/lib -o vim -lncurses -framework AppKit -pagezero_size 10000 -image_base 100000000 -L/opt/local/lib -lluajit-5.1 -mmacosx-version-min=10.14 -L/opt/local/lib -Wl,-headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -fstack-protector-strong -L/opt/local/lib/perl5/5.26/darwin-thread-multi-2level/CORE -lperl -lm -lutil -lc -F/System/Library/Frameworks -framework Tcl -framework CoreFoundation -lruby.2.5.3 -lobjc -L/opt/local/lib
+luaになっているのは確認できました。
しかし、--enable-nlsを指定したのに-gettext(gettextが無効)だったり、日本語化されていれば「適用済パッチ: 1-585」のように表示される場所が「Included patches: 1-585」と英語のままだったり、なぜかiconvでさえ無効(-iconv)だったり…。
なかなかがっかりすぎる結果になってしまいました。
configureの場合は、config.logファイルにconfigure時のログが残っているので、これを確認します。本来ならmake実行前に確認しておくほうがよいでしょう。
viでもmoreでもlessでもいいので、src/auto/config.logファイルを開きます(vimのconfigureスクリプトは、src/autoディレクトリ内にconfig.logやconfig.statusを保存します)。
:
:
| /* end confdefs.h. */
| #include <libintl.h>
| int
| main ()
| {
| gettext("Test");
| ;
| return 0;
| }
configure:14502: /usr/bin/clang -o conftest -g -O2 -DMACOS_X -DMACOS_X_DARWIN -L. -L/opt/local/lib -Wl,-headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -fstack-protector -L/opt/local/lib -L/usr/local/lib conftest.c -lintl >&5
conftest.c:158:10: fatal error: 'libintl.h' file not found
#include <libintl.h>
^~~~~~~~~~~
1 error generated.
:
:
libintl.hがなぜか認識されていないようです。
おそらく、/opt/local配下が認識されていないのでしょう(LD_LIBRARY_PATHなどに入っていない等)。
そこで、configureコマンドの末尾(CC=...の次)に、以下をつけます。
CFLAGS='-I/opt/local/include'
ということで、改めて以下のconfigureスクリプトを実行。
# make distclean clean && \
./configure \
--prefix=/opt/local \
--enable-multibyte \
--enable-nls \
--enable-perlinterp \
--enable-pythoninterp=yes --with-python-command=/opt/local/bin/python2 \
--enable-python3interp=yes --with-python3-command=/opt/local/bin/python \
--enable-rubyinterp --with-ruby-command=/opt/local/bin/ruby2.5 \
--enable-luainterp --with-lua-prefix=/opt/local \
--enable-tclinterp --with-tclsh=/opt/local/bin/tclsh \
--enable-cscope \
--enable-fail-if-missing=yes \
--with-features=huge \
--with-luajit \
--without-x \
--disable-xim \
--disable-gui \
--disable-sysmouse \
--disable-netbeans \
--disable-xsmp \
CC=`which clang` CFLAGS='-I/opt/local/include'
configure結果を見てみます(該当箇所のみ抜粋)。
:
:
checking for NLS... gettext() works with -lintl
:
:
ちゃんといけそうです。ふたたびmakeでコンパイルします。
出力結果を見てみると、最初のmakeにはなかったpoファイルのビルドも通っています。
これはいい感じ。
:
:
checking for msgfmt... msgfmt
checking for NLS... gettext() works with -lintl
checking for bind_textdomain_codeset... yes
1733 個の翻訳メッセージ.
OLD_PO_FILE_INPUT=yes msgfmt -v -o fi.mo fi.po
1941 個の翻訳メッセージ.
OLD_PO_FILE_INPUT=yes msgfmt -v -o fr.mo fr.po
1954 個の翻訳メッセージ.
:
:
OLD_PO_FILE_INPUT=yes msgfmt -v -o ja.mo ja.po
1955 個の翻訳メッセージ.
OLD_PO_FILE_INPUT=yes msgfmt -v -o ko.UTF-8.mo ko.UTF-8.po
1869 個の翻訳メッセージ.
:
:
make[2]: Nothing to be done for `converted'.
src/vim --versionで、バージョン確認をします。
VIM - Vi IMproved 8.1 (2018 May 18, compiled Dec 15 2018 17:42:34)
macOS 版
適用済パッチ: 1-585
Compiled by zura@beretta.local
Huge 版 without GUI. 機能の一覧 有効(+)/無効(-)
+acl +extra_search +mouse_netterm +tag_old_static
+arabic +farsi +mouse_sgr -tag_any_white
+autocmd +file_in_path -mouse_sysmouse +tcl
+autochdir +find_in_path +mouse_urxvt +termguicolors
-autoservername +float +mouse_xterm +terminal
-balloon_eval +folding +multi_byte +terminfo
+balloon_eval_term -footer +multi_lang +termresponse
-browse +fork() -mzscheme +textobjects
++builtin_terms +gettext -netbeans_intg +textprop
+byte_offset -hangul_input +num64 +timers
+channel +iconv +packages +title
+cindent +insert_expand +path_extra -toolbar
-clientserver +job +perl +user_commands
+clipboard +jumplist +persistent_undo +vartabs
+cmdline_compl +keymap +postscript +vertsplit
+cmdline_hist +lambda +printer +virtualedit
+cmdline_info +langmap +profile +visual
+comments +libcall +python/dyn +visualextra
+conceal +linebreak +python3/dyn +viminfo
+cryptv +lispindent +quickfix +vreplace
+cscope +listcmds +reltime +wildignore
+cursorbind +localmap +rightleft +wildmenu
+cursorshape +lua +ruby +windows
+dialog_con +menu +scrollbind +writebackup
+diff +mksession +signs -X11
+digraphs +modify_fname +smartindent -xfontset
-dnd +mouse +startuptime -xim
-ebcdic -mouseshape +statusline -xpm
+emacs_tags +mouse_dec -sun_workshop -xsmp
+eval -mouse_gpm +syntax -xterm_clipboard
+ex_extra -mouse_jsbterm +tag_binary -xterm_save
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
デフォルトファイル: "$VIMRUNTIME/defaults.vim"
省略時の $VIM: "/opt/local/share/vim"
コンパイル: /usr/bin/clang -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X -DMACOS_X_DARWIN -I/opt/local/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: /usr/bin/clang -L. -L/opt/local/lib -Wl,-headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -fstack-protector -L/opt/local/lib -L/usr/local/lib -o vim -lncurses -liconv -lintl -framework AppKit -pagezero_size 10000 -image_base 100000000 -L/opt/local/lib -lluajit-5.1 -mmacosx-version-min=10.14 -L/opt/local/lib -Wl,-headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -fstack-protector-strong -L/opt/local/lib/perl5/5.26/darwin-thread-multi-2level/CORE -lperl -lm -lutil -lc -F/System/Library/Frameworks -framework Tcl -framework CoreFoundation -lruby.2.5.3 -lobjc -L/opt/local/lib
ちゃんと日本語化もされ、+gettext、+iconvにもなっています。
make installで/opt/local配下にインストールすれば完了です。
余談: Rubyのハマりどころ
RubyはmacOSではシステムデフォルトでインストールされるので、わざわざMacPortsでインストールしなくてもいいなと思い、そのままビルドをしていたのですが、なぜか以下のエラーで止まってしまい、先に進みませんでした。
# make
:
:
/usr/bin/clang -c -I. -I/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0 -DRUBY_VERSION=23 -Iproto -DHAVE_CONFIG_H -DMACOS_X -DMACOS_X_DARWIN -I/opt/local/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -o objects/if_ruby.o if_ruby.c
In file included from if_ruby.c:126:
In file included from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby.h:33:
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/ruby.h:24:10: fatal error: 'ruby/config.h' file not found
#include "ruby/config.h"
^~~~~~~~~~~~~~~
1 error generated.
make[1]: *** [objects/if_ruby.o] Error 1
make: *** [first] Error 2
確かに示されたディレクトリにconfig.h(/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/config.h)はありませんでした。
そのかわり、/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin17/ruby/config.hは存在しました。
いろいろ調べて、xcode-select --installでコマンドラインツールをインストール(再インストール)せよ等の記事もみかけ、やってみましたが、改善はしませんでした。
それどころか、別のディレクトリにconfig.hができていたり…(/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18/ruby/config.h)。
AppleはOSバージョンごとにRubyのインストール先を変更してて迷惑だ、という記述も見かけました(Stackoverflowあたりとかで)。
しかたないので、気はすすみませんでしたが、root権限でファイルをコピーして対処しようとしました。
しかしmacOSのSIP(システム整合性保護機構)により、operation not permittedとなってしまいます。
もちろんSIPを強制解除して臨む方法もありますが、vimごときでこれもどうかと思ったため、MacPortsで/opt配下にRubyをインストールし、これを指定することで回避しました。
この記事の例では、MacPortsでインストールするRubyのバージョンは2.5のため、先のビルドで示したconfigureの--with-ruby-commandもruby2.5となっています。
他のバージョンを指定する場合は、この部分に注意してください。
# port install ruby25
:
(略)
:
# make distclean clean && \
./configure \
--prefix=/opt/local \
--enable-multibyte \
--enable-nls \
--enable-perlinterp \
--enable-pythoninterp --with-python-command=/opt/local/bin/python2 \
--enable-python3interp --with-python3-command=/opt/local/bin/python \
--enable-rubyinterp --with-ruby-command=/opt/local/bin/ruby2.5 \
--enable-luainterp --with-lua-prefix=/opt/local \
--enable-tclinterp --with-tclsh=/opt/local/bin/tclsh \
--enable-cscope \
--enable-fail-if-missing=yes \
--with-features=huge \
--with-luajit \
--without-x \
--disable-xim \
--disable-gui \
--disable-sysmouse \
--disable-netbeans \
--disable-xsmp \
CC=`which clang` CFLAGS='-I/opt/local/include'
# make && make install