UNIXにおけるLuaJIT対応 #348

Closed
koron opened this Issue Apr 1, 2013 · 53 comments

Projects

None yet

9 participants

@koron
Owner
koron commented Apr 1, 2013

Windowsでは全く問題ないのですが、UNIXだと.soの名前が違ってたりで
if_lua に LuaJITを使うのには一手間か二手間も必要なのが現状です。
これを configure && make 一発でできるようにしたいです。


--enable-luainterp を使いまわして自動or手動で制御するか、
もしくは新たな制御オプションを追加するか、というのが今のところ考えられる方法。


#355 より

LuaJIT はライブラリファイル名が libluajit-X.X.so なので
ライブラリを見つけられないほかdynでもリンクできていません。

Owner

Lua と LuaJIT を両方インストールしている場合はどうするのかということもありますし、何らかの方法で手動で選択するようにするのがよいと思います。(が、どういうオプションがいいですかね?)

Owner
koron commented Apr 11, 2013

一つの案

  • 5.1/dyn でコンパイルされている: LuaJIT 優先、なければ Lua
  • 5.1 でコンパイルされている: コンパイルされた時のもの使う
    • 指定されたパス (LUA_PREFIX?) から自動判定
  • 5.2 でコンパイルされている: Lua(LuaJIT無いので)
Member
Shougo commented Apr 11, 2013

5.2 でコンパイルされている: Lua(LuaJIT無いので)

LuaJITが5.2対応したらややこしくなると思います。インタプリタを指定するためのオプションを用意する案を私は推します。

Owner
koron commented Apr 11, 2013

LuaJITが5.2対応したらややこしくなると思います。

LuaJITのバージョンが上がるでしょうから大丈夫でしょう。

個人的にはWindows/dynと同じ感じで使えるのがベスト。
WindowsではDLL差し替えるだけでLuaとJITと切り替えられちゃいますし。

Member
Shougo commented Apr 11, 2013

それは便利ですね。

とりあえず、LuaJITでbuildできるようにパッチ作ってみました。

https://gist.github.com/shirosaki/5663617

./configure に --with-luajit というoptionを追加すると、luajitを探します。
--with-luajit なしだと、今までどおりluaを使います。

Ubuntu:

sudo apt-get install luajit libluajit-5.1
./configure --enable-luainterp --with-luajit

Mac:

brew install luajit
./configure --enable-luainterp --with-luajit --with-lua-prefix=/usr/local

ついでにmacでのdynamic linkができなかったのを修正しました。
Mac で dynamic linkしたときは、libraryの場所を見つけるために、下記の環境変数を設定する必要があります。
export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib

ubuntu 13.04 と mac osxでテストしました。

Member
Shougo commented May 29, 2013

それは素晴らしいです。

Owner
h-east commented May 29, 2013

@shirosaki GJ!👍
fedora17 で試そうとしたら yum でluaJITインストール出来なさそうな感じでした。。ほんとかな?

Owner
koron commented May 29, 2013

@shirosaki 👍

あとで試す!

Member
Shougo commented Jun 9, 2013

パッチを試しました。細かな動作確認はまだですが、LuaJITでコンパイル・実行できることは確認しています。

環境: Ubuntu 13.04
Vim 7.3.1152

Vim7.4で採用されるか非常に謎ですが、vim_devにパッチを送ってしまったほうが良いと思いますがどうでしょうか。

仕様的に問題なければvim_devに出してみますが、入るとしてもVim 7.5以降でしょうか。
もうすぐbeta test versionが出るらしいです。
https://groups.google.com/forum/?fromgroups#!topic/vim_dev/YOnT1yHMHUI

CentOS でluajitをsourceからinstallしてみましたが、問題なく使えるようです。

CentOS release 6.4
Vim 7.3.1156

$ wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
$ tar xvf LuaJIT-2.0.2.tar.gz
$ cd LuaJIT-2.0.2
$ make
$ sudo make install
$ sudo sh -c "echo /usr/local/lib > /etc/ld.so.conf.d/local-x86_64.conf"
$ sudo ldconfig

Vim configure: ./configure --enable-luainterp --with-luajit --with-lua-prefix=/usr/local

Fedoraのluajit rpmはまだ提供されていないようです。
https://bugzilla.redhat.com/show_bug.cgi?id=718681

luajitのpackageを作っている人がいるのを見つけました。
https://github.com/craigbarnes/packages

Member
Shougo commented Jun 10, 2013

仕様的に問題なければvim_devに出してみますが、入るとしてもVim 7.5以降でしょうか。
もうすぐbeta test versionが出るらしいです。

そうですか。Vim 7.3の開発版も安定してきましたからね。今出せばVim 7.4リリース後のパッチには入るのではないでしょうか。

Owner
h-east commented Jun 13, 2013

@shirosaki さんがvim_devにpatch投稿しました。お疲れ様です。
https://groups.google.com/d/msg/vim_dev/BUycjLrmBe0/Nyx3tQdMD0YJ

Bram氏は「--enable-luainterp=dynamic指定された時、LuaJIT使えるんならそっち使ったらええんちゃうん?」って言ってる?

Bram氏が言っているのは、下記の2点であると理解しています。

  • WindowsでLuaJITを使うために、dllをrenameしていると、どちらのdll(LuaかLuaJITか)を使っていたのか忘れてしまうのではないか。
  • --with-luajit option を知らない人のために、LuaJITをdefaultにして、LuaJITがなければ、Luaにfallbackするのがよいのでは。

返信はしましたが、何かあればお願いします。

Owner
koron commented Jun 14, 2013

WindowsでLuaJITを使うために、dllをrenameしていると、どちらのdll(LuaかLuaJITか)を使っていたのか忘れてしまうのではないか。

指摘として後半は的を射ています。実際わからない。Version変数みたいなのがあればわかるのかな…
ただ前半renameは不要です。通常版もJIT版もどちらも lua51.dll という名前ですので…
もっとたちが悪い or 使い勝手が良いと言えますw

Owner

ちゃんとバージョンリソースが埋め込んであればいいんですが…。
JIT版のエクスポートしているシンボルを見ると、luaJIT_setmode, luaJIT_version_2_1_0_alpha というのがありますね。

Owner
koron commented Jun 14, 2013

完璧ではないけど jit モジュールの有無で区別するのが良いかも。

lua for key, value in pairs(_G) do print(key) end

こんな感じでグローバルオブジェクトを見る限りでは。

ちなみに lua print(_VERSION) で出てくるのは Lua 5.1 だった。

jit module でLuaJITのバージョンを表示できました。

:lua print(jit.version)

http://luajit.org/ext_jit.html

Member
Shougo commented Jun 14, 2013

https://groups.google.com/d/msg/vim_dev/BUycjLrmBe0/IUdfKv2Z3g4J

「Lua 5.2はオフィシャルリリースなのだから、最初の通り通常のLuaを優先したほうが良いのでは?」という意見がありますね。
Vimコンパイル用のドキュメントがVimにあるのかわかりませんが、LuaJITの件はそこに補足しておくというのはどうでしょうか。

Owner
koron commented Jul 13, 2013
--enable-luainterp=dynamic --with-luajit --with-lua-prefix=/opt/luajit

みたいにした状況下で、
ダイナミックリンク先が libluajit.so になる(実際にインストールされているのは libluajit-5.1.so)だが
どうするのが良いかしら?

LuaJITインストール時にlubluajit.so でシンボリックリンクでも作れば解決はできるが、なんか違う気がする。

Owner
koron commented Jul 13, 2013

ダイナミックリンク先が libluajit.so になる(実際にインストールされているのは libluajit-5.1.so)だが

正確には libluajit.so. になってた。
原因は実行ファイル luajit がPATH上になかったことだった。

  • そもそもPATHに /opt/luajit/bin が入って無かった
  • LuaJITがdevelop版なので luajit がなく luajit-2.1.0-alpha だけだった

この2点ついては作業者(=ビルドする人が)が直せば十分。

ただし luajit が見つからない時に libluajit.so. (末尾のピリオドが余分)になってしまうのは避けたほうが良い。
configure時に luajit が見つからなければエラーで止めるか
もしくは libluajit.so を使うとかはできないだろうか?

Owner
koron commented Jul 13, 2013

LuaJITがdevelop版なので

LuaJIT のヘッダファイルのインストール位置は PREFIX/include/luajit-2.1 になる。
特に対応の必要はないが、今後に要注意。

Owner
koron commented Jul 13, 2013

@shirosaki

luajit が見つからない時に libluajit.so. (末尾のピリオドが余分)になってしまうのは避けたほうが良い。
configure時に luajit が見つからなければエラーで止めるか
もしくは libluajit.so を使うとかはできないだろうか?

これ、できますか?

確認してみましたが、patchなしでふつうのluaを使ったビルドでも、luaがPATHになくて、*.soを見つけられないとそうなるようです。

./configure --with-features=huge --enable-luainterp=dynamic --with-lua-prefix=/usr/local

gcc -c -I. -Iproto -DHAVE_CONFIG_H   -DMACOS_X_UNIX -no-cpp-precomp  -g -O2 -U_FORTIFY_SOURCE
 -D_FORTIFY_SOURCE=1       
 -DDYNAMIC_LUA_DLL=\"liblua.so.\" -I/usr/local/include -o objects/if_lua.o if_lua.c

以下のfor loop で*.soの絶対パスを探している処理があるのですが、最後まで見つからないと、
最後に試したパターンが使われるようになっているためのようです。
vi_cv_version_lua が空文字列なので、liblua.so. になる。

このtestで*.soが見つからなかったときにエラーにするのがよさそうに思います。

          for sover in "${vi_cv_version_lua}.so" "-${vi_cv_version_lua}.so" ".so.${vi_cv_version_lua}"; do
            for i in .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 ""; do
              if test -f "${vi_cv_path_lua_pfx}/${subdir}/liblua${sover}$i"; then
                sover2="$i"
                break 3
              fi
            done
          done
Owner
koron commented Jul 14, 2013

@shirosaki ありがとうございます! #443 に別件として建てておきました。

Owner
h-east commented Jul 23, 2013

@shirosaki Bram氏から反応ないですね。
shirosakiさんのpatchには #443#442 の修正も入っているし、すぐ取り込まれると思っていたんですけどどうしましょうか?

  • ちょっとBram氏を突いてみる?
  • #443#442 だけのpatchを送ってみる?
Owner

LuaJIT対応となると、新機能になるので7.4a Betaに取り込んでもらうのは難しいんじゃないでしょうか。

  • #443#442 だけのpatchを送ってみる?

こちらに1票。バグ修正パッチとLuaJIT対応パッチは分離してしまった方がいいと思います。
バグ修正であることがちゃんと伝われば7.4までに取り込まれる可能性は高いでしょう。
7.4がリリースされたら、改めてLuaJIT対応を提案するのがいいのではないかと。

luaのバグ修正だけなら取り込む意思があるか、Bram氏に聞いてみてはどうでしょうか。

Owner
h-east commented Jul 24, 2013

@shirosaki お手数ですがお願いできますか?

パッチは分離したほうがよいということですが、Bramさんは自分で適切なテストができないらしいです。
他にこのパッチをテストしてくださる方がいれば取り込まれる可能性も高まりそうです。

Owner
h-east commented Jul 26, 2013

私も k-takataさんと同じ意見です。

バグ修正パッチとLuaJIT対応パッチは分離してしまった方がいいと思います。

まずはパッチを分けて投げる。
LuaJIT対応パッチについてはいろんな人に動作確認&報告をしてもらう。
...でいかがでしょうか?

Member
Shougo commented Jul 27, 2013

LuaJIT対応パッチについてはいろんな人に動作確認&報告をしてもらう。
...でいかがでしょうか?

LuaJITパッチは私が以前から普通に使っていますね。特に問題は起こっていません。
他のパッチも時間があれば試してみます。

Owner

7.4a.045 で LuaJIT 対応を含めて取り込まれました。
https://groups.google.com/d/topic/vim_dev/4neHRqy2TgQ/discussion

@k-takata k-takata closed this Jul 28, 2013
Owner
h-east commented Jul 28, 2013

おぉ!よかったよかった。お疲れ様でした。

Owner

乙カレーサマー

Member
Shougo commented Jul 29, 2013

I installed libluajit-5.1

configuring looks for lluajit-5.2:

./configure --with-features=huge --enable-luainterp  --with-luajit  | ag lua
checking --enable-luainterp argument... yes
checking --with-lua-prefix argument... no
checking --with-luajit... yes
checking for luajit... no
checking if lua.h can be found in /usr/include... no
checking if lua.h can be found in /usr/include/lua5.2... yes
checking if link with -L/usr/lib/i386-linux-gnu -lluajit-5.2 is sane... no

checking for luajit... no

You don't have luajit command in the PATH. Please set PATH to luajit executable to find luajit version properly.

2013/7/29 Hiroshi Shirosaki notifications@github.com

You don't have luajit command in the PATH. Please set PATH to luajit
executable to find luajit version properly.

luajit is executable. it is named luajit-2.0.0-beta9

luajit is executable. it is named luajit-2.0.0-beta9

configure cannot find luajit-2.0.0-beta9. Can you create symlink of luajit?
e.g. ln -s luajit-2.0.0-beta9 luajit

configure found it! Thanks!

2013/7/29 Hiroshi Shirosaki notifications@github.com

luajit is executable. it is named luajit-2.0.0-beta9

configure cannot find luajit-2.0.0-beta9. Can you create symlink of
luajit?
e.g. ln -s luajit-2.0.0-beta9 luajit


Reply to this email directly or view it on GitHubhttps://github.com/vim-jp/issues/issues/348#issuecomment-21725597
.

@crazymaster crazymaster referenced this issue in Shougo/neocomplete.vim Aug 27, 2013
Closed

Having trouble compiling vim with lua in Linux #31

configure found it! Thanks!

你好,编译vim with lua-jit时我也遇到类似问题。
我尝试使用:

ln -s luajit-2.0.0-beta9 luajit

但发现终端下输入luajit还是不能执行,非得输入全名luajit-2.0.0-beta9
自然Configure的时候仍然报错找不到luajit。
请问你是怎么解决的,谢谢。
@UncleBill

Member
Shougo commented Aug 28, 2013

@lookforit
This is Vim for japanese forum.
We cannot read Chinese.
So, you should write the report by Japanese or English.

Owner
koron commented Aug 28, 2013

@shougo try google translate

Member
Shougo commented Aug 28, 2013

Yes. I can translate it. But @lookforit should not require translate Chinese for vim-jp member.

@Shougo
I'm so sorry for the inconvenience and will post in English next time.

Owner
koron commented Aug 28, 2013

I paste result of translation:


Original:

你好,编译vim with lua-jit时我也遇到类似问题。
我尝试使用:
ln -s luajit-2.0.0-beta9 luajit
但发现终端下输入luajit还是不能执行,非得输入全名luajit-2.0.0-beta9。
自然Configure的时候仍然报错找不到luajit。
请问你是怎么解决的,谢谢。

Translation:

Hello, compile vim with lua-jit, I have encountered similar problems.
I try to use:

ln -s luajit-2.0.0-beta9 luajit

But found that import terminals luajit or unenforceable, have to enter the full name luajit-2.0.0-beta9.
Natural Configure error still can not find the time luajit.
I ask you how to solve, thank you.

Owner
koron commented Aug 28, 2013

@Shougo

Yes. I can translate it.

You would be better if paste the result of translation for other members when you did it.

Member
Shougo commented Aug 28, 2013

You would be better if paste the result of translation for other members when you did it.

OK.

@lookforit

我尝试使用:

ln -s luajit-2.0.0-beta9 luajit

what is the pwd? why can't execute luajit?

try type luajit-2.0.0-beta9 to find the location of luajit (on my machine, it is /usr/bin) then execute ln -s luajit-2.0.0-beta9 luajit

@UncleBill @crazymaster
Yes, it's proved that I ignore the pwd of luajit-2.0.0-beta9 ,that's the point.
thank you and all above.

jdewit commented Mar 28, 2014

Here's what ended up working for me on Ubuntu 12.04.

https://gist.github.com/jdewit/9818870

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment