Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

UNIXにおけるLuaJIT対応 #348

Closed
koron opened this Issue · 53 comments

9 participants

@koron
Owner

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


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


#355 より

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

@k-takata
Owner

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

@koron
Owner

一つの案

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

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

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

@koron
Owner

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

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

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

@Shougo
Collaborator

それは便利ですね。

@shirosaki

とりあえず、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でテストしました。

@Shougo
Collaborator

それは素晴らしいです。

@h-east
Owner

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

@koron
Owner

@shirosaki :+1:

あとで試す!

@Shougo
Collaborator

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

環境: Ubuntu 13.04
Vim 7.3.1152

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

@shirosaki

仕様的に問題なければ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

@Shougo
Collaborator

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

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

@h-east
Owner

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

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

@shirosaki

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

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

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

@koron
Owner

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

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

@k-takata
Owner

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

@koron
Owner

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

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

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

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

@shirosaki

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

:lua print(jit.version)

http://luajit.org/ext_jit.html

@Shougo
Collaborator

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

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

@koron
Owner
--enable-luainterp=dynamic --with-luajit --with-lua-prefix=/opt/luajit

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

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

@koron
Owner

ダイナミックリンク先が 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 を使うとかはできないだろうか?

@koron
Owner

LuaJITがdevelop版なので

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

@koron
Owner

@shirosaki

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

これ、できますか?

@shirosaki

確認してみましたが、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
@koron
Owner

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

@h-east
Owner

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

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

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

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

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

@shirosaki

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

@h-east
Owner

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

@shirosaki

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

@h-east
Owner

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

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

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

@Shougo
Collaborator

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

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

@k-takata
Owner

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

@k-takata k-takata closed this
@h-east
Owner

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

@crazymaster
Collaborator

乙カレーサマー

@Shougo
Collaborator
@UncleBill

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
@shirosaki

checking for luajit... no

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

@UncleBill
@shirosaki

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

@UncleBill
@crazymaster crazymaster referenced this issue in Shougo/neocomplete.vim
Closed

Having trouble compiling vim with lua in Linux #31

@lookforit

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

@Shougo
Collaborator

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

@koron
Owner
@Shougo
Collaborator

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

@lookforit

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

@koron
Owner

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.

@koron
Owner

@Shougo

Yes. I can translate it.

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

@Shougo
Collaborator

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

OK.

@UncleBill

@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

@lookforit

@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

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
Something went wrong with that request. Please try again.