non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

pyenvにはCONFIGURE_OPTSではなくPYTHON_CONFIGURE_OPTSだった件

こんにちは。しばらく、奥さんが海外出張で不在の為、実家に子供達と来ているkjunichiです。

前回の記事

abrakatabura.hatenablog.com

ではpyenvで2.7.13は–enable-frameworkを指定するとビルドできませんでした。

しかし!

またまた、Qiita経由id:antimon2_math さんにコメント頂き、解決しました。

CONFIGURE_OPTSではなく、PYTHON_CONFIGURE_OPTSに–enable-frameworkを指定することで、 無事2.7.13でもframework形式でビルド出来ました。感謝!

まとめ

思い込みよくない、ドキュメントをよく確認しましょう。。 PyCall.jlのREADMEを改めて見返すとPYTHON_CONFIGURE_OPTSと記載されてました。

PYTHONビルド時の--enable-frameworkと--enable-sharedの違い

こんにちは、長男が今年もお泊まり保育でした。去年やって今年は2回目なので、こちらも去年ほどは心配せずのんびり過ごせるはずが、仕事に追われて、家路につく頃には長男はいつもは家では起きてる時間ですが、お泊まり保育の就寝時刻を過ぎていましたkjunichiです。

背景

Qiitaに

macOSでpyenvで入れたpythonをPyCallで使うには - Qiita

なる記事を投稿して、最近コメント頂いた。

macOSではPythonビルド時に–enable-frameworkなるオプションがあり、 自分の投稿したUnix的発想の–enable-sharedではなく、macOSの流儀に従ったオプションがあり、PyCall.jlの公式でも こちらのオプションが提示されていることを知った。

調査

とりあえず、やってみた

–enable-framework

といった感じで、pythonのインストーディレクトリ直下にPython.frameworkが出来る。

lib配下のlibpythonはframework内のファイルのシンボリックリンクとして作成される。

 ls -l 3.5.3/lib
lrwxr-xr-x  1 junichi  staff  74 Jul  7 14:24 3.5.3/lib@ -> /Users/junichi/.pyenv/versions/3.5.3/Python.framework/Versions/Current/lib

2.7系だとpyenvで–enable-framework駄目かも。。。

どうも、2.7系だと最近の版は–enable-frameworkだとダメみたいでした。 軽くWebを検索する限り、過去にもどうも–enable-frameworkは問題起こしてるみたいでした。

Creating directory /Library/Frameworks/Python.framework/Versions/2.7/Resources/English.lproj
install: mkdir /Library/Frameworks/Python.framework: Permission denied
Creating directory /Library/Frameworks/Python.framework/Versions/2.7/lib
install: mkdir /Library/Frameworks/Python.framework: Permission denied
make: *** [frameworkinstallstructure] Error 71
--enable-fwamework=/Users/foo/libpath

を指定しても、

ln -fs "../../../Python" "/Users/junichi/.pyenv/versions/2.7.13/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.a"
ln: /Users/junichi/.pyenv/versions/2.7.13/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.a: No such file or directory
make: *** [frameworkinstallmaclib] Error 1

とエラーになってしまう。

※追記

実は、これ、pyenvで指定する環境変数がCONFIGURE_OPTSだとダメで、PYTHON_CONFIGURE_OPTSであれば、2.7系でもパスの指定も不要でインストール出来ました。

–enable-shared

Python.frameworkは作られず、Unix系な共有ライブラリのみ作成された。

macmini2014:versions junichi$ ls -l 2.7.13/lib/libpython2.7.dylib 
-r-xr-xr-x  1 junichi  staff  2049716 Jul  7 16:37 2.7.13/lib/libpython2.7.dylib*

 PyCall.jlを斜め読み

Python.frameworkを直接使用するコードは見当たらなかった。

using PyCall
PyCall.libpython

で、lib配下のlibpythonxx.dylibを参照していることが判明。

結論

–enable-sharedでもJuliaからは問題なさそう。 ただ、どうせ、macOSで使うんだからPython.frameworkも作っておいた方が 後から役に立つ可能性があるかも。。。

2.7系は–enable-framework出来なければ、–enable-sharedで使うしかない。

関連記事

10年前の記事

5年前の記事

1年前の記事

WindowsでDLLを作ろうとしてmrb_context_runの歴史を調べた

おはようございます。ここ数日夕方になると熱が上がる次男、昨日は夕方も熱も上がらず、汗かいて寝て、今朝も熱が上がらなかったので、おそらく復活かと思います。kjunichiです。

背景

mruby-juliaなるmrubyからはJulia(PyCall経由でPythonも)を呼べ、JuliaからはmrubyのAPIにアクセスできるmrbgemを作ってます。

今年は、Windows環境がメインな環境であれこれ開発進めようとしていて、その際にmruby-sharedlibなるmrbgemを利用して、libmruby.a相当の mruby.dllを作ろうとしたら、defファイルのシンボル「mrb_context_run」が存在しないとうエラー。

mrb_context_runの歴史

1.0.0

mrb_context_runはmruby v1.0.0ではありました。

mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);

1.1.0

MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);

1.2.0

MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);

current

#define mrb_context_run(m,p,s,k) mrb_vm_run((m),(p),(s),(k))

現在のmasterはこのように、mrb_vm_runを呼び出すマクロとして定義されています。 mruby-sharedlibでDLLを生成しようとしてdefファイルのシンボルが見つからないというエラーの 原因はこれでした。

github.com

まとめ

どうやら、現在のリリース版までは、存在しているようです。 単純にmruby-sharedlibにこのAPIを削除したプルリクを送るのは待った方がいいかもでした。

関連記事

11年前の記事

4年前の記事

3年前の記事

2年前の記事