というのも、今回の目的はWindows環境で作ったGUIアプリをMac用の実行可能形式にしたかっただけなので、アプリさえ動けばとりあえずOK。
というわけで、私の環境には現在いくつかの機能が入っていません。でも目的のために手段を選んではいられない! ということで、その辺りはこの際、目を瞑りました。なので、こんな感じでひとまず動いたよ! というだけの記事です。
とりあえず、次の環境では色々うまくいかないので、当てはまる場合はpyenvを使わないほうが良いのかもしれません。
OSX10.10
PyQt5.3.2
sip4.16.4
XCode 6.1
まずはこちらのサイト様を参考に、Homebrewを利用してpyenv環境を構築。
Mac OSX で開発環境を構築するための環境構築 (Homebrew, Git, SVN, Ruby, Perl, Python)
トラブル① pyenv global が効かない
こちらのサイト様を参考にいたしました。
どうやってもsystem配下のPythonを優先してしまうので、とりあえずPATHの先頭に加えることで対処。
macでpyenvの環境を整えたい
.bash_profileに以下の記述を追加しました。
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
fi
続きまして、こちらのサイト様を参考にsip, PyQt5, Qtを整えていきます。
SIPとQtとPyQt5の再設定
sipとQtに関してはとりあえず公式から取ってきました。バージョンは上の通りです。
ここからはPyqt5のインストールに関してです。
まずはpython configure.pyです。
トラブル② Qt.5.3.2既存エラー
次のエラーが表示されました。
Error: Failed to determine the detail of your Qt installation. Try again using
the --verbose flag to see more detail about the problem.
次のサイト様を参考にしました。
PyQt5をmacにinstall
これにバグがあるとか。
~/Qt/5.3/clang_64/lib/QtCore.framework/Headers/qflags.h
#!if defined(_LP64_) && !defined(Q_QDOC)
Q_DECL_CONSTEXPR inline QFlag(long ai) : i(int(ai)) {}
これの一文目を、次のように変更。先頭の!を削除です。
#if defined(_LP64_) && !defined(Q_QDOC)
トラブル③ pyenv環境によるエラー
UnboundLocalError: local variable 'pylib_dir' referenced before assignment
このエラーなんですが、systemのPython(2.7.6とかだと思います)を対象にmakeをすると表示されません。
dynamic_pylib = '--enable-framework' in config_args
このconfig_argsに'--enable-framework'という値が含まれないため、pylib_dirにpyenv環境のライブラリパスが含まれないことが原因のようです。というわけで、超対処療法です。
これが原因で、最後の妥協を強いられたのかもしれませんが。。。
730行目前後です。
こんな感じのソースがあります。
if dynamic_pylib:
pyshlib = ducfg.get('LDLIBRARY', '')
このdynamic_pylibはbooleanなのですが、これを無理やり真にしてしまいます。
dynamic_pylib = True
とりあえず物は試しということで、これで作業を続けました。
これでようやくライセンスの確認までたどり着けました。
トラブル④ headerの参照ミス
これもHomebrew環境のみで起こる、単純な参照失敗みたいです。
qprinter.h自体はあるんですが、QtWebKitWidgetsから参照できていないようです。次の質問が参考になりました。
これを
'QtWebKitWidgets': ModuleMetadata(qmake_QT=['webkitwidgets']),
こんな感じに。
'QtWebKitWidgets': ModuleMetadata(qmake_QT=['webkitwidgets' 'printsupport']),
というわけで、python configure.py からもう一度やり直すことになりました。
ちなみに。
ちなみに。
Qt/5.3/clang_64/lib/QtPrintSupport.framework/Versions/5/Headers/qprinter.h
これを、cpコマンドを使って、次の階層にコピーするという強引な方法でも通りました。
Qt/5.3/clang_64/lib/QtWebKitWidgets.framework/Versions/5/Headers/qprinter.h
トラブル⑤ シンボリックエラー
最新のXCode (2014/10/31時点)はOSX10.9, 10.10向けなため、途中でシンボリックエラーが出る場合があります。私の場合は次の修正を行ったところ、エラーを抜けることができました。
~/Qt/5.3/clang_64/mkspecs/macx-clang/qmake.conf
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
~/Qt/5.3/clang_64 /mkspecs /qdevice.pri
!host_build:QMAKE_MAC_SDK = macosx10.8
これらの値を、とりあえず10.9にしてみました。
トラブル⑥ シンボリックエラー再び
ちなみにこんな感じのエラーです。
Undefined symbols for architecture x86_64
どうもQtというよりもXCodeとの齟齬が原因のようなのですが、エラーには変わりありません。これはdesignerのビルド時に発生していたらしく、この階層のpython.proを色々といじってみましたが、上手くいかず。
ですが、ここで当初の目的であるmac用実行可能形式ファイルを作成する、ということを最優先し、とりあえずdesignerとqmlsceneのビルドをしないことにしました。
PyQt5.proの次の部分を修正しました。
SUBDIRS = QtCore QtGui QtHelp QtMultimedia QtMultimediaWidgets QtNetwork QtOpenGL QtPrintSupport QtQml QtQuick QtSql QtSvg QtTest QtWebKit QtWebKitWidgets QtWidgets QtXmlPatterns QtDesigner QtDBus _QOpenGLFunctions_2_0 QtSensors QtSerialPort QtBluetooth QtMacExtras QtPositioning QtQuickWidgets QtWebSockets Enginio Qt pylupdate pyrcc designer qmlscene
ここから、最後のdesignerとqmlsceneを削除しました。
基本的にmacでアプリのデザインとかしないので、妥協しました。完全なmac環境が必要になった場合は、今の所pyenvを諦めてPythonの3系をsystemのバージョンとしてインストールしたほうが早そうです。。。
以上で、ひとまず別の環境で作ったPyQt5を含むソースを動かせるようにはなりました。あとはcx_Freezeあたりを利用して、appを作成すれば良いかと思います。
以上、対処療法による傷だらけの処置方法でした。
0 件のコメント:
コメントを投稿