Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

macOSでvim8.1をlua付きでソースからビルドする

$
0
0

はじめに

私は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権限が必要になります)。

GitHubのvimリポジトリからソースコードを取得
$ sudo su - root
# mkdir -p /opt/local/src# cd /opt/local/src

以降、ここではroot権限での作業が続きます。

必要パッケージ

vim8+luaに必要なパッケージ類は、事前にインストールしておく必要があります。
私はMacPortsで以下をインストールしています(一部主要パッケージ、コマンドラインのみ。結果や詳細は省略)。
Homebrewでも実行パスが適切に通っていれば問題ないかと思います(ライブラリ類は別かも)。

必要パッケージ類の事前インストール(MacPorts)
# 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するだけで最新パッチが当たっているソースです。

GitHubのvimリポジトリからソースコードを取得
# git clone https://github.com/vim/vim.git

ビルド設定

古き良きUNIX系OS向けのビルドシステムなので、automakeが使われています。ということで、configureスクリプトを使ったビルドになります。
ここでは、一部私がハマッた経験も交えながら解説します。

configureオプション

configureオプションには様々ありますが、lua付き(かつ日本語化)では主に以下が重要となります。

オプション意味
--prefix=/opt/localインストール先パスのprefix
--enable-luainterpluaを有効にする
--with-lua-prefix=/opt/localluaインストール先パスのprefix(bin、libなどの手前まで)
--with-luajitluajitを有効にする
--enable-multibyteファイル編集の多言語対応
--enable-nlsメッセージ・ヘルプ等の日本語化対応

たとえばホームディレクトリの配下など、システムディレクトリ以外にインストールしたい場合は、--prefixを/Users/[アカウント名]/myvim8など、適宜変更してください。

Makefile作成

configureスクリプトを実行して、Makefileを作成します。

configureの実行
# 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スクリプトが無事に通ったかどうか確認します。

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は日本語化されていません。

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)前に、バージョン確認実行をしてみます。

vimの実行
# 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を保存します)。

config.logの確認
          :
          :
| /* 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で/opt/local/include配下のヘッダファイルを参照するよう指定
CFLAGS='-I/opt/local/include'

ということで、改めて以下のconfigureスクリプトを実行。

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結果を見てみます(該当箇所のみ抜粋)。

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の実行ふたたび
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でインストールしなくてもいいなと思い、そのままビルドをしていたのですが、なぜか以下のエラーで止まってしまい、先に進みませんでした。

システムデフォルトのRubyでビルドエラー
# 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となっています。
他のバージョンを指定する場合は、この部分に注意してください。

MacPortsのRubyでビルド(configureは先に同じ)
# 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

Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>