cuemol2

MacOS X Yosemite 10.10 (とそれ以降)でのbuild環境構築

CueMol2のバージョンに合った環境を用いる必要がある。 ここでは、

  • CueMol 2.2.3.X (git branch vs2013test)
  • MacOS X 10.10 (Xcode 6.4)
  • boost 1_64/CGAL 4.10

を用いた64bit versionのbuild環境構築方法を説明する。

Directory構成

基本、以下のようなdirectory構成を使用する

  • Home
    • proj64
      • cuemol2 (CueMolのsource treeを展開)
      • boost_1_64 (以下にBoostをinstall)
      • xulrunner/xulrunner-39.0-sdk (以下にxulrunner-sdkを展開)
      • CGAL-4.6.1 (以下にCGALをinstall)
      • ...
    • src
      • ... (各々のsource)

SIPの無効化

SierraなどではDYLD_*を効くようにするため、SIPを無効にする必要あり。

Xcodeのinstallなど

xcode-selectをやると芋づる式に?command line toolsがinstallされる。 基本ネットでググった通りにやった.

 xcode-select --install

環境変数MACOS_DEPLOYMENT_TARGETを、10.6にする。(これをやらないと古いOSで走らないbinaryができてしまう)

 setenv MACOSX_DEPLOYMENT_TARGET 10.6

clang 8.1.0では、以下のようなwarningがでてlibc++とdeployment target 10.9以降を使うようにと出てくるが、互換性を考えて10.6以降+libstdc++を使用してbuildする。

 clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]

Homebrewのinstall

Homebrewのサイトの通りにインストール。

インストール後、一応mozillaのbuildに必要な物一通りも入れた。

 > brew install yasm gawk libidl ccache python

さらに、autoconf (mozillaで入れるのは古いやつなので、一応最新版を入れる)、automake、libtoolを入れる

 > brew install autoconf automake libtool

xulrunner

xulrunner-39.0 SDKをここから取ってくる

proj64以下に展開すると、xulrunner-sdk以下に展開されるので、xulrunner-39.0-sdkとrenameする。

BOOSTのinstall

boost_1_64_0をここから取ってきて、$HOME/src/以下に展開。

bootstrap.shを実行→bjamができる。 以下のbuild scriptを作成&実行(XXは適宜バージョン番号を入れる)

 #!/bin/sh
 instpath=$HOME/proj64/boost_1_64
 
 ./b2 \
  cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++" \
  --prefix=$instpath \
  --with-date_time \
  --with-filesystem \
  --with-iostreams \
  --with-program_options \
  --with-regex \
  --with-system \
  --with-thread \
  --with-chrono \
  architecture=x86 address-model=64 link=shared,static threading=multi install

Xcode8.2.1 (clang 8)での問題点

cxxflags/linkflagsを指定しないと、std::__1::xxというのとリンクされるが他のプログラム(CueMolも)はstd::xxに対してリンクされるため実行時にシンボルが見つからないという問題が起こった。以下のオプションを追加してbuildし直したら動いた。

 cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"

FFTW

fftw-3.3.4.tar.gzを取得、~/src/以下に展開後、以下を実行する。

 > env CFLAGS="-m64 -fast" ./configure --enable-float --prefix=$HOME/proj64/fftw --disable-fortran --enable-sse

(-m64はいらないかも。)

make&make installで完了

GLEW

glew-2.0.0.tgzを取得、~/src/以下に展開後、以下を実行

 > env GLEW_DEST=$HOME/proj64/glew make
 > env GLEW_DEST=$HOME/proj64/glew make install

glew-2.0.0では、GLEW_DESTを環境変数で指定しても効かない。Makefileを書き換える必要あり。

CGAL

CGAL-4.10.tar.bz2をダウンロード、~/src/以下に展開。

CMakeをインストール(単にdmgからインストールするだけ) cmake-guiへのpathが通らないが。。。 上記で展開したCGALのsrc directoryに移動し、CMake.appから適当に探してフルパス指定で実行

 > /Applications/CMake.app/Contents/bin/cmake-gui .

GUIのdialogが現れる。以下のmacroを定義する。

  • BOOST_ROOT $HOME/proj64/boost_1_64
    (ただし、$HOMEはつかえなかったので手動で展開し入力)
  • CMAKE_INSTALL_PREFIX $HOME/proj64/CGAL-4.10
    (ただし、$HOMEはつかえなかったので手動で展開し入力)
  • CGAL_DISABLE_GMP true
    (GMP/MPRFを使用しないように指定)

一旦Configureを実行→いろいろ出てくる 不要な物(CGAL_ImageIO, CGAL_Qt4, CGAL_Qt3)はbuildしないようにcheckを外す

native compiler用のMakefileを生成

GUIを終了させ、make&make installすると、~/proj64/CGAL-4.10以下にinstallされる。

CueMol2のbuild方法

以上でbuild環境は整ったはず。

Source codeのcheckout

詳しくはcuemol2/SrcRepository参照。

  • Anonymous (http)
     > git clone https://github.com/CueMol/cuemol2.git cuemol2
  • 特定ユーザー (ssh)
     > git clone git@github.com:CueMol/cuemol2.git cuemol2

あとはvs2013testのbranchに切り替える。

 > cd cuemol2
 > git checkout vs2013test
 > git branch (--> vs2013testと表示される)

以下では~/proj64/cuemol2以下にcheckoutしたとする.

configureスクリプトの実行とbuild

以下buildは,~/proj/cuemol2/uxbuildにて行うのでcdで移動.

configureを走らせるためのスクリプトrun_config_osx.shが,~/proj/cuemol2/uxbuildにあるので,必要に応じて編集. (これを使わなくても出来なくもないが,いちいちキーボードから入力するのは面倒なので)

library等のインストール位置を上述から変更していない場合は, CVS repositoryにあるrun_config_osx.shそのままで動くはず. インストール位置を変えている場合は,gecko_sdk_dirやboost_dirを変更する.

エラー無くconfigureスクリプトが生成され,さらにMakefileが生成されたら,makeコマンドを実行.buildが行われる.

Xcodeが6.4でない場合などにconfigureが失敗する、あるいはbuildが最後までいかないことがある。

お試し実行など

MacOS Xでは,適切な位置にxulやxpcom関連のファイルが配置されていないとアプリとしてちゃんと動かない.

make installを実行すると,~/proj/cuemol2/uxbuild/osxbuild以下にCueMol2.appが作成される. jsやxul関連のファイルはjarファイルにまとめられる. 他の必要なXULのファイルなどはsymbolic linkが作成される.

/proj64/cuemol2以下にsourceを展開している場合は,

 arch -64 ~/proj64/cuemol2/uxbuild/osxbuild/CueMol2.app/Content/MacOS/cuemol

でterminalから起動可.

debugと開発に使用可能.

"component not loaded"というerror等が出て起動しない場合は、dyldがこけている可能性大。

 setenv NSPR_LOG_MODULES linker:5

と環境変数を設定して起動するとprlink.cでのエラーがterminalに出るようになるので、 何が原因で起動しないか検証することが可能になる(linkerをallにするとすべてのモジュールでのログが表示されるようになる)

ただし、xulrunner39では上記の設定でもdlerrorの返すmessageはすべて表示されないので何のsymbolが見つからずにこけているのかわからなかった。結局sourceにprintfを埋め込んでdebug版xulrunnerを作り、調べる必要があった。

macOS Sierraでは、dyldが改善されたのかDYLD_PRINT_APISや、DYLD_PRINT_BINDINGSなどで失敗した原因が表示されるようになっていた。

配布パッケージの生成

src/osxbuild下でmake builddmgを実行すると,CueMol2-<version番号>-MacOSX-Intelというフォルダが作成され,その中にもCueMol2.appというのが出来ているが,これはsymbolic linkではなくすべてコピーになっているので,コピーすることで他のMacでも実行できるはず.あとさらに,同じ内容が入ったdmgファイルも作成される.

Finderなどから起動する場合は,Dynamic link library (dylib)のパスを適切に書き換えとかないと,見つからなくて正常に起動できなくなる.dylibファイルに書き込まれているパスをあとで書き換えるためには,ファイル中にある程度スペースが確保されていないと書き換えに失敗する(make builddmgが中断する).

これを防ぐには,configure時にLDFLAGS=-Wl,-headerpad_max_install_namesを指定して十分なスペースを確保しておけばよい.(一応現バージョンを上記の方法・位置でbuildする限りはこのようなerrorは起きていない。)

その他注意点

run_config_osx.shは,src/configureが存在する場合はautoconf/automake系のconfigure生成コマンドを実行しないので,強制的に再実行したい場合はsrc/configureを削除する.

`%'-style pattern rules are a GNU make extension という警告が出るが,gnu makeを使用しているので,気にする必要はない(これはlinuxも同様)

Mozilla build用にHomebrewでautoconfをinstallした場合, Mozillaのサイトにversion 2.13を入れるように指示があるが, それだとautomake系のコマンドがちゃんと動かなくなってしまうので, 最新版を入れておく必要がある.(単にbrew install autoconfとしておけばOK)

POV-Ray 3.7のbuild

画像レンダリング機能を使用するにはPOV-Rayのcommand line versionが必要.

以前はMacOS Xでソースからbuildすると動かない(真っ黒な画像しか出来ない)バイナリーしか出来なかったが,最近(2016/5/17)試してみたら出来たので今後はそれで.(原因はpovray側のバグが取れたというよりも新しいXcodeを使ったからかも...)

githubから,v3.7.0.20140613というtagを取ってきた(3.7.0-stable branchでも良いのかもしれない) その後,yosemite/clang(LLVM 7.0.2/clang-700.1.81)以下の順でbuildした.

  • libraries/png以下で,
     make -f scripts/makefile.gcc
    を実行して,libpng.aを作っておく.また,パスの制限の関係から,libraries以下で,
     ln -s png include
    を実行して,include/png.hが見えるようにしておく.(include/libraryをちゃんと作って,その下に.a, .hをコピーしたほうが良いのかも)
  • unix/prebuild.shを実行する→configureができる
  • configureを実行
     ./configure --with-boost=$HOME/proj64/boost_1_57 --with-libpng=<povray's src path>/libraries/png --without-libjpeg --without-libtiff --without-libsdl --without-libopenexr
    適宜,COMPILED_BYなども定義する.
  • make実行→一応binaryができる.

ただし,できたbinはlibboost_XX.dylibにdynlinkしてしまっている.(これは,configureに--disable-sharedを付けてもstatic linkはしてくれなかった).

最後のリンクの部分だけ手動で実行して(直接XX.aを指定すればよい)作成したbinは.aの方にstatic linkされていた.

以上で作成したものは,問題なくrenderingできた.さらに,2600px以上の画像も問題なく作成できた(c.f. https://github.com/CueMol/cuemol2/issues/35)


Last-modified: Thu, 07 Sep 2017 18:57:18 JST (78d)