先日、Pebble へ組み込むフォントを生成するときに Python には UCS-4 と UCS-2 の2系統(?)があることを知ったわけだが、このときには Python 2.7.9 を UCS-4 化した。どうせなら、最新版の 2.7.10 も UCS-4 に切り替えちゃおうと思って、pyenv でコンパイルしなおした。
% PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs4" pyenv install 2.7.10
そして pebble build
コマンドを実行し、次に pebble install
コマンドを実行したら、、、エラーが出た。
% pebble install --emulator basalt
Couldn't launch pypkjs:
Traceback (most recent call last):
File "/usr/local/Cellar/pebble-sdk/3.2/Pebble/common/phonesim/phonesim.py", line 3, in <module>
monkey.patch_all()
File "/usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/monkey.py", line 189, in patch_all
patch_thread(Event=Event)
File "/usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/monkey.py", line 106, in patch_thread
patch_module('thread')
File "/usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/monkey.py", line 62, in patch_module
gevent_module = getattr(__import__('gevent.' + name), name)
File "/usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/thread.py", line 28, in <module>
from gevent.lock import Semaphore as LockType
File "/usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/lock.py", line 5, in <module>
from gevent._semaphore import Semaphore
ImportError: dlopen(/usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/_semaphore.so, 2): Symbol not found: _PyUnicodeUCS2_Compare
Referenced from: /usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/_semaphore.so
Expected in: flat namespace
in /usr/local/Cellar/pebble-sdk/3.2/libexec/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-intel.egg/gevent/_semaphore.so
Pebble の開発以外では、あまり Python に触れることがない(何かのコマンドの裏側で知らぬ間に使ってることも多いけど)、バックトレースが表示されてもなかなかピンと来ない。
でもよく見ると、 Symbol not found: _PyUnicodeUCS2_Compare
なんてメッセージが見える。
そいつを吐き出しているのは gevent-1.0.2-py2.7-macosx-10.10-intel.egg
の中のようだ。OS X 10.10 用にビルドされた gevent が UCS-2 Python 用になってしまっているみたい。
Pebble SDK の Homebrew 用のリポジトリ homebrew-pebble-sdk を眺めていたら、pebble-sdk.rb のなかで必要なライブラリのビルドを行なっているみたい。
ENV["PYTHONPATH"] = lib+"python2.7/site-packages"
ENV.prepend_create_path 'PYTHONPATH', libexec+'lib/python2.7/site-packages'
ENV.prepend_create_path "PATH", libexec/"bin"
install_args = [ "setup.py", "install", "--prefix=#{libexec}" ]
このとき使われる Python が UCS-2 なのか UCS-4 なのかで挙動が変わるのかもなぁ。
今のところフォント生成のときだけ UCS-4 Python を使うという回避策でなんとかなるのだけど、必要が出てきたら時間を作ってもう少し追ってみようかな。