Simple Gifts

組込みソフトウェア開発をやっている駆け出しエンジニアが、テクノロジー関連のお勉強メモを書いていくブログ。

【CMake】【C++】WindowsでCMakeを使う

[TOC]

ナニソレ?

私がCMakeを導入した目的は、ソースコード(インプット)とビルド結果(アウトプット)を分離するため。

私はソースコードはOneDriveに入れて管理しているのですが、ここに.vsprojファイルや、ビルドしたバイナリや中間ファイルまでアップロードされると困るのです。 なぜなら別PCにクラウド経由で同期したときに、パスが合わずに使えない、という問題が起きるから。

ちなみにCMakeの本来の使い方(最大のメリット)は、同一ソースコードマルチプラットフォームのビルドを簡単に行うこと。

もう一つのメリットとしては、プロジェクト名やフォルダ名を変えたくなったときに、CMakeならば比較的簡単にできること。 そうそうやるべきでないのは理解してますが、案外必要になるのでイザという時に、覚えておいてもよいかと。

つかいかた

以下のURLのノウハウを使わせて頂きました。 以下のように若干修正。

  1. MinGWをインストー
  2. CMakeをインストー
  3. パスを通す
  4. テストプログラムを実行してみる

1. MinGWをインストー

以下からダウンロード。 sourceforge.net

どのパッケージを選ぶかは、他の方がいろいろ書いているので、ググってください。

2. CMakeをインストー

以下からダウンロード。 cmake.orghttps://cmake.org/download/

詳細は他の方がいろい(ry

ここまでが、最初に1回だけやればよい手順になります。 次からは、プロジェクトごとに毎回実行する手順。

3. CMakeを実行する

以下の3つのバッチを作成し、実行します。

  • confdir.bat : 初回だけ実行すればよいです。
  • cmake.bat : 初回または、CMakeファイルに変更を加えたときに実行します。
  • make.bat : 初回または、ソースコードを変更した場合に実行します。

バッチは、ソースコードとは別フォルダ(以下の例では、vbscriptフォルダ)に置きましょう。 そのフォルダにパスを通しておきます。

::confdir.bat
@echo off
set MINGW=c:\mingw\bin

set srcdir=%CD%
echo source dir:    %srcdir%
set CDN=%srcdir%\..\vbscript\CurrentDirectoryName.vbs
for /F "usebackq tokens=* delims=" %%S in (`CALL cscript //NoLogo %CDN% /%srcdir%`) do set ret=%%S
set builddir=C:\build\%ret%
if not exist %builddir% mkdir %builddir%
PATH %builddir%;%PATH%
echo build dir: %builddir%

if %ERRORLEVEL%==0 (
echo [SUCCESS] confdir has been done. Please run "cmake" command.
) else (
echo [ERROR] ERRORLEVEL:%ERRORLEVEL%
)
exit /b

このスクリプトでは、C:\build以下にビルドフォルダを自動生成します。

余談ですが、ビルドフォルダに、ソースフォルダと同じ名前のフォルダを自動生成するため、 カレント・ディレクトリの名前(パスではなく)を取得する方法は、以下を参照。 qiita.com

ビルド結果はここに格納されます。

::cmake.bat
@echo off

set CC=%MINGW%\gcc
set CMAKE_C_COMPILER=%CC%
set CMAKE_C_COMPILER_ID="Intel"

set CXX=%MINGW%\g++
set CMAKE_CXX_COMPILER=%CXX%
set CMAKE_CXX_COMPILER_ID="Intel"

set CMAKE_BUILD_TYPE="Release"
set CMAKE_CXX_FLAGS_RELEASE="-O3 -std=c++11 --enable-auto-import"

if exist "cmake.exe" (
"C:\Program Files\CMake\bin\cmake.exe" -G"MinGW Makefiles" -H. -B%builddir%
) else (
"C:\Program Files (x86)\CMake\bin\cmake.exe" -G"MinGW Makefiles" -H. -B%builddir%
)

if %ERRORLEVEL%==0 (
echo [SUCCESS] cmake is done. Please command "make"!
) else (
echo [ERROR] ERRORLEVEL:%ERRORLEVEL%
)
exit /b

CMakeまで完了。Makeします。

::make.bat
@echo off
mingw32-make -C %builddir%
if %ERRORLEVEL%==0 (
echo [SUCCESS] make is done.
cd /d %builddir%
) else (
echo [ERROR] ERRORLEVEL:%ERRORLEVEL%
)
::pause
exit /b

これでビルドまでできました。

4. テストプログラムを実行

説明の都合でこの順序で書きましたが、わざわざ手順に番号を振っておきながら、 以下のファイル(テストプログラム)がないと「3.」は実行できません。

#CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
project(HelloWorld)

add_executable(HelloWorld
    src/main.cpp
)

message(STATUS "CMake Start!")

main.cppは、まぁ好きに書けばいいと思います。

実行してみましょう

D:\GitHub> cd CPP_Sample_01_HelloWorld

D:\GitHub\CPP_Sample_01_HelloWorld> confdir.bat
source dir:     D:\GitHub\CPP_Sample_01_HelloWorld
build dir:      C:\build\CPP_Sample_01_HelloWorld
[SUCCESS] confdir has been done. Please run "cmake" command.

D:\GitHub\CPP_Sample_01_HelloWorld> cmake.bat
-- The C compiler identification is GNU 4.8.1
-- The CXX compiler identification is GNU 4.8.1
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/build/CPP_Sample_01_HelloWorld
[SUCCESS] cmake is done. Please command "make"!

D:\GitHub\CPP_Sample_01_HelloWorld> \make.bat
mingw32-make: Entering directory 'C:/build/CPP_Sample_01_HelloWorld'
mingw32-make[1]: Entering directory 'C:/build/CPP_Sample_01_HelloWorld'
mingw32-make[2]: Entering directory 'C:/build/CPP_Sample_01_HelloWorld'
Scanning dependencies of target HelloWorld
mingw32-make[2]: Leaving directory 'C:/build/CPP_Sample_01_HelloWorld'
mingw32-make[2]: Entering directory 'C:/build/CPP_Sample_01_HelloWorld'
[ 50%] Building CXX object CMakeFiles/HelloWorld.dir/src/main.cpp.obj
[100%] Linking CXX executable HelloWorld.exe
mingw32-make[2]: Leaving directory 'C:/build/CPP_Sample_01_HelloWorld'
[100%] Built target HelloWorld
mingw32-make[1]: Leaving directory 'C:/build/CPP_Sample_01_HelloWorld'
mingw32-make: Leaving directory 'C:/build/CPP_Sample_01_HelloWorld'
[SUCCESS] make is done.

C:\build\CPP_Sample_01_HelloWorld>HelloWorld.exe
Hello, CMake!

まとめ

WindowsでCMakeをお手軽に使う方法。