FreeCAD 0.13 のビルド

Ubuntu Linux系におけるFreeCAD 0.13系 のビルドに関するノート。
今回は、Ubuntu系であるEdubuntuの64ビット版にて、ビルドを行ってみた。

OSのバージョン選択

Ubuntu系でdebパッケージを作る場合は、debユーティリティの依存関係から(11.xx以下では、バージョンの陳腐化によって未対応となるので)12.04.1以降のシステムが望ましい。

またlibboostのバージョンは、1.48系を推奨とする。Ubuntu 12.10系においてlibboostのバージョンは、1.49系に移行している。

14.04α系において、libboostのバージョンは1.48系(リリース版は1.54系)となっている。しかし、libcoin60-devのパッケージがリポジトリから外されて代わりにlibcoin80-devが採用された。coinのバージョン番号が異なるだけではなくインクルードファイルのファイル名やヘッダファイル内の記述等々に仕様変更があったようで、src/3rdParty/Pivy-0.5/ 周りでビルドエラーがでる。つまりバイナリのオブジェクトを拝するにはコードに手を入れる必要がある。
あるいは、FreeCAD内部Pivyコードのビルドを諦めて、cmakeでコンパイルオプションを変えてバイパスさせてしまうしかない*1

cmake -DFREECAD_USE_EXTERNAL_PIVY=true

ということで、当面はUbuntu 12.04.x系のOSを選択する方が無難であろう。

依存パッケージのバージョン

その他にも確認すべきパッケージのバージョンを以下に示す。*2

パッケージ バージョン 公式サイト
Python >= 2.5.x http://www.python.org/
OpenCasCade >= 5.2 http://www.opencascade.org/
Qt >= 4.4.x*3 http://www.qtsoftware.com/
Coin3D >= 2.x < 3.0 http://www.coin3d.org/
ODE >= 0.10.x http://www.ode.org/
SoQt >= 1.2 http://www.coin3d.org/
Xerces-C++ >= 2.7.x < 3.0 http://xml.apache.org/xerces-c/
GTS(GNU Triangulated Surface Library) >= 0.7.x http://gts.sourceforge.net/
Zlib >= 1.x.x http://www.zlib.net/
Boost >= 1.33.x http://www.boost.org/
Eigen >= 3.0.1 http://eigen.tuxfamily.org/index.php?title=Main_Page

依存関係

ドキュメント*4でインストールが必要とされているパッケージ

build-essential
cmake
python
libtool
libcoin60-dev
libsoqt4-dev
libxerces-c-dev
libboost-dev
libboost-filesystem-dev
libboost-regex-dev
libboost-program-options-dev 
libboost-signals-dev
libboost-thread-dev
libqt4-dev
libqt4-opengl-dev
qt4-dev-tools
python-dev
gfortran
libeigen3-dev
libqtwebkit-dev
libode-dev
swig
libzipios++-dev

opencascadeは、正規版とコミュニティ版のいずれかをインストールする。 
なおUbuntu系メイン・リポジトリではコミュニティ版OCEを採用している。

コミュニティ版
liboce*-dev oce-draw
正規版
libopencascade-dev opencascade-draw

正規版を使う場合は、Cmakeの実行時にコミュニティ版が見つからないとケチつけるワーニングが出るが、無視してよい。

CMake Warning at CMakeLists.txt:218 (find_package):
  Could not find module FindOCE.cmake or a configuration file for package
  OCE.

  Adjust CMAKE_MODULE_PATH to find FindOCE.cmake or set OCE_DIR to the
  directory containing a CMake configuration file for OCE.  The file will
  have one of the following names:

    OCEConfig.cmake
    oce-config.cmake

Debパッケージ生成で求められる依存関係(Build-Depends)

debhelper (>= 7.0.50~), autotools-dev, libtool, automake, 
 autoconf, libboost-dev, libboost-date-time-dev, libboost-filesystem-dev,
 libboost-graph-dev, libboost-iostreams-dev, libboost-program-options-dev,
 libboost-regex-dev, libboost-serialization-dev, libboost-signals-dev,
 libboost-python-dev, python-dev, python-support,
 libqt4-dev, libxt-dev, libxext-dev, libxmu-dev, libxi-dev, libx11-dev,
 libcoin60-dev, libsoqt4-dev (>= 1.4.2~svn20090224), libeigen3-dev, libgl1-mesa-dev,
 zlib1g-dev, libxerces-c2-dev, libopencascade-foundation-dev, libopencascade-modeling-dev, 
 libopencascade-visualization-dev, python-cxx-dev, libswscale-dev, 
 libzipios++-dev, swig, gfortran, libqtwebkit-dev

FreeCAD 0.13のビルドでは、libboostのバージョン1.4.8以降を要求する。Ubuntu 12.04.x系では何故かlibboostのバージョン1.4.6となているので、自明適にバージョンを指定する必要がある。

そのほか、推奨されるパッケージ

Teigha File Converter
DWG形式のファイルをサポートするのに必要なファイルコンバータ。*5
pycollada
交換用ファイルフォーマットCOLLADA*6Pythonバインディング*7
python-matplotlib
Python based plotting system in a style similar to Matlab*8
libode-dev
Open Dynamics Engine*9 いわゆる物理計算エンジン。
pyOpenCL
PyOpenCL lets you access the OpenCL parallel computation API from Python.*10
nvidia-current
NVIDIA binary Xorg driver, kernel module and VDPAU library.*11
doxygen
Documentation system for C, C++, Java, Python and other languages
doxygen-doc
Documentation for doxygen*12
graphviz
豊富なグラフ描画ツールセット*13
PovRay
レイトレーシングエンジン*14。CGで見た目を確認するために必要なのだが、Ubuntuリポジトリでパッケージ提供のあるのはhardy、lucid、oneiricの3バージョンのみのようだ*15Ubuntu 12.xx.x系にインストールするには、本家サイトよりソースパッケージを取得してビルドする必要がある。
libspnav-dev
Library to access 3D-input-devices*16. FreeCADでは、3Dマウスでの入力を扱うことができる。 (for 3Dconnexion devices support like the Space Navigator or Space Pilot)
libsimage-dev
to make Coin to support additional image file formats.
python-pivy
needed for the 2D Drafting module.
python-qt4
needed for the 2D Drafting module.
checkinstall
to register your installed files into your system's package manager, so yo can easily uninstall later. 自前ビルドやtarbalパッケージのインストール管理ができるようにする代物のようだ。
libgts-dev
GNU Triangulated Surface Library(GTS)*17は、ポリゴン・メッシュの3D表面を扱う関数群を提供するライブラリ。

Ubuntu 12.04.x系での依存関係

つまりUbuntu 12.04.x系では、

sudo apt-get install autoconf automake autotools-dev \
build-essential cmake debhelper doxygen doxygen-doc \
gfortran graphviz libsimage-dev python-pivy \
libboost-date-time1.48-dev libboost-filesystem1.48-dev \
libboost-graph1.48-dev libboost-iostreams1.48-dev \
libboost-program-options1.48-dev libboost-regex1.48-dev \
libboost-serialization1.48-dev libboost-signals1.48-dev \
libboost-thread1.48-dev libboost1.48-dev python-qt4 \
libcoin60-dev libcoin60-doc libeigen3-dev libgl1-mesa-dev \
libode-dev liboce-foundation-dev liboce-modeling-dev \
liboce-visualization-dev oce-draw libqt4-dev \
libqt4-opengl-dev libqtwebkit-dev libsoqt4-dev libspnav-dev \
libswscale-dev libtool libxerces-c2-dev libgts-dev \
libzipios++-dev python python-cxx-dev python-dev python-qt4-dev \
python-matplotlib qt4-dev-tools swig zlib1g-dev \
python-qt4 python-tk

とかして、依存関係の解決を試みる。*18

ライブラリのデバック・シンボル

GDBを用いたデバックをする場合には、ライブラリのデバック・シンボルもインストールする必要がある。

sudo apt-get install libgfortran3-dbg libboost1.48-dbg \
libgl1-mesa-glx-dbg \libgl1-mesa-dri-dbg libqt4-dbg \
libqt4-webkit-dbg libgts-dbg zlib1g-dbg python-dbg \
python-qt4-dbg python-tk-dbg libgcc1-dbg libc6-dbg \
libstdc++6-4.6-dbg xserver-xorg-core-dbg

ソースコードの入手

https://github.com/FreeCAD/FreeCAD_sf_master から、Gitすると、PPAで配布しているラインと同等のリビジョン番号。ほぼ日刊アップデートの最新バージョン。ビルドしたバイナリで、リポジトリに上がっている日本語の翻訳も表示されるようだ。

git clone git://github.com/FreeCAD/FreeCAD_sf_master FreeCAD_sf_master

ほかに以下sourceforgeの本家リポジトリもあるが、内容はgithubと同期をとっているようだ。

git clone git://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad freecad

コンフィギュレーション

作業ディレクトリを作って、作業ディレクトリに入る。

mkdir Build-Freecad
cd Build-Freecad

ここでCmake*19を実行してMakefileなどビルドの依存関係を生成する。
Cmakeにオプション -G を付加するとIDEのプロジェクトファイルも生成してくれる。たとえば 'CodeBlocks - Unix Makefiles' を指定するとCode::Blocks*20が利用できるようになり、コードのブラウズが容易になる。*21

Code::Blocksのインストールは

sudo apt-get codeblocks

とすればよい。

デバックシンボル付きでビルドする場合はCMakeのオプションに '-DCMAKE_BUILD_TYPE=Debug' を指定すればよい。gitの本流をビルドするからにはアプリケーションが落ちる場所を特定したり、新しいコードを追加したい気持ちがあるだろうからシンボルを生成してもらった方が都合よい。

cmake -DCMAKE_BUILD_TYPE=Debug -G'CodeBlocks - Unix Makefiles' ../${srcdir}

ビルド

いつものようにmakeを実行する。このとき-jオプションを付加すると、Makeが起動するジョブの数を指定できる。また-lオプションを指定すると、プロセッサの負荷が高い時に起動を抑制してくれる。たとえば0.9のように小数点で指定するとプロセッサの負荷が90%以上であるときには新たなジョブを立てないで負荷が下がるまで保留するように指定できるので、バッググラウンドプロセスでビルドするときは便利だ。

make -j 4 -l 0.9 all

あるいはcode::blocks上からビルド作業したい場合は

codeblocks FreeCAD_trunk.cbp

のようにして、code::blocksを起動させてからメニューやツールバーアイコンからビルドを実行させればよい。

ビルドエラー

64ビット版Linux上でビルドしていると、Meshモジュール周りのリンクでリンクエラーが発生する。ビルドエラーの要因は、Cmakeが生成するビルドルールのパスに32ビットライブラリのパスが含まれてしまっているからだ。余談になるが、もし32ビット/64ビット混在のビルド環境で64ビットオブジェクトを作ろうとすると32ビットライブラリをリンクしようとするかもしれない。

さて問題の修正であるが、Cmakeの経験が浅いので、本流を正攻法に直すことを考えることは割愛して、問題となるパス指定を上書きしてしまうスクリプトをビルドディレクトリで実行することにしよう。

grep i386-linux-gnu -r . -l |sed -e "s/^/sed -e 's\/i386-linux-gnu\/x86_64-linux-gnu\/g' -i /g" |dash

テスト

作業ディレクトリのbinにcdする。freecadにテスト用オプションを付加して実行すると、テストスクリプトが実行される。

cd bin
./FreeCAD -t0

このテストで100%合格となるには、プリンターが利用できる必要がある。

アプリの翻訳(ローカライズ

(日本語版のドキュメントは陳腐化してるので、)ローカライズのドキュメント英語版*22を参考にして作業をおこなう。

翻訳ファイルの更新

翻訳したいモジュールのディレクトリにcdして、以下のように翻訳ファイルあるパスを相対パスで指定すると、アプリのテキストと翻訳ファイルを同期させることができる。シェルのtab補完を利用すると便利。

pylupdate4 *.py -ts Giu/Resource/translate/HogeHoge-no-Module_fr.ts 

でも、上述のpylupdate4を実行すると、ほとんどの項目にobsoleteがついてlinguistでの翻訳作業ができなくなる。

旧式の方法
モジュールのGiuディレクトリにcdしてから

qmake -project

とかして、qtプロジェクトファイルを作っておく。

先ほどのqtプロジェクトファイルのあるディレクトリにcdして,

lupdate -ts Giu/Resource/translate/HogeHoge-no-Module_fr.ts

とかすると、ソースコードのテキストが翻訳ファイルに反映される。

翻訳作業

翻訳ファイルはXMLで記述されてあるので、テキストエディタよりもQT-linguist*23のような専用ユーティリティを利用する方がよい。

デスクトップ上のNautilus*24から翻訳ファイルを選択して右クリックのメニューからQT-linguistを起動すれば、作業したいファイルを読み込まれ編集できるようになる。またコマンドラインから同様の作業を行うならば、ターミナルのshellから、ソースツリーのパスに移動して、linguistに翻訳ファイルのパスをshellのタブ補完を駆使するなどして長々と指定して起動する。

QT-linguistには、フレーズファイルを作っておいてフレーズファイルから近い文章を選ぶ機能がある。ということでフレーズファイルをホームディレクトリに作成しておきCtrl+Tを押して翻訳結果を地道に登録してゆく方法もとれる。

翻訳作業が終わったら保存をして、さらにファイルメニューのリリースを選択するとビルドに用いられる翻訳ファイルが生成される。*25

git の差分ファイルを作る

Patchコマンドで使えるパッチは以下のようにする*26。ここで -- の後ろにファイル名を指定すると、指定されたファイルだけの差分を表示することができる。

git diff --no-prefix  -- *ja.ts >../FreeCAD$(date +%Y%m%d-%H%M%S%z).patch

3Dマウスの例

3Dマウスは、3次元空間にある物体の座標変換を指定するための入力デバイスである。FreeCADの設定ダイアログには、SpaceBallの文字列がみうけられるが、既にSpaceBallは旧世代の製品となって入手できない。後続製品には以下のようなものがあるが、動作の情報について当方は未確認である。
なお、FreeCADのWebドキュメント*27によれば 3Dconnexion の SpaceNavigator*28が利用できると記載されている。

3Dconnexion 3Dマウス SpaceNavigator SE (Standard Edition) SNSE

3Dconnexion 3Dマウス SpaceNavigator SE (Standard Edition) SNSE

3Dconnexion SpaceMouse Pro SMP

3Dconnexion SpaceMouse Pro SMP

3Dconnexion 3Dマウス SpaceExplorer USB SEU

3Dconnexion 3Dマウス SpaceExplorer USB SEU

ちなみに3Dconnexion SpaceNavigatorは、自由度6度の入力デバイスでUSBのあるPCに接続可能である。対応OSは

とされている。

脚注

*1:Problem compiling from source on Linux Mint (petra)

*2:FreeCADのオンラインマニュアルより

*3:オンラインマニュアルには4.1.xとあるが、ダイアログメッセージには4.4以降が必要という文面を見つけた。

*4:http://www.freecadweb.org/wiki/index.php?title=CompileOnUnix

*5:http://www.opendesign.com/guestfiles/TeighaFileConverter/

*6:http://www.collada.org/

*7:https://github.com/pycollada

*8:http://matplotlib.org/

*9:http://www.ode.org/

*10:http://mathema.tician.de/software/pyopencl

*11:pyOpenCLが依存を要求

*12:http://www.doxygen.jp/

*13:http://www.graphviz.org/

*14:http://www.povray.org/

*15:http://packages.ubuntu.com/search?keywords=povray

*16:http://spacenav.sourceforge.net/

*17:http://gts.sourceforge.net/

*18:この例では、Ubuntu 12.04.x系のリポジトリにpycolladaがないので含めていない。PyOpenCL、nvidia-currentは、実機にnVideaのグラフィックスを持っていないの含めていない。

*19:http://www.cmake.org/

*20:http://www.codeblocks.org/

*21:オプション -GKDevelop3 をつけるとKDEIDEが使えるらしいが、IDEからのビルドなどの使い方がよくわからなかった。なぜだかシャドービルドで依存関係が満たされない様子で途中でエラーとなる。

*22:http://www.freecadweb.org/wiki/index.php?title=Localisation

*23:http://qt-project.org/doc/qt-4.8/linguist-translators.html

*24:http://live.gnome.org/Nautilus

*25:lrelease コマンドでも同様のリリース作業が可能である。

*26:http://transitive.info/article/git/command/diff/

*27:http://www.freecadweb.org/wiki/index.php?title=3D_input_devices

*28:3Dconnexion SpaceNavigator 製品情報