PySide2をビルドしてみる

この記事は[Maya-Pythonアドベントカレンダー2016](http://qiita.com/advent-calendar/2016/maya-python)の12月18日の記事です。


# はじめに

Maya2017はPySideがPySide2になったのは皆さんご存知の通り。

この変更によっていくつか困った事案が発生しています。

* うちはスタンドアロンアプリ、Maya、MotionBuilder、Photoshop、等々すべてGUIはPySideで構築しているのですが、MayaだけPySide2になられるといろいろ共有できなくなってしまう
* uiファイル等は必ずPythonコードに変換して使うことにしてるので、Mayaにはpyside-rcc.exeが入ってないので困った

解決方法を模索するためにもPySide2を検証せねばと考えているんですが、Mayaで採用されているのはまさかのPySide2のアルファ版。
[PyPI](https://pypi.python.org/pypi?%3Aaction=search&term=pyside&submit=search)にはまだ登録されてないです。
頼りの[Unofficial Windows Binaries for Python Extension Packages](http://www.lfd.uci.edu/~gohlke/pythonlibs/)にも無いです。

心の底からめんどくさいンだけど、ビルドに挑戦してみようと思います。
たぶん失敗するのですが、少しでも誰かの助けになれば本望です。

# 環境

鬼門だらけのような気もしますが、検証したのは以下の環境です。
推奨はVisual Studio 2008ですが、嫌なので使いません。

* Windows10
* Python 2.7.12
* Visual Studio 2015 Community


# 準備


http://wiki.qt.io/PySide2_GettingStarted

とりあえず必要なソフトウェアのインストール。PCがわりと新し目なのでいろいろ入ってない。


1. [gitリポジトリ](http://code.qt.io/cgit/pyside/pyside-setup.git/)をクローン。とりあえず```C:\pyside\pyside-setup```としました
1. Qtは5.6とのことなので、Qt 5.6.2 for Windows 64-bit (VS 2015)を[Qt](https://www.qt.io/download-open-source/)からダウンロード。
1. [CMake](https://cmake.org/)でビルドするようなのでCMake3.7.1をダウンロード。


# ビルドに挑戦

## virtualenv作成

virtualenv推奨とのことなので、作成して有効化。

```
pushd C:\pyside
python -m virtualenv venv27
venv27\Scripts\activate.bat
```

## git submodule --init

pyside-setup.gitからsubmoduleでpyside2やshiboken2やらのリポジトリにつながってるので、git submodule --initします。めんどくさいからTortoiseGitでやってるのでコマンドは割愛。

![2016-12-17_13h21_19.png](https://qiita-image-store.s3.amazonaws.com/0/13183/1a90f1b4-611b-5d86-c91e-5d91bdb1b80c.png)

全submoduleでエラーが出ましたが、もう1回挑戦したらエラーも出ず、成功しました。



## ビルド

おまじない

```
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
```

パスを指定してビルド

```
python setup.py install --build-tests --qmake="C:\Qt\5.6\msvc2015_64\bin\qmake.exe" --cmake="C:\Program Files\CMake\bin\cmake.exe"
```

エラー

```
[ 10%] Building CXX object ApiExtractor/tests/CMakeFiles/testdtorinformation.dir/testdtorinformation_automoc.cpp.obj
testdtorinformation_automoc.cpp
[ 10%] Linking CXX executable testdtorinformation.exe
Qt5Core.lib(Qt5Core.dll) : fatal error LNK1112: モジュールのコンピューターの種類 'x64' は対象コンピューターの種類 'X86' と競合しています。

LINK failed. with 1112
NMAKE : fatal error U1077: '"C:\Program Files\CMake\bin\cmake.exe"' : リターン コード '0xffffffff'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : リターン コード '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : リターン コード '0x2'
Stop.
error: Error compiling shiboken2
```

早いよ。64bitでビルドしてないのか。

testプログラムのリンクでエラーを出してるようなので、テストは作成しないことにしよう。

```
python setup.py install --qmake="C:\Qt\5.6\msvc2015_64\bin\qmake.exe" --cmake="C:\Program Files\CMake\bin\cmake.exe"
```

だいぶ進んだ（といってもsiboken2だけど）が、やはりエラー

```
[ 80%] Building CXX object libshiboken/CMakeFiles/libshiboken.dir/shibokenbuffer.cpp.obj
shibokenbuffer.cpp
[ 81%] Linking CXX shared library shiboken2.dll
python27.lib(python27.dll) : fatal error LNK1112: モジュールのコンピューターの種類 'x64' は対象コンピューターの種類 'X86' と競合しています。

LINK failed. with 1112
NMAKE : fatal error U1077: '"C:\Program Files\CMake\bin\cmake.exe"' : リターン コード '0xffffffff'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : リターン コード '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : リターン コード '0x2'
Stop.
error: Error compiling shiboken2
```

真剣に調べよう。X64ってどこで指定するんだろ？

やっぱりMakefileを読んでも分らんなぁ。

CMakeではVisual Studio 2015付属のコマンドプロンプトにするという[記事](http://kumar.hateblo.jp/entry/2014/10/05/184722)がいくつか見つかる。

「おまじない」が甘かった。

```
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
```

wheel作成を指定するオプションもあったのと、ほっとくとgitコマンドを実行してしまうようなので無効化するようにコマンドオプションを変えてビルド実行。

```
python setup.py bdist_wheel --ignore-git --qmake="C:\Qt\5.6\msvc2015_64\bin\qmake.exe" --cmake="C:\Program Files\CMake\bin\cmake.exe"
```

setup.pyにはOpenSSLを指定するオプションもあったのでよくよくログを見るとOpenSSLが無効になっている。あちゃー、まいっか

```
Qt docs: C:/Qt/Docs/Qt-5.6
Qt plugins: C:/Qt/5.6/msvc2015_64/plugins
---
OpenSSL libs: None
==============================
Building module shiboken2...
```

それから30分後・・・

ビルド通ってしまった。不思議なこともあるもんだ・・・

```
running install_egg_info
Copying pyside_package\PySide2.egg-info to build\bdist.win-amd64\wheel\.\PySide2-2.0.0.dev0-py2.7.egg-info
running install_scripts
*** Install completed
C:\pyside\venv27\lib\site-packages\wheel\pep425tags.py:77: RuntimeWarning: Config variable 'Py_DEBUG' is unset, Python ABI tag may be incorrect
  warn=(impl == 'cp')):
C:\pyside\venv27\lib\site-packages\wheel\pep425tags.py:81: RuntimeWarning: Config variable 'WITH_PYMALLOC' is unset, Python ABI tag may be incorrect
  warn=(impl == 'cp')):
C:\pyside\venv27\lib\site-packages\wheel\pep425tags.py:87: RuntimeWarning: Config variable 'Py_UNICODE_SIZE' is unset, Python ABI tag may be incorrect
  sys.version_info < (3, 3))) \
creating build\bdist.win-amd64\wheel\PySide2-2.0.0.dev0.dist-info\WHEEL

(venv27) C:\pyside\pyside-setup>
```

## インストール

wheel出力先は```dist\PySide2-2.0.0.dev0-cp27-cp27m-win_amd64.whl```です。
今の環境にpip installしてしまうと問題が起こったときに原因がわかりにくいので、新たにvirtualenvを作ってインストールしてみます。

```
(venv27) C:\pyside\pyside-setup>deactivate
C:\pyside\pyside-setup>cd ..
C:\pyside>
C:\pyside>python -m virtualenv venv_pyside
C:\pyside>venv_pyside\Scripts\activate.bat
(venv_pyside) C:\pyside>python -m pip install pyside-setup\dist\PySide2-2.0.0.dev0-cp27-cp27m-win_amd64.whl
Processing c:\pyside\pyside-setup\dist\pyside2-2.0.0.dev0-cp27-cp27m-win_amd64.whl
Installing collected packages: PySide2
Successfully installed PySide2-2.0.0.dev0
(venv_pyside) C:\pyside>python -m pip freeze
PySide2==2.0.0.dev0
```

ではサンプルが動くか確認しましょう。

```
(venv_pyside) C:\pyside>python pyside-setup\sources\pyside2-examples\examples\dialogs\standarddialogs.py
```

動きました。

![2016-12-17_15h30_29.png](https://qiita-image-store.s3.amazonaws.com/0/13183/da3545cc-280d-ae23-f3c5-8eeba62fe4a2.png)

目的のリソースコンパイラ！
とりあえず動くような雰囲気だけ確認して、動作確認はまた今度。ふー。

```
(venv_pyside) C:\pyside>C:\pyside\venv_pyside\Lib\site-packages\PySide2\pyside2-rcc.exe
PySide2 resource compiler
Usage: C:\pyside\venv_pyside\Lib\site-packages\PySide2\pyside2-rcc.exe  [options] <inputs>

Options:
    -o file           Write output to file rather than stdout
    -py2              Generate code for any Python v2.x version
    -py3              Generate code for any Python v3.x version (default)
    -name name        Create an external initialization function with name
    -threshold level  Threshold to consider compressing files
    -compress level   Compress input files by level
    -root path        Prefix resource access path with root path
    -no-compress      Disable all compression
    -version          Display version
    -help             Display this information
```


# まとめ

意外なことにビルドはすんなり通ったし、とても短時間で終わった。

```
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64

python setup.py bdist_wheel --ignore-git --qmake="C:\Qt\5.6\msvc2015_64\bin\qmake.exe" --cmake="C:\Program Files\CMake\bin\cmake.exe"

python -m pip install dist\PySide2-2.0.0.dev0-cp27-cp27m-win_amd64.whl
```

ソースのリビジョン書き忘れてた。

```
> git rev-parse HEAD
6026e8b4f22d630e4e61424e153a605c060c22bb
> git submodule status
+eef6e46bf205e76616ae3fbfca92c917df22b6c4 sources/pyside2 (1.2.2-399-geef6e46)
+4ca11515b6c5376269cb91a4975e8c5b71a2cdb4 sources/pyside2-examples (heads/dev)
 7fe32567c75b6b9985b9efbecf74477c9e829fb2 sources/pyside2-tools (heads/dev)
+8611bda3b346762e0589402f130b73f20dd75914 sources/shiboken2 (1.2.2-168-g8611bda)
+ed7b7ceddc2c0ec6115d58a0611441d972ea1f97 wiki (heads/master)
```

OpenSSLも無効だし全然動作確認してませんが、とりあえず共有しておきます。ダウンロードは[こちら](https://drive.google.com/file/d/0B8iSX-bz8WcHWnc4THVZZ2pXVm8/view?usp=sharing)



# 参考

https://fredrikaverpil.github.io/2016/08/17/compiling-pyside2/