$Date: 2018-07-07 06:49:13 +0900 (2018/07/07 (土)) $
$Revision: 1347 $
HelloWorld for cmake
CMakeLists.txt とソースファイルの作成
以下のようなプログラムがあるときにこれを cmake でプロジェクトを作成してコンパイルすることを考えます。
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
以下のような CMakeLists.txt を作成します。
cmake_minimum_required(VERSION 2.6.4)
# define a variable of project name
set( project_name "HelloWorld")
# set the project as the startup project
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${project_name} )
# define a project name
project (${project_name})
# define a variable SRC with file GLOB
file(GLOB SRC *.c)
# define sources files of an executable
add_executable(${project_name} ${SRC})
- set( project_name "HellowWorld") で project_name という変数を HelloWorld という値で定義します
- set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${project_name} ) でproject_name という変数で定義したプロジェクトをスタートアッププロジェクトにします
- project (${project_name}) でプロジェクト名を定義します
- file(GLOB SRC *.c) で CMakeLists.txt と同じディレクトリにあるすべての *.c ファイルを SRC という変数に格納します
- add_executable(${project_name} ${SRC}) で SRC という変数に入っているソースファイルから project_name という変数で定義した実行ファイルを作成します
上記のファイルは https://github.com/m-tmatma/cmake-sample.git で公開しています。
HelloWorld というフォルダに入っています。
以下コマンドで取得します。
git clone https://github.com/m-tmatma/cmake-sample.git
cmake --help
以下は cmake --help の Windows での実行結果です。
-G でどのツールのプロジェクトを生成するかを選択できます。
OS によって選択できる -G のオプションは変わります。使用したい OS 上で cmake --help を実行してみてください。
たとえば Visual Studio 2015 で Win32 用のプロジェクトを生成する場合は -G "Visual Studio 14 2015" を指定します。
たとえば Visual Studio 2017 で x64 用のプロジェクトを生成する場合は -G "Visual Studio 15 2017 Win64" を指定します。
> cmake --help
Usage
cmake [options] <path-to-source>
cmake [options] <path-to-existing-build>
Specify a source directory to (re-)generate a build system for it in the
current working directory. Specify an existing build directory to
re-generate its build system.
Options
-C <initial-cache> = Pre-load a script to populate the cache.
-D <var>[:<type>]=<value> = Create a cmake cache entry.
-U <globbing_expr> = Remove matching entries from CMake cache.
-G <generator-name> = Specify a build system generator.
-T <toolset-name> = Specify toolset name if supported by
generator.
-A <platform-name> = Specify platform name if supported by
generator.
-Wdev = Enable developer warnings.
-Wno-dev = Suppress developer warnings.
-Werror=dev = Make developer warnings errors.
-Wno-error=dev = Make developer warnings not errors.
-Wdeprecated = Enable deprecation warnings.
-Wno-deprecated = Suppress deprecation warnings.
-Werror=deprecated = Make deprecated macro and function warnings
errors.
-Wno-error=deprecated = Make deprecated macro and function warnings
not errors.
-E = CMake command mode.
-L[A][H] = List non-advanced cached variables.
--build <dir> = Build a CMake-generated project binary tree.
-N = View mode only.
-P <file> = Process script mode.
--find-package = Run in pkg-config like mode.
--graphviz=[file] = Generate graphviz of dependencies, see
CMakeGraphVizOptions.cmake for more.
--system-information [file] = Dump information about this system.
--debug-trycompile = Do not delete the try_compile build tree.
Only useful on one try_compile at a time.
--debug-output = Put cmake in a debug mode.
--trace = Put cmake in trace mode.
--trace-expand = Put cmake in trace mode with variable
expansion.
--trace-source=<file> = Trace only this CMake file/module. Multiple
options allowed.
--warn-uninitialized = Warn about uninitialized values.
--warn-unused-vars = Warn about unused variables.
--no-warn-unused-cli = Don't warn about command line options.
--check-system-vars = Find problems with variable usage in system
files.
--help,-help,-usage,-h,-H,/? = Print usage information and exit.
--version,-version,/V [<f>] = Print version number and exit.
--help-full [<f>] = Print all help manuals and exit.
--help-manual <man> [<f>] = Print one help manual and exit.
--help-manual-list [<f>] = List help manuals available and exit.
--help-command <cmd> [<f>] = Print help for one command and exit.
--help-command-list [<f>] = List commands with help available and exit.
--help-commands [<f>] = Print cmake-commands manual and exit.
--help-module <mod> [<f>] = Print help for one module and exit.
--help-module-list [<f>] = List modules with help available and exit.
--help-modules [<f>] = Print cmake-modules manual and exit.
--help-policy <cmp> [<f>] = Print help for one policy and exit.
--help-policy-list [<f>] = List policies with help available and exit.
--help-policies [<f>] = Print cmake-policies manual and exit.
--help-property <prop> [<f>] = Print help for one property and exit.
--help-property-list [<f>] = List properties with help available and
exit.
--help-properties [<f>] = Print cmake-properties manual and exit.
--help-variable var [<f>] = Print help for one variable and exit.
--help-variable-list [<f>] = List variables with help available and exit.
--help-variables [<f>] = Print cmake-variables manual and exit.
Generators
The following generators are available on this platform:
Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
Optional [arch] can be "Win64" or "IA64".
Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.
Optional [arch] can be "Win64" or "IA64".
Visual Studio 8 2005 [arch] = Generates Visual Studio 2005 project files.
Optional [arch] can be "Win64".
Visual Studio 7 .NET 2003 = Deprecated. Generates Visual Studio .NET
2003 project files.
Borland Makefiles = Generates Borland makefiles.
NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
mingw32-make.
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles JOM
= Generates CodeBlocks project files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - MinGW Makefiles = Generates CodeLite project files.
CodeLite - NMake Makefiles = Generates CodeLite project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Sublime Text 2 - MinGW Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - NMake Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.
Kate - MinGW Makefiles = Generates Kate project files.
Kate - NMake Makefiles = Generates Kate project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Eclipse CDT4 - NMake Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - MinGW Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
プロジェクト作成 for Visual Studio
Visual Studio 2017 用に Win32 用のプロジェクトを生成する場合の例です。
cmake ではソースコードのディレクトリとビルド用のディレクトリを分けます。
このためまず最初にビルド用のディレクトリを作成して、そのディレクトリに移動します。
-G オプションでどの種類のプロジェクトを生成するかを指定します。
最後にソースコードの入っているディレクトリ(実際には CMakeLists.txt の入っているディレクトリ) を指定して cmake を実行します。
> mkdir HelloWorld
> cd HelloWorld
> cmake -G "Visual Studio 15 2017" ..\cmake-sample\HelloWorld\
cmake を実行するとカレントディレクトリにソリューションファイルが作成されるので Visual Studio で開いてコンパイルします。
プロジェクト作成 for Xcode
Xcode でプロジェクト作成する場合は -G オプションに Xcode を指定するところが違うだけです。
$ mkdir HelloWorld
$ cd HelloWorld
$ cmake -G "Xcode" ../cmake-sample/HelloWorld/
あと違うのは スタートアッププロジェクトの指定が Xcode だと効かないので、Xcode から開始するときにプロジェクトを選択する必要があります。
プロジェクト作成 for Makefile on Linux (Mac とかでも適用可能)
Linux で Makefile を使う場合
$ mkdir HelloWorld
$ cd HelloWorld
$ cmake -G "Unix Makefiles" ../cmake-sample/HelloWorld/
Makefile でビルドする場合、以下のようにデフォルトではコマンドが表示されません。
$ make
Scanning dependencies of target HellowWorld
[ 50%] Building C object CMakeFiles/HellowWorld.dir/HelloWorld.c.o
[100%] Linking C executable HellowWorld
[100%] Built target HellowWorld
変数 VERVOSE で 1 を指定してビルドすることでどのようなコマンドが実行されているか確認できます。
make VERBOSE=1
プロジェクト作成 for Ninja on Linux (Windows とかでも適用可能)
Ninja というビルドシステムもあります。
Unix Makefile よりも高速です。
$ mkdir HelloWorld-ninja
$ cd HelloWorld-ninja
$ make -G Ninja ../cmake-sample/HelloWorld
Ninja でビルドする場合も、以下のようにデフォルトではコマンドが表示されません。
$ ninja-build
[2/2] Linking C executable HellowWorld
-v を指定してビルドすることでどのようなコマンドが実行されているか確認できます。
ninja-build -v