🛠️

CMake基本コマンドメモ

に公開

CMakeの基本コマンドのメモ。
自分用。

実行

Makeの場合

設定時にRelease, Debugを指定

cmake -S . -B build -G "Unix Makefiles" -D CMAKE_CXX_COMPILER=g++ -D CMAKE_BUILD_TYPE=<config_type>
cmake --build build

<config_type>=<Release|Debug|...>

Ninja Multi-Configの場合

ビルド時にRelease, Debugを指定

cmake -S . B build -G "Ninja Multi-Config" -D CMAKE_CXX_COMPILER=g++
cmake --build build --config <config_type>

基本設定

cmake_minimum_required(VERSION 4.0.3)
project(projectName
	LANGUAGES CXX
	VERSION 1.0.0
)

コンパイラオプション

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
set(CMAKE_CXX_FLAGS_DEBUG "-g3 -O0 -DDEBUG")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

CMAKE_CXX_STANDARD_REQUIRED ON: 標準をコンパイラがサポートしない場合に異常終了
CMAKE_CXX_EXTENSIONS OFF: コンパイラの独自拡張を無効化
CMAKE_EXPORT_COMPILE_COMMANDS ON: ビルドログ取得

依存関係の設定

実行可能ファイルが依存するソース

add_executable(targetName source1 [source2 ...])

ライブラリが依存するソース

add_library(targetName
	[STATIC|SHARED|MODULE] 
	[EXCLUDE_FROM_ALL]
	source1 [source2 ...])

STATIC: 静的ライブラリ
SHARED: 共有ライブラリ
MODULE: 動的ロード
EXCLUDE_FROM_ALL: メインのターゲットにリンクされるときだけビルド

ターゲットが依存するライブラリ

target_link_libraries(targetName
	<PRIVATE|PUBLIC|INTERFACE> item1 [item2 ...]
	<PRIVATE|PUBLIC|INTERFACE> item3 [item4 ...]
)

PRIVATE: ターゲットの実装が依存
PUBLIC: ターゲットの実装とクライアントコードが依存
INTERFACE: ターゲットのクライアントコードが依存

外部ライブラリ

標準パスにインストールされている場合

find_package(Qt5 5.9 REQUIRED Gui Widgets Network)
target_link_libraries(targetName PRIVATE
	Qt5::Gui
	Qt5::Widgets
	Qt5::Network
)

GitHubから取り込む場合

include(FetchContent)
set(FETCHCONTENT_UPDATES_DISCONNECTED ON)
set(FETCHCONTENT_QUIET OFF)

FetchContent_Declare(ftxui
    GIT_REPOSITORY https://github.com/arthursonzogni/ftxui.git
    GIT_TAG        v5.0.0
    GIT_PROGRESS   TRUE
    GIT_SHALLOW    TRUE
    EXCLUDE_FROM_ALL
)
FetchContent_MakeAvailable(ftxui)

target_link_libraries(targetName PRIVATE ftxui::screen)

FETCHCONTENT_UPDATES_DISCONNECTED ON: コンパイル時にアップデートしない
FETCHCONTENT_QUIET OFF: ダウンロード時のログを出力
GIT_SHALLOW TRUE: シャロークローン

小技

ソースの自動リストアップ

file(targetName SOURCE_LIST CONFIGURE_DEPENDS "src/*.h", "src/*.cpp")
add_executable(sample ${SOURCE_LIST})

参考

Professional CMake 21st Edition, Craig Scott
ftxui-starter
Theoride Technology 実践C++応用講座CMake編

Discussion