雑文発散

«前の日記(2015-08-05) 最新 次の日記(2015-08-07)» 編集
過去の日記

2015-08-06 [長年日記]

[Pebble] UCS-4 Python で pebble build はできるが pebble install には失敗する件を調べていた

先日、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 を使うという回避策でなんとかなるのだけど、必要が出てきたら時間を作ってもう少し追ってみようかな。