USD (2016/8 版) をビルドしてみる

これは Pixar USD http://openusd.org に関する情報です。
2016/9/1 時点での version 0.7.0 に基づいており、モジュール構成などは今後変更される可能性があります。

前回の記事: [USD 入門編１：ライブラリ概要] (http://qiita.com/takahito-tejima/items/9261bb6dbe63fd72c377)

# 本当にビルドできるのか？
ええ、一応、できます。ただ現時点では Windows と OSX はなかなかの難易度です。その昔、Installer ML などを購読されていた方々にはいい題材なんじゃないかと思います。

### linux 版
これはそんなに難しくないはずです。少なくとも RedHat、CentOS、おそらく ubuntsu でも、依存ライブラリ（特に Python 関係が）とシステムのバージョンが違うときなどに混ざらないように注意さえすれば、基本的にはそのままビルドできる・・・はずです。ピクサーもそうですが、アニメーション・VFX業界はほとんど linux なので、これが一番テストされている無難な環境です。

依存関係からビルドするスクリプトを書いて github で公開してくださっている方も何人かいますし、travis の設定
https://github.com/PixarAnimationStudios/USD/blob/dev/.travis.yml
を見ていただければ、できるかぎり apt-get で進めるための手順がわかるかと思います。

### OSX 版
OSX 版は様々なコントリビューターのみなさんのおかげで、8月末くらいに USD の dev ブランチの最新版ではビルド自体は比較的すんなり通るようになりました。オープンソース万歳ですね。
https://github.com/vfxpro99/usd-build-club こちらが非常に参考になります。XCode beta が必要、python の DLL の名前が dylib->so にしないといけない、くらいに気を付ければいけると思います。
ただ、OpenGL がコアプロファイルでないと 4.x のコンテキストが取れないという OSX 特有の事情で、現在 usdview などで Hydra が使えません。これは実装の問題なので、近いうちに僕がどうにかします。Hydra でないシンプルな GL レンダラは動きますので、usd のコンポジションの雰囲気などを試すことはできるかと思います。

### Windows 版
難易度では一番難しいのが Windows 版です。OpenImageIO や OpenSubdiv を Windows でビルドしたことがある方なら手間がわかるかと思いますが、ざっくり言ってその５倍くらい面倒くさい、という感じです。
ですがこれも現在世界中のコントリビューターの方々含め対応が行われており、それぞれの実験ブランチではソースコード改変なしにビルドし、usdview が動く、というところまで来ています。本家のレポジトリでは dev_win_ip というブランチが最新になっています。

# では最難関の windows 版ビルド、やってみよう

できるはずーとは言ってましたが、実は僕自信まだちゃんとビルドしたことがありませんでした。というわけで週末を使って windows 版のビルドに挑戦してみました。いろいろ試行錯誤したせいで、半日以上かかりました。uimac さん本当にごめんなさい、という気持ちでいっぱいです。

### 最初に注意事項

 - **この手順をうのみにしないでください** 本来こんな苦労はいらないはずです。windows 移植作業に協力していただける方向けの情報源として使っていただけると幸いです。プルリクエストお待ちしてます（CLAにサインして送っていただく必要があります。[こちらをどうぞ] (http://graphics.pixar.com/usd/docs/Contributing-to-USD.html) ）
 - **全部 X64** でビルドします。ビルド済ライブラリを使う時には注意してください
 - 念のため VS2015 x64 Cross Tools Command Prompt で作業しました。
 - 面倒だったので c:\opt に全部入れました。この辺はもっといいやり方、いろいろあると思います。
 - c:\opt\local\ (include|bin|libs|shares) に Python と Qt、TBB 以外の依存ライブラリが全部入るようにしてます。適当です。というか windows の場合 DLL は全部同じ bin に入れるとかした方がいいですね...
 - 各依存ライブラリのビルドはそれぞれのディレクトリ内でやりましたが、別の場所でまとめてやればよかったと後悔してます。

### ツール類の準備

 - VisualStudio 2015 Community Edition
 - Qt 5.6 (opensource edition)
 - cmake 3.6.1
 - [NASM] (http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/win64/nasm-2.12.02-installer-x64.exe) (jpeg-turbo のビルドにだけ使います)
 - [Python 2.7] (https://www.python.org/ftp/python/2.7.12/python-2.7.12.amd64.msi)

Python は C:\Python2.7 に、Qt は C:\Qt にインストールしました。cmake, nasm には適当にパスを通しておきます。PIP もアップデートしたほうがいいかもですね（してないです）
Qt はいろいろ大変だし、実はいらないはずなんですよね・・・まだリリースされてないユニットテストで使ってるんですが、それも GLFW にしちゃって、PySide だけでいいようにしたいです。まあそのうち。


### Boost
いちからビルドしてもいいのですが、時間もかかるのでプレビルドパッケージを使いました。ここから
https://sourceforge.net/projects/boost/files/boost-binaries/1.61.0/
boost_1_61_0-msvc-14.0-64.exe をとってきて、c:\opt\local\include と c:\opt\local\lib にヘッダとライブラリをコピー（一貫性のないやり方で反省）

### TBB
https://www.threadingbuildingblocks.org/sites/default/files/software_releases/windows/tbb44_20160526oss_win_0.zip を c:\opt\tbb44_20160526oss として展開。

### zlib
http://zlib.net/zlib128.zip をとってきて、c:\opt\zlib-1.2.8 に展開。

```
cd \opt\zlib-1.2.8
mkdir build & cd build
cmake .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```

### Ptex (v2.1.28)

```
cd \opt
git clone https://github.com/wdas/ptex
cd ptex & mkdir build & cd build
cmake .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```

### GLFW (不要だけど、OpenSubdiv のサンプル用)

```
cd \opt
git clone https://github.com/glfw/glfw
cd glfw & mkdir build & cd build
cmake  .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```

### GLEW 1.13.0

https://sourceforge.net/projects/glew/files/glew/1.13.0/glew-1.13.0.zip/download
を c:\opt\glew-1.13.0 に展開

```
cd \opt\glew-1.13.0\build
cmake cmake -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```
（なんか微妙にうまくいってない。OpenSubdiv のビルド用だけは別途 VS 立ち上げてビルドした lib/glew32s.lib 使った）

### glext.h
https://www.opengl.org/registry/api/GL/glext.h を \opt\local\include\GL に保存する
これは glew でいいように直します

### OpenSubdiv dev branch

```
cd \opt
git clone https://github.com/PixarAnimationStudios/OpenSubdiv
git checkout dev
git pull
cd OpenSubdiv & mkdir build & cd build
cmake .. -G "Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=/opt/local -DNO_CUDA=1 -DNO_OPENCL=1 -DNO_DX=1 -DPTEX_LOCATION=/opt/local -DGLEW_LOCATION=/opt/local -DTBB_LOCATION=/opt/tbb44_20160526oss
cmake --build . --config Release --target INSTALL
```

### DoubleConversion

```
cd \opt
git clone https://github.com/google/double-conversion.git
cd double-conversion & del BUILD & mkdir build & cd build
cmake .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local 
cmake --build . --config Release --target INSTALL
```

### PySide (1.2.4)

```
c:\Python2.7\scripts\pip install pyside
```
これは Qt4 になります。

### PyOpenGL

```
c:\Python2.7\scripts\pip install pyopengl
```
これもいずれ不要になるはずですが、現状 usdview に必要

### OpenEXR

```
cd \opt
git clone git://github.com/meshula/openexr.git
cd openexr & mkdir build & cd build
cmake ..\IlmBase -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local 
cmake --build . --config Release --target INSTALL
cd ..
mkdir build2 & cd build2
cmake ..\OpenEXR -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local -DILMBASE_PACKAGE_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```
IlmBase と OpenEXR 両方ビルドするので気を付けよう


### jpeg

```
cd \opt
git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git
cd libjpeg-turbo & mkdir build & cd build
cmake .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```

### png

```
cd \opt
git clone git://github.com/glennrp/libpng.git
cd libpng & mkdir build & cd build
cmake .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```

### tiff

```
cd \opt
git clone https://github.com/vadz/libtiff
cd libtiff & cd build
cmake .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=/opt/local
cmake --build . --config Release --target INSTALL
```

### OpenImageIO

```
cd \opt
git clone https://github.com/OpenImageIO/oiio.git
cd oiio & mkdir build & cd build
cmake .. -G "Visual Studio 14 2015 Win64" -DCMAKE_PREFIX_PATH=/opt/local -DCMAKE_INSTALL_PREFIX=/opt/local -DCMAKE_CXX_COMPILER_WORKS=1 -DOPENEXR_CUSTOM_INCLUDE_DIR=/opt/local/include -DOPENEXR_CUSTOM_LIB_DIR=/opt/local/lib -DBOOST_ROOT="C:\opt\boost_1_61_0\boost" -DBOOST_INCLUDEDIR=/opt/local/include/boost_1_61_0  -DBOOST_LIBRARYDIR=/opt/local/lib -DBoost_USE_STATIC_LIBS=0 -DBoost_LIBRARY_DIR_RELEASE=/opt/local/lib -DBoost_LIBRARY_DIR_DEBUG=/opt/local/lib -DOCIO_PATH=/opt/local -DOIIO_BUILD_TESTS=0 -DUSE_PTEX=0
cmake --build . --config Release --target INSTALL
```

豆知識: Boost が見つからなくて困ったら、cmake に -DBoost_Debug=1 をつけるといろいろわかります。

### USD 本体

```
cd \opt
git clone https://github.com/c64kernal/USD
cd USD
git checkout dev_win_ip_g
mkdir build & cd build
cmake .. -G “Visual Studio 14 2015 Win64” -DCMAKE_INSTALL_PREFIX=C:/opt/local -DCMAKE_PREFIX_PATH=C:\Qt\5.6\msvc2015_64 -DTBB_INCLUDE_DIR=C:\opt\tbb44_20160526oss\include -DTBB_tbb_LIBRARY=C:\opt\tbb44_20160526oss\lib\intel64\vc14\tbb.lib  -DOPENSUBDIV_ROOT_DIR=/opt/local -DPYSIDEUICBINARY=c:\Python27\Scripts\pyside-uic.exe -DPXR_BUILD_MAYA_PLUGIN=0 -DPXR_BUILD_KATANA_PLUGIN=0
cmake --build . --config Release --target INSTALL
```
いよいよ本体のビルドです。ここだけで小一時間かかりました。
**注意: ここの CMAKE_INSTALL_PATH は絶対パスで、ドライブレターを含む必要があります。** C: 抜きに /opt/local.. などと書いてあると、実行時に "Plugin Info file XXX is not absolute" というエラーが出てしまいます。

## テスト
ビルドがうまくいけばインストールが終わり、c:\opt\local\bin に usdcat, usdedit, usdcheck といったツールができるはずです。といってもこれらのツールは python スクリプト。まずは

```
SET PYTHONPATH=c:\opt\local\lib\python
```
として モジュールを読めるようにしておきます。
さて、ではようやく python を立ち上げて、Tfモジュール読んでみます

```
> python
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pxr import Tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\opt\local\lib\python\pxr\Tf\__init__.py", line 85, in <module>
    from . import _tf
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

失敗。で、_tf.dpy が依存してる DLL 群はほとんど c:\opt\local\lib にあるのですが、tbb.dll だけ別のフォルダにいれてたのを忘れてました。これもパスの通ったところにコピーしてやると

```
> python
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
>>> from pxr import Tf
>>> Tf.__doc__
'\nTf -- Tools Foundation\n'
```

と、ひとまずなんか動いてますね。Gf もチェックしてみます。

```
>>> from pxr import Gf
>>> Gf.Vec3d(1,0,0) + Gf.Vec3d(0,1,0)
Gf.Vec3d(1.0, 1.0, 0.0)
```

大丈夫でした。では usd ファイルを用意します。

```cube.usd
#usda 1.0

def Cube "Cube"
{
}
```

usdcat で表示してみると

```
C:\opt\local\bin>usdcat cube.usd
#usda 1.0

def Cube "Cube"
{
}
```

ちゃんと出てきました。

```
C:\opt\local\bin>usdview cube.usd
```

![スクリーンショット 2016-09-04 07.58.55.png](https://qiita-image-store.s3.amazonaws.com/0/64544/c48273f2-c996-3651-3118-7fa82a71a219.png)

どうにか usdview が動くところまでたどり着きました！ワイヤーフレーム表示ができなかったり、いろいろ怪しいですが。

# おわりに
usdview が動くと、Usd のもつ高度なコンポジション機能をじっくり調べてみることができます。ピクサーのプロダクションでは usdview が日々のデータのデバッグに欠かせないツールになっています。また今回は alembic プラグインはビルドしませんでしたが、alembic を usd として読み込むことも可能で、usdview で巨大な alembic ファイルも快適にプレビューすることができます。いずれ詳しくご紹介したいと思います。

ごらんのとおり現状のビルドはやや難易度が高い状態ですが、ピクサー社内で毎日更新しているソースも都度 github 側にフィードバックしていますし（dev ブランチのアクティビティを見てください）、外部からもビルド環境の改善のためにプルリクエストを頂いてます。windows パッチも遠からずメインにマージされると思いますので、しばらくは暖かく見守ってもらえればと思います。