TOP > プログラミング関連 > SFML非公式翻訳トップ > 【非公式翻訳】SFML2.3チュートリアル > 開発環境を整えよう > CMakeでSFMLをコンパイル

[原文(公式)]

◆◆ CMake で SFML をコンパイル ◆◆
SFML2.3 非公式日本語翻訳
はじめに
はい。今回のタイトルは間違いですよね。
CMake というのはコンパイラではありませんからね。これを使って SFML をコンパイルするわけではない。
では、CMake って何なのかな?

CMake は、オープンソースのメタビルドシステムです。
SFML をビルドするのではなくて、SFML をビルドするモノを生成するのです。
たとえば VisualStudio のソリューションファイルとか、 Code::Blocks のプロジェクトとか、Linux ならMakefile とか、XCode のプロジェクトとか……。 つまり、キミが使ってる開発環境用のプロジェクトや Makefile を生成してくれるツールです。

autoconf/automake や premake をご存知でしょうか?
ご存知なら、それと似たようなモノだと考えてください。

CMake は有名なプロジェクトでも使われてます。Blender や Boost、KDE、Ogre、などなど。
詳しくは公式サイトwikipediaを見てね。

というわけで、おわかりいただけたと思うのですが、 このチュートリアルでは2つの話題を取り上げます。
CMake で、ビルド用のファイル群 を生成するやり方。そして、それを使って、キミの開発環境で SFML をビルドするやり方、の2つです。

※ 訳註 ※
文中に Mac での設定方法に触れている箇所があるのですが、 訳者は Mac を触ったことがありません。 理解不足による誤訳があるかもしれません。ごめんなさい。
依存関係を解決
SFML は、依存しているライブラリがいくつかあります。
なので、CMake での作業を始める前に、それらの依存ファイルをインストールしておかないといけません。
ですが、Windows や Mac OS X の場合は、必要な依存ファイルは SFML に入ってるので、気にしなくても大丈夫です。 すぐにビルド作業に取り掛かれます。

一方、Linux では必要な外部ファイルは自分で用意しないといけません。
以下は、SFML のビルドを始める前に必要なライブラリのリストです。
パッケージの正確な名前はディストリビューションによって異なってます。
それと、上記のパッケージをインストールしたあと、開発用のヘッダーファイルをインストールするのも忘れないでください。
SFML をビルドするための設定
このステップでは、SFML をビルドするプロジェクトファイルや Makefile を生成する方法を述べます。
何をビルドするか? どこにビルドするか? どうビルドするか? そして、あなたのニーズにパーフェクトにマッチするように追加のオプションもあります。
オプションについては後ほど詳しく解説します。お楽しみに!

CMakeを動かす前に、どこにファイルを生成するのか、フォルダを決めておきましょう。
プロジェクトファイル や Makefile や、あれこれのオブジェクトファイル群が生成される場所です。
SFML のソースフォルダの中に直接生成することもできますが、 ビルドファイルの全階層や、あれこれのオブジェクトファイルがたくさん出来てしまうので、 ゴミファイルで汚れてしまいます。
なので別フォルダに生成するようにした方が、元の SFML のフォルダをキレイなままにしておけます。
別フォルダに生成するようにしておくと、もう1ついいことがあります。 異なるビルド設定でのファイル群を別々に保存しておけます(static、dynamic、debug、release、などなど)。

生成先のフォルダを選んだら、あともう1つ、CMakeを動かす前にやっておくことがあります。 コンパイラをインストールしてあるパスを環境変数に設定しておくことです。 CMake は最初に、コンパイラの状態を調べます(バージョンなど)。 つまり、CMake が起動される時点で、コンパイラの実行ファイルがマシン上に存在している必要があるということです。

Linux や Mac OS X では、この件は問題になりません。 コンパイラは標準のパスにインストールされて、いつでも有効になっているからです。 だけど、Windows では、CMake がコンパイラの場所を見つけられるように、 コンパイラをインストールしているパスを環境変数に設定しておく必要があります。 複数のコンパイラや複数のバージョンをインストールしている場合は特にこの設定が重要です。

Windows で GCC (MinGW) を使いたい場合は、 一時的に MinGW/bin フォルダをパスに設定して、コマンドラインから cmake を実行できます。
> set PATH=%PATH%;your_mingw_folder/bin
> cmake -G"MinGW Makefiles" ./build
Visual C++ の場合、Visual Studio のコマンドプロンプトからも CMake を実行することができます。 スタートメニューから探してみましょう。 または、vcvars32.bat というバッチファイルが Visual Studio をインストールした場所にあるはずです。 これを Visual Studio のコマンドプロンプトから呼んでおくと、必要な環境変数が正しく設定された状態になります。
> your_visual_studio_folder/VC/bin/vcvars32.bat
> cmake -G"NMake Makefiles" ./build

さて、CMake を起動する準備ができました。
起動する方法は3通りあります。
このチュートリアルでは、GUI で CMake を扱う方法(cmake-gui)に焦点をあてます。 ビギナーのみなさんは、その方がいいですよね?
コマンドライン使いのお友達は、CMake のマニュアルでコマンドをお勉強するとよいと思いますが、 スクリーンショットや「ここをクリック」などの説明文を除いて、以下の解説も内容は同じです。

CMake の GUI を起動すると、こんな感じのウィンドウが出ます:

では最初のステップに進みましょう(順番に実行せよ): CMake を起動するのが初めて(またはキャッシュをクリアした後)のときは、 ジェネレーターを選択する画面が出ます。 つまり、使用するコンパイラ(IDE)を選択する画面ということです。

たとえば、Visual Studio 2010 のソリューションを生成するには、"Visual Studio 10 2010" を選択します。
Visual C++ のコマンドラインで使える NMake を生成するには "NMake makefiles" を。
MinGW (GCC) で使える Makefile を生成するには "MinGW makefiles" を。

SFML をビルドするには IDE のプロジェクトを使うよりも Makefile を使う方が簡単です。 Makefile を生成後、コマンド1つでコンパイルできるようになります。 1つのスクリプトに複数のコンパイルコマンドを同時に記述する、なんてことも可能です。
ここで行うのはビルドだけです。ソースコードの編集はしません。 その意味では IDE プロジェクトは不要ということですね。

さらに言うと、インストールプロセス(後で解説します)は "XCode" のジェネレーターとは相性が悪いです。 なので、Mac OS X では "Makefile" のジェネレーターを使うことを強く推奨します。

その下のオプションでは、"Use default native compilers" を選択して下さい。1択です。他の選択肢は無視です。

ジェネレーターを選んだら、 CMake は コンパイルのための環境をあれこれとテストし始めます。 コンパイラのパス、スタンダードヘッダ、SFML の依存関係、などの情報を収集します。
テストが OK ならば、"Configuring done" のメッセージが表示されます。
問題があるときは、エラーメッセージをよく読んで下さい。
もしかすると、コンパイラにアクセスできないのかもしれません(上記参照)。
設定されている項目の中に、アナタの環境に合っていないものがあるのかもしれません。
または、依存しているファイルが見つからないのかもしれません。


"Configuring done" が表示されたら、ウィンドウの中央にオプションが表示されます。
CMake にはたくさんのオプションがあるのです。が、ほとんどのオプションはデフォルトのままでよいです。 変更しない方がいいオプションもあったりします。 CMake がどんなことに自動的に気を利かせたのかを示すためにオプションとして表示されてるだけです。

以下は、SFML をビルドするにあたって、確認しておくとよさそうなオプションのリストです。
Name 意味
CMAKE_BUILD_TYPE ビルドタイプです。
有効な文字列は "Debug" と "Release" です。 (世間には "RelWithDebInfo" や "MinSizeRel" などのビルドタイプもありますが、SFML には関係ありません)
注意点。 複数のビルドタイプを同時に扱える IDE(Visual Studio とか) のワークスペースを生成する場合、 このオプションは無視されて、使用可能なビルドタイプが生成されます。
CMAKE_INSTALL_PREFIX インストールパスです。
デフォルトでは、OS ごとに、よくあるパスに設定されています。 (Linux や Mac OS X なら "/usr/local"、 Windows なら "C:\Program Files"、などなど)
ビルド後に SFML をインストールしなければならないというわけではありません。 ビルド作業したフォルダに生成されたバイナリを直接使うこともできますが、 ファイルをインストールしておくと、ビルド時に生成されたゴミファイルを残さなくて済みます。
CMAKE_INSTALL_FRAMEWORK_PREFIX
(Mac OS X のみ)
フレームワークのためのインストールパスです。
デフォルトでは ルートライブラリフォルダに設定されています(例:/Library/Frameworks)。
CMAKE_INSTALL_PREFIX のオプションと同じように、ビルド後に SFML をインストールするのは必須ではありません。 が、インストールしておいた方がゴミファイルがなくなるのでキレイです。 このパスは、お使いのマシンの sndfile.framework にインストールするときにも使われます (必要な依存関係。Apple からは提供されてません)。
そして、BUILD_FRAMEWORKS を選択している場合は SFML が フレームワークとなります。
BUILD_SHARED_LIBS SFML を スタティックリンクライブラリとしてビルドするか、 ダイナミックリンクライブラリとしてビルドするかを選択します。
このオプションは SFML_USE_STATIC_STD_LIBS オプションとは共存できません。
SFML_BUILD_FRAMEWORKS
(Mac OS X のみ)
SFML をフレームワークのバンドル としてビルドするか、 ダイナミックライブラリ(dylib) のバイナリとしてビルドするかを選択します。
フレームワークとしてビルドするには BUILD_SHARED_LIBS を選択している必要があります。
制作したアプリケーションを配布するときには、SFML をフレームワークとして使うようにしておくのがオススメです。 とはいえ、フレームワークとして使っているとき SFML はデバッグビルドができません。 デバッグビルドをするには、代わりにダイナミックライブラリにして下さい。
SFML_BUILD_EXAMPLES SFML のサンプルをライブラリ本体と一緒にビルドするかどうかを選択します。
SFML_BUILD_DOC SFML のドキュメントを生成するかどうかの選択です。
注意点。Doxygen ツールをインストールして、アクセスできるようにしておく必要があります。 doxygen の準備ができていない状態でこのオプションを選ぶと、エラーになってしまいます。 Mac OS X では classic-Unix doxygen のバイナリを "/usr/bin" や、その他似たようなディレクトリにインストールできます。 または Doxygen.app を "Applications" フォルダに入れておくことも可能です(例: ~/Applications など)。
SFML_USE_STATIC_STD_LIBS
(Windows のみ)
SFML にリンクされる 標準 C/C++ ライブラリについての設定です。 TRUE にすると、C++ のスタンダードライブラリが静的にリンクされます。 つまり、SFML の中にライブラリが含まれるので、 コンパイラ特有の DLL が入っていないマシンでもアプリケーションを起動できるようになります。 FALSE(デフォルト)にすると、スダンダードライブラリへダイナミックリンクすることになります。 この場合、コンパイラ特有の DLL が入っていないマシンでは起動できないアプリケーションになってしまいます (Visual C++ なら msvcrxx.dll や msvcpxx.dll が必要。GCC なら libgcc_s_xxx-1.dll/libstdc++-6.dll が必要になる)。
注意点。 SFML を使ってアプリを開発するとき、その開発環境のプロジェクトの設定も、この設定に一致している必要があります。 一致していない場合は、エラーの元になってしまいます。 このオプションは BUILD_SHARED_LIBS オプションとは共存できません。
CMAKE_OSX_ARCHITECTURES
(Mac OS X のみ)
どのアーキテクチャで SFML がビルドされるのかの設定です。 "i386;x86_64" に設定しておくのがオススメです。 32ビットマシンでも 64ビットマシンでも使えるバイナリが生成されます。
SFML_INSTALL_XCODE_TEMPLATES
(Mac OS X のみ)
Xcode template をインストールするかどうかの設定です。 "/Library/Developer/Xcode/Templates/SFML" というフォルダが書き込み可能な状態で存在しているようにしてください。 このテンプレートについての詳しいお話は Mac OS X での環境構築のチュートリアルを参照してください。
SFML_INSTALL_PKGCONFIG_FILES
(Linux共有ライブラリのみ)
pkg-configファイルをインストールするかどうかの設定です。 pkg-configとは、インストールしたライブラリを共通したインターフェイスで利用できるようにするツールです。

設定が終了したら、"Configure" ボタンをもう1度クリックします。
赤く強調表示されているオプションがなくなるはずです。 そして、"Generate" ボタンが押せる状態になります。
"Generate" をクリックすると、選択した プロジェクトファイルや Makefile が生成されます。
CMake はキャッシュを生成します。
なので、後日再び CMake を起動したとき、設定したオプションの内容が再現されます。 以前の設定内容を元に、作業を再開することができます。

C++11 と Mac OS X
Mac OS X で C++11 の機能を使いたい場合、 Clang(Appleの公式コンパイラ)と libc++ を使う必要があります。
そして、SFML をビルドする際には、標準ライブラリとコンパイラとの相性の問題と格闘しなければいけません。

以下、clang と libc++ を使って SFML をビルドするための設定です。

※ 訳註 ※
上記の画像は公式サイトの原文にある SS を模写したものです。 ちゃんとした SS をご覧になるには、そちらを参照してください。 冒頭でも述べましたが、訳者の手元には Mac がないため、SS の撮影ができないのです。ごめんなさーい。
SFML をビルド
ここでグッドニュース!
CMake での作業はこれにて終了です!
ちなみに、CMake はお利口さんなので、たとえユーザー(あなた)が作業中のファイルを更新したとしても、 うまい具合に対応してくれます。

これで SFML をビルドする準備ができました。
もちろん、具体的なやり方は、どんなプロジェクトファイル(または Makefile)を生成したのかによって違ってきます。 プロジェクトファイル や ソリューション、または ワークスペースなどを生成したのであれば、 キミの愛用の IDE でそれを開いて、いつものようにビルドしましょう。
このチュートリアルでは、個々の IDE の使い方までは解説しません。 世間にはたくさんの IDE がありますからね。 キミの愛用の IDE の使い方は、キミの方が詳しいですよね?

Makefile を生成した場合は、コマンドシェルを開いて、キミの実行環境に合わせて make コマンドを実行しましょう。 たとえば NMake (Visual C++)を生成したのならば "nmake" コマンドを実行。 MinGW (GCC) の Makefile を生成したのならば "mingw32-make" コマンドを実行。 Linux の Makefile ならば、"make" コマンドを実行するのだ。 ここで注意! Windows では、メイクコマンド(nmake や mingw32-make)にアクセスできないことがあります。 その場合、環境変数にパスを通すのを忘れないでください。
詳しくは「SFML をビルドするための設定」の冒頭付近を読み返してね。

デフォルトの設定でビルドすると、SFML の全てのモジュールがビルドされます(SFML_BUILD_EXAMPLES をオンにしていたならサンプルアプリも)。 特定のモジュールだけをビルドしたい場合は、ビルド対象(ターゲット)を変更することができます。 その他、クリーン(clean) や インストール(install) も選択することができます。

以下、ターゲットの一覧です。
オプションの設定内容によっては、使えるものや使えないものもあります。

ターゲット 意味
all デフォルトのターゲットです。 ターゲットが明示的に選択されていないときは、この設定になります。 バイナリ(SFML のモジュールおよびサンプルアプリ)を生成するプロジェクトを全て生成します。
sfml-system
sfml-window
sfml-network
sfml-graphics
sfml-audio
sfml-main
対応する SFML のモジュールをビルドします。 "sfml-main" は Windows でだけ有効です。
cocoa
ftp
opengl
pong
shader
sockets
sound
sound-capture
voip
window
win32
X11
対応する SFML のサンプルアプリをビルドします。 これらのターゲットは SFML_BUILD_EXAMPLES オプションを選択しているときだけ有効です。 注意点。この中のいくつかは、特定の OS でだけ有効です。 たとえば "cocoa" は Mac OS X だけ、"win32" は Windows だけ、"X11" は Linux だけ、などなど。
doc API ドキュメントを生成します。 SFML_BUILD_DOC オプションを選択しているときだけ有効です。
clean ビルド処理の過程で生成されたオブジェクトファイルや、前回のビルド時に生成されたライブラリや実行ファイルなどを全て削除します。 通常は、このターゲットを選択する必要はありません。 これが必要になるのは、SFML を完全にビルドしなおしたいときだけです。 (あれこれとソースを変更してオブジェクトファイルがぐちゃぐちゃになったときには、クリーンせざるを得なくなったりします)
install CMAKE_INSTALL_PREFIX および CMAKE_INSTALL_FRAMEWORK_PREFIX で設定したパスに SFML をインストールします。 SFML のライブラリとヘッダーが上書きコピーされます。 SFML_BUILD_EXAMPLES や SFML_BUILD_DOC を選択しているときには、 サンプルアプリや API ドキュメントもコピーされます。 インストール後には、純粋な SFML が手元に残ります。 つまり、 公式サイトから SDK をダウンロードしたり、 ディストリビューションのリポジトリからインストールしたのと同じものが出来上がります。
IDE を使っている場合は、「ターゲット=プロジェクト」ということになります。 対応するプロジェクトを選択してビルド、です。 ("clean" や "install" の場合も同じです。コンパイルされるソースコードがありませんが、混乱しないで)
Makefile を使っている場合は、ターゲットの名前を make コマンドに渡してビルドします。
例:
"nmake doc", "mingw32-make install", "make sfml-network"

さて、これで SFML がビルドできたはずです。おめでとう!