OpenShadingLanguage


Win7 64bit + VS2012pro でstaticライブラリ+コンパイラなどの実行ファイルをビルドしました。

ビルド難易度、超高いです。

まずOSLをビルドするために必要なOIIOとLLVM(clang付き)とboostをビルドします。

その前に、OIIOをビルドするために必要なOpenEXRとilmbaseとboostとzipとpngとjpegとtiff、あと使うならfreetypeとかField3Dとかもビルドします。(今回はField3Dは使っていません)

ビルド構成によっては、python2.7あたりも必要だった気がするので、念のためインストールしておきます。

それからbison-flexが必要なので落としておきます。
(win_flex_bison-latestを落としました)



以下各ビルドでハマったところ。(覚えている限り)

MD/MDDでビルドしています。
  • boost
    特に無いです。普通に32bit/64bit/Debug/Releaseをビルドします。1.51を使用しました。
  • png、jpeg、tiff、freetype2
    特に無いです。普通にビルドします。
  • ilmbase
    v2.1.0を使用しました。1系だとOIIOがビルド通らなかったです。
    ビルドはvc8用プロジェクトを変換して使用しましたが、CMakeでやったほうが良さそうです。
    ビルドはstaticライブラリなので
    プリプロセッサの、OpenEXR_DLLや、~EXPORTSを削除しました。
    また、ビルド後イベントを全部削除しました。
    あとは普通にビルドです。
  • OpenEXR
    v2.1.0を使用しました。1系だとOIIOがビルド通らなかったです。
    ビルドはvc8用プロジェクトを変換して使用しましたが、vc8用プロジェクトはメンテされていないようで、
    プロジェクトにソースファイルが全部入っていないので注意です。
    CMakeでやったほうが良さそうです。
    あとはilmbaseと同じです。
  • OIIO
    releaseの1.3.13を使用しました。
    ハマったところとしては、上に書きましたがOpenEXRは2系が必要です。
    staticライブラリを作るし、全てstaticライブラリで使っているので、プリプロセッサのBOOSTなんちゃらDYNAMICとか、OpenEXR__DLLとか、それっぽいdefineを削除します。

    また、最悪なことに、インクルードディレクトリがいちいちおかしいです。
    OpenEXR/~.hというディレクトリを期待しているようなのでので、ソース側を全部書き換えるか、諦めてそのようなパスで通るように配置します。

    staticビルドにしておいても、winだとdllimportとか使ってるみたいでビルドが通らないので、手作業でexport.hやptex関係の似たような#defineを修正します。
    具体的には
    #if defined(OpenImageIO_EXPORTS)

    #if defined(OpenImageIO_EXPORTS) || defined(OpenImageIO_Util_EXPORTS)
    に変更。また、
    #define OIIO_API OIIO_IMPORT
    となっているところを
    #define OIIO_API 
    にしたりします。このあたり詳しくないのでこれでいいか分からないです。

  • LLVM
    OIIOに比べると超簡単です。
    clangをtools/clangに配置します。
    まず依存が無いのでCMakeで引っかからずgenerateできます。CMake-guiの時点で、clang関係のエントリが無い場合はclangの配置を間違えていると思われます。
    また、CMakeは32/64bitでそれぞれ作り直さないと後ほどリンクが上手くいかないです。(VCで32bit→64bitソリューション作るのはダメです)

    LibrariesのLLVM~を全て選択して右クリック→選択範囲をビルドします。
    大量にlibが出来るので、OSLのアプリにリンクさせるのがなかなか面倒です。

    それからWin32のReleaseのみでよいですが、Clang librariesを全て選択して選択ビルドして、clang executablesのclang本体をビルドしました。こちらで出来たclangの実行ファイルを、OSLビルドで使用します。
  • OSL
    Release-1.5.7devで試しましたが、OIIO1.3.13に合うのはRelease-1.5.6devでしたので、
    Release-1.5.6devでビルドしなおしました。
    これもOIIOと同じくインクルードにOpenEXR/~.hというディレクトリを期待していたり、OIIO/~というディレクトリを期待していたり、いろいろひどいです。

    externalpackages.cmakeの193行目~208行目あたりのstring(~) と、それに付随するif-else節を削除しました。OSL_LLVM_VERSIONは手動で定義してLLVMのバージョンの.を抜いたものを入れておきます。3.4なら34。

    ビルドするとTINYFORMAT_ALLOW_WCHAR_STRINGSのあたりでエラーになったので、とりあえずプリプロセッサの定義にTINYFORMAT_ALLOW_WCHAR_STRINGSを追加したら通りました。

    また、OIIO::のネームスペースが無いため、VCでデフォルトで使える関数と被っていてビルドが通らない箇所がありました。3,4行にOIIO::を付けた気がします

    oslc/oslcomp/oslinfo/oslqueryはビルド通ったのですが、oslexecがbashスクリプトを叩いているようなので、cygwinを入れて、hexdumpを使うために、"util-linux-"なんとかというのをインストールします。

    oslexecのビルド時にbashスクリプトをCMakeスクリプトから実行しようとしているようですが、これを上手く実行させるやり方が不明です。さっぱり分からなかったので、手動で実行させました。
    まず、src/liboslexecのディレクトリをカレントにして,
    $  chmod +x serialize-bc.bash
    $  ./serialize-bc.bash llvm_ops.bc llvm_ops.bc.cpp
    でOKです
    その後ビルドすると、ファイルが開けないのでアプリを聞いてくるダイアログが出ますが、キャンセルでOKです。

    USE_MCJIT=1でビルドしたところ、サンプルアプリのtestrenderでIncompatible object format!とエラーが出て、レンダリングできなかったので、USE_MCJIT=0にしました(ちょっと残念)
    また、testrenderですが、実行ファイルがある階層の2つ上の階層にshadersというフォルダがあり、その中にstdosl.hがあることを期待しているようなので注意してください。

    OIIOとOSLは、このように依存が多く巨大で複雑なので、staticじゃなくてdynamicで使ったほうが良いかなと思いました。趣味なのであえてstaticリンク使ってますが、基本的に安全面に不安が残るので趣味以外では使わないほうがよさそうです…

Comments