2023.04.28

CMakeコマンド基本中の基本

前回までの記事


CMakeとC++の記事をいくつか書いたが、実はまだcmakeコマンドの基本について知らない。 なぜならVSCodeの拡張にやってもらっていたからだ。 とはいえCMakeの基本コマンドについて理解しないといけないのでここにメモする。

CMake基本コマンド

セットアップ

現在のソースファイルの構成は以下の通り

.
├── CMakeLists.txt
├── README.md
├── data
│   └── sample.csv
├── include
│   ├── CSVParser.h
│   └── MyClass.h
└── src
    ├── CSVParser.cpp
    ├── MyClass.cpp
    └── main.cpp

CMakeLists.txtは以前に書いたものをそのままつ書く。 https://github.com/gollowars/cpp_cmake_bootstrap/blob/main/CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
# プロジェクト名
project(Example VERSION 0.1.0)

# C++標準の設定
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True) ## C++11であることを指定して、C++11以外のコンパイラを使うとエラーにする

# buildターゲット(この場合はPROJECT_NAMEであるExampleに)main.cppを追加
add_executable(${PROJECT_NAME} ./src/main.cpp) 

# ヘッダーファイルの読み込み
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)

## ソースファイルを追加する 
set(MY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_sources(${PROJECT_NAME} PRIVATE 
    ${MY_SOURCE_DIR}/MyClass.cpp
    ${MY_SOURCE_DIR}/CSVParser.cpp
)

## assetをコピーする
configure_file(${CMAKE_SOURCE_DIR}/data/sample.csv ${CMAKE_CURRENT_BINARY_DIR}/data/sample.csv COPYONLY)

get_target_property(headers ${PROJECT_NAME} SOURCES)
message(STATUS "headers : ${headers}") # これはあってもなくても良いけどメッセージを確認す

cmakeコマンドの実行

mkdir build
cmake -S . -B build
cmake --buid build
オプション 説明
-S <path-to-source> ソースディレクトリを指定する
-B <path-to-build> ビルドディレクトリを指定する
--build <dir> ビルドディレクトリを指定する

ビルドするときはソースディレクトリとは別にビルドディレクトリを作成するのが一般的とのこと。 ぐちゃぐちゃになったら困るしね。 いろいろオプションありそうだけど、CMakeLists.txtで指定できるものはそっちでするべきぽい。 基本はこのコマンド知ってればおkかな。


ちなみに以下でも同じ。

mkdir build
cd build
cmake ..
cmake --build .

とのことで、コマンドバージョン

cmake -S . -B build
-- The C compiler identification is AppleClang 14.0.0.14000029
-- The CXX compiler identification is AppleClang 14.0.0.14000029
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode_14.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode_14.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- headers : ./src/main.cpp;/Users/gollowars/works/sony_cam_util/100_dev/00_ex/src/MyClass.cpp;/Users/gollowars/works/sony_cam_util/100_dev/00_ex/src/CSVParser.cpp
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/gollowars/works/sony_cam_util/100_dev/00_ex/build
[23-04-28 17:14:51] gollowars:~/works/sony_cam_util/100_dev/00_ex % cmake --build build
[ 25%] Building CXX object CMakeFiles/Example.dir/src/main.cpp.o
[ 50%] Building CXX object CMakeFiles/Example.dir/src/MyClass.cpp.o
[ 75%] Building CXX object CMakeFiles/Example.dir/src/CSVParser.cpp.o
[100%] Linking CXX executable Example
[100%] Built target Example
[23-04-28 17:15:03] gollowars:~/works/sony_cam_util/100_dev/00_ex % open .
[23-04-28 17:15:05] gollowars:~/works/sony_cam_util/100_dev/00_ex % build/Example
Hello, world test7 !
C++17
42
file is open
size : 4
name,age,gender,
Alice,25,Female,
Bob,30,Male,
Charlie,40,Male,

OK

余談 : Xcode

Xcode向けのbuildをするときは以下のコマンドを実行するでよいのかな?

cmake -G Xcode -S . -B build
cmake --build build
オプション 説明
-G <generator-name> ジェネレーターを指定する

xcodeを使わずにcmakeでiosアプリのbuildもできるらしい。 cmakeを使ってxcodeを使わずにiosアプリを作成する

その他オプション

使ったオプションメモってく。

オプション 説明 example
-DCMAKE_BUILD_TYPE ビルドタイプの指定 cmake -DCMAKE_BUILD_TYPE=Debug ..
-DCMAKE_OSX_ARCHITECTURES macosでcpuアーキテクチャの指定 cmake -DCMAKE_OSX_ARCHITECTURES=arm64;x86_64 ..

C++開発シリーズ

References