俺のCMake!

ご無沙汰しております。松山事務所の石丸です。

最近は晩酌しながら、youtubeでマインクラフト実況を観つつ、プログラムを書いています。

僕は今日も元気です。

 

 

icon-check 概要

趣味で作ってるゲームプログラムのCMakeファイル(CMakeLists.txt)を公開します。

C++でBoost、OpenGL、SDLを使用して、out-of-sourceビルドする設定です。(out-of-sourceビルドとは、ビルド時の中間ファイルでソースツリーを汚さないビルドの仕方)

Boost(http://www.boost.org/): C++ライブラリ
OpenGL(https://www.opengl.org/): 3Dグラフィックスライブラリ
SDL(https://www.libsdl.org/): クロスプラットフォームな低レベルマルチメディアライブラリ

 

icon-check 動機

先日、手元にMacBookProしかない状態で、ゲーム作りたいなって思ったんですね。
Macネイティブで作ると遊んでもらえる人が限られるからクロスプラットフォームにしてみるか。
と、気がついたらCMakeの書き方を調べ始めてました。
ただマインクラフトみたいな地形生成プログラムを書いてみたかっただけなんです。

 

icon-check 経緯

最初はただファイルを列挙してビルドするところから始めて、
OpenGLやSDLといったライブラリを使えるようにしたり、
中間ファイルでソースツリーが汚れるのが嫌だなとオープンソースプロジェクトの構成を参考にしたり、
何度かの修正を経てたどり着いた「オレオレゲーム開発用のシンプルなCMakeファイル」が、
誰かの参考になるかもしれないと思って、恥ずかしがらずに公開してみることにしました。

 

icon-check ディレクトリ構成

例えばこんな感じ。

minecraft
|--CMakeLists.txt
|--build
|--include
| |--minecraft
| | |--data
| | | |--level.hpp
| | |--minecraft.hpp
| |--util
| | |--game_application.hpp
|--src
| |--minecraft
| | |--minecraft.cpp
| |--util
| | |--game_application.cpp

CMakeLists.txtファイル: CMakeの設定ファイル
buildディレクトリ: ビルドするディレクトリ
includeディレクトリ: ヘッダーファイル置き場
srcディレクトリ: ソースファイル置き場

 

icon-check ビルドの仕方

Macの場合、terminal上で次のようにビルドします。
minecraftディレクトリにいるとして、

$ cd build
$ cmake ..
$ make

buildディレクトリに入って、一階層上からcmakeすることで、
buildディレクトリ以下にMakefileなどが生成されて、ソースツリーを汚さなくて済みます。
あとはmakeでビルドするだけ。コードを書いてはmakeの繰り返しです。

 

CMakeLists.txt

最後に、CMakeの設定ファイルCMakeLists.txtの内容は次のようになります。

cmake_minimum_required(VERSION 2.8)

project(minecraft CXX)

# OpenGL、Boost、SDL2ライブラリを検索
find_package(OpenGL REQUIRED)
find_package(Boost 1.62 REQUIRED COMPONENTS system iostreams filesystem)

include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)
pkg_search_module(SDL2Image REQUIRED SDL2_image>=2.0.0)

# OpenGL、Boost、SDL2をincludeパスに設定
include_directories(SYSTEM
 ${OPENGL_INCLUDE_DIRS}
 ${Boost_INCLUDE_DIRS}
 ${SDL2_INCLUDE_DIRS}
 ${SDL2IMAGE_INCLUDE_DIRS}
)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/)

# コンパイル対象のソース一覧を作成
file(GLOB util_files src/util/*.cpp)
file(GLOB project_files src/${PROJECT_NAME}/*.cpp src/${PROJECT_NAME}/*/*.cpp)

# オブジェクトファイルを作るソースを指定
add_library(util OBJECT ${util_files})
add_library(project OBJECT ${project_files})

# Mac依存
link_directories(/usr/local/lib)
# clang依存?
set(CMAKE_CXX_FLAGS "-std=c++14 -stdlib=libc++")

# 実行ファイルを作る方法を指定
add_executable(${PROJECT_NAME}
 $<TARGET_OBJECTS:project>
 $<TARGET_OBJECTS:util>
)

# リンクするライブラリを指定
target_link_libraries(${PROJECT_NAME}
 ${OPENGL_LIBRARIES}
 ${Boost_LIBRARIES}
 ${SDL2_LIBRARIES}
 ${SDL2IMAGE_LIBRARIES}
)

 

クロスプラットフォームなアプリを作るためにCMakeを使っているのに、Mac依存、clang依存かもしれない設定が直書きなのが残念なところですね。いずれ修正したいと思います。

どこか1行でも誰かの参考になれれば幸いです。間違いや改善点などの指摘もお待ちしています!

それでは。

 

おすすめ

TOP
TOP