2010年11月25日木曜日

OpenCV.frameworkの作り方メモ

OpenCV.frameworkの作り方がやっとわかったのでメモ。
ただし、今回は軽量版のため、i386専用。

一番注意しないといけないことは、OpenCVのソースコードは”必ず”SourceForgeのsubversionからとること!tarで圧縮されたやつには必要なファイル(configure)がおいてないので無理です。


まずは公式サイトからOpenCVのソースコードを持ってくる。
%svn co https://opencvlibrary.svn.sourceforge.net/svnroot/opencvlibrary/trunk/opencv opencv
%cd opencv
次にmake_frameworks.shを修正

  • FRAMEWORK_INSTALL_PATHを好きなとこ(大抵は「/Library/Frameworks」)
  • SYSROOTを自分のOSのバージョン(SnowLepardなら「--sysroot=/Developer/SDKs/MacOSX10.6.sdk」)
アーキテクチャ4つ(ppc,ppc64,i386,x86_64)全部に対応させようとするとコンパイル時間が4倍になるので、今回はintel向け(i386とx86_64)だけコンパイルします。すべての修正を施したスクリプトファイルが以下。

#! /bin/bash

# the current directory should not be configured
if test -e Makefile; then make distclean; fi

# (re-)create directories
rm -rf build_i386 build_x86_64 OpenCV.framework
mkdir build_i386
mkdir build_x86_64

# find out how many parallel processes we want to use for make
# see http://freshmeat.net/projects/kernbench/, we use a slightly different 'optimum' guess
export parallel_jobs=$((2 * `sysctl -n hw.ncpu` + 1))

# this setting defines where the framework should be installed
export FRAMEWORK_INSTALL_PATH="/Library/Frameworks"
#export FRAMEWORK_INSTALL_PATH="/Users/your_login_name_here/Library/Frameworks"

# set up a couple of additional build settings
export SETTINGS="CC=gcc-4.2 CXX=g++-4.2 --without-python --without-octave --disable-apps --build=`arch`"
#export SETTINGS="--without-python --without-octave --build=`arch`"
export SYSROOT="--sysroot=/Developer/SDKs/MacOSX10.6.sdk"

# build intel version
echo "Building i386 version of the OpenCV framework"
echo "============================================="
if test -d build_i386; then cd build_i386; fi
../configure --host=i386-apple-darwin9 $SETTINGS --enable-sse CPPFLAGS="$SYSROOT" CFLAGS="-arch i386" CXXFLAGS="-arch i386" LDFLAGS="$SYSROOT -arch i386"¥
 && make -j $parallel_jobs framework FRAMEWORK_ARCH=i386
cd ..

#### 64bitに対応させないなならここから下はいらない ####

echo "Building x86_64 version of the OpenCV framework"
echo "============================================="
if test -d build_x86_64; then cd build_x86_64; fi
../configure --host=x86_64-apple-darwin9 $SETTINGS --without-quicktime --without-carbon CPPFLAGS="$SYSROOT" CXXFLAGS="-arch x86_64" LDFLAGS="$SYSROOT -arch x86_64"\
  && make -j $parallel_jobs framework FRAMEWORK_ARCH=x86_64
cd ..

# build universal version
echo "Creating universal Framework"
echo "============================================="
cp -Rp build_i386/OpenCV.framework ./
lipo -create build_x86_64/OpenCV.framework/OpenCV build_i386/OpenCV.framework/OpenCV -output OpenCV.framework/Versions/B/OpenCV

# finalize
echo "Done!"
open .

これで、i386用のフレームワーク「build_i386/OpenCV.framework」と「build_x86_64/OpenCV.framework」と両方に対応したユニバーサルバイナリの「OpenCV.framework」ができます。
別に配布用じゃないのでi386向けだけでよかったんだけど、そうするとこのフレームワークを使うプログラムをコンパイルするたびに「-arch i386」をつけてコンパイルしないとエラーがでるらしい。

ちなみに、「lipo」は別々のアーキテクチャ向けにコンパイルした実行ファイルを合体させてuniversal binaryにするコマンドらしい、ppc用やppc64用などもコンパイルして合体させることも可能。


どんなオプションつけたらフレームワークが作れるか調べて、自前のフレームワークの作り方もまとめたいな、、、

0 comments:

コメントを投稿