-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
227 lines (209 loc) · 11.6 KB
/
CMakeLists.txt
File metadata and controls
227 lines (209 loc) · 11.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# =============================================================================
# Modern C++ Conan Template - CMake Configuration
#
# 本プロジェクトは、Conan 2.x による外部パッケージ管理を統合したモダン C++開発を支援するビルド構成を提供します。
# ユニットテスト、静的解析、カバレッジ測定、ドキュメント生成、レポート出力
# など、開発・検証・保守に必要な機能を包括的に統合しています。
#
# 対応機能:
# - C++17 対応
# - 出力ディレクトリの分離(lib / bin)
# - Google Test + Google Mock によるユニットテストとCTest連携
# - Clang-Tidy による静的解析(存在時のみ有効)
# - Valgrind によるメモリリーク検出
# - lcov によるカバレッジ測定(HTML出力付き)
# - Doxygen によるドキュメント生成
# - テスト結果 (gtest XML) の HTMLレポート変換(xsltproc利用)
# - clean_all によるビルド成果物の一括削除
#
# カスタムターゲット(以下のコマンドで実行):
# cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake # 初期構成
# cmake --build build # ビルド
# cmake --build build --target run_tests # ユニットテストの実行
# cmake --build build --target test_report # テスト結果HTMLレポート生成
# cmake --build build --target coverage # カバレッジ測定とHTML出力 (SETUP_GUIDE.mdを参照)
# cmake --build build --target doc # ドキュメント生成
# cmake --build build --target clang_tidy # 静的解析の実行
# cmake --build build --target valgrind # メモリリーク検出
# cmake --build build --target clean_all # 全成果物の削除
#
# ディレクトリ構成(推奨):
# project_root/
# ├── include/ - ヘッダファイル
# ├── src/ - ソースコード
# ├── test/ - テストコード
# ├── docs/ - ドキュメント関連
# ├── tools/ - 各種スクリプト
# └── build/ - ビルド出力先(外部生成)
#
# 必須ツール(事前にインストールが必要):
# - CMake 3.15 以上
# - GCC または Clang(C++17 対応必須)
# - Google Test および Google Mock (導入方法について README.md を参照)
# - Doxygen(ドキュメント生成用)
# - lcov, genhtml(カバレッジ解析用)
# - xsltproc(HTMLレポート変換用)
# - clang-tidy(静的解析用)
# - valgrind(メモリリーク解析用)
# =============================================================================
cmake_minimum_required(VERSION 3.15)
project(ModernCppConanTemplate VERSION 1.0.0 LANGUAGES CXX)
# -----------------------------------------------------------------------------
# CMAKE_BUILD_TYPE のデフォルト設定
# Conan CMakeDeps が生成するファイルは CMAKE_BUILD_TYPE の設定を必須とする。
# 未指定の場合は Release をデフォルトとして設定する。
# -----------------------------------------------------------------------------
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
# -----------------------------------------------------------------------------
# ライブラリ形式の選択肢:STATIC or SHARED(デフォルトは STATIC)
#
# SHARED を選択すると、動的ライブラリ(DLL)としてビルドされます。
# cmake -DBUILD_SHARED_LIBS=ON -S . -B build_shared
# -----------------------------------------------------------------------------
option(BUILD_SHARED_LIBS "Build libraries as shared (DLL) or static" OFF)
# -----------------------------------------------------------------------------
# IntelliSense 向け compile_commands.json の生成
# -----------------------------------------------------------------------------
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# =============================================================================
# Conan vendor パッケージ設定
#
# vendor/conan_toolchain.cmake を使用して find_package を解決する。
# cmake 構成時にツールチェーンファイルを指定すること:
# cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
# 初回セットアップ: bash tools/conan_setup.sh を実行後、vendor/ を git commit。
# 以降のビルドでは Conan 不要(詳細: docs/CONAN_SETUP.md)。
# =============================================================================
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/vendor/conan_toolchain.cmake")
message(FATAL_ERROR
"[Conan] vendor/conan_toolchain.cmake が見つかりません。\n"
"以下のコマンドで初回セットアップを行ってください:\n"
" bash tools/conan_setup.sh\n"
"詳細は docs/CONAN_SETUP.md を参照してください。"
)
endif()
find_package(spdlog REQUIRED)
find_package(cxxopts REQUIRED)
find_package(libpqxx REQUIRED)
find_package(nlohmann_json REQUIRED)
find_package(libsodium REQUIRED)
# -----------------------------------------------------------------------------
# 出力先ディレクトリ設定
# (アーカイブ(lib), ライブラリ(lib), 実行バイナリ(bin))
# -----------------------------------------------------------------------------
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# -----------------------------------------------------------------------------
# clang-tidy静的解析設定
# (clang-tidyが存在する場合、ビルド時に自動チェック)
# -----------------------------------------------------------------------------
find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
if(CLANG_TIDY_EXE)
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE}")
endif()
# -----------------------------------------------------------------------------
# テスト有効化
# (Google Testを利用するためにCTestサポートを有効にする)
# -----------------------------------------------------------------------------
enable_testing()
# -----------------------------------------------------------------------------
# サブディレクトリ追加
# -----------------------------------------------------------------------------
add_subdirectory(src)
add_subdirectory(test)
# =============================================================================
# Doxygen ドキュメント生成ターゲット
# =============================================================================
find_package(Doxygen QUIET)
if(DOXYGEN_FOUND)
set(DOXYGEN_IN ${CMAKE_SOURCE_DIR}/docs/Doxyfile)
set(DOXYGEN_OUT ${CMAKE_SOURCE_DIR}/docs/html)
add_custom_target(doc
COMMAND ${CMAKE_COMMAND} -E echo "📝 Doxygenドキュメントを生成します..."
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_IN}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Doxygenドキュメントを生成"
VERBATIM
)
else()
message(WARNING "Doxygenが見つかりませんでした。'make doc'は使えません。")
endif()
# =============================================================================
# run_tests ユニットテスト実行ターゲット
# =============================================================================
add_custom_target(run_tests
COMMAND ${CMAKE_COMMAND} -E echo "🧪 ユニットテストを実行します..."
COMMAND ${CMAKE_CTEST_COMMAND} -R UnitTests --output-on-failure
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "ユニットテスト(UnitTests)を実行"
VERBATIM
)
# =============================================================================
# test_report ユニットテスト結果HTMLレポート生成ターゲット
# =============================================================================
add_custom_target(test_report
COMMAND ${CMAKE_COMMAND} -E echo "📄 ユニットテスト結果レポートを生成します..."
COMMAND bash ${CMAKE_SOURCE_DIR}/tools/generate_test_report.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "GoogleTest の XML結果を HTML に変換"
VERBATIM
)
# =============================================================================
# run_integration_tests 統合テスト実行ターゲット
# =============================================================================
add_custom_target(run_integration_tests
COMMAND ${CMAKE_COMMAND} -E echo "🔧 統合テストを実行します..."
COMMAND ${CMAKE_CTEST_COMMAND} -R IntegrationTests --output-on-failure
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "統合テスト(IntegrationTests)を実行"
VERBATIM
)
# =============================================================================
# Coverage カバレッジレポート生成ターゲット
# =============================================================================
add_custom_target(coverage
COMMAND ${CMAKE_COMMAND} -E echo "📈 カバレッジレポートを生成します..."
COMMAND bash ${CMAKE_SOURCE_DIR}/tools/generate_coverage.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "カバレッジレポートを生成"
VERBATIM
)
# =============================================================================
# clang_tidy 静的解析ターゲット(build/clang_tidy.logにログ出力)
#
# 参考: ANSIカラーコードを除去するためのコマンド
# cat ./build/clang_tidy.log | sed -r 's/\x1B\[[0-9;]*[mK]//g' > ./build/clang_tidy_cleaned.log
# =============================================================================
if(CLANG_TIDY_EXE)
add_custom_target(clang_tidy
COMMAND ${CMAKE_COMMAND} -E echo "🔍 Clang-Tidy による静的解析を実行します..."
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target unit_tests 2>&1 | tee clang_tidy.log
COMMENT "Clang-Tidy を適用するには、ビルド時に有効化されている必要があります"
VERBATIM
)
else()
message(WARNING "clang-tidy が見つかりません。'clang_tidy' ターゲットは使用できません。")
endif()
# =============================================================================
# valgrind メモリリーク検出ターゲット(tools/run_valgrind.sh 経由)
# =============================================================================
add_custom_target(valgrind
COMMAND ${CMAKE_COMMAND} -E echo "🧪 Valgrind によるメモリリーク検出を実行します..."
COMMAND bash ${CMAKE_SOURCE_DIR}/tools/run_valgrind.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Valgrind によるユニットテストの動的解析を実行中..."
VERBATIM
)
# =============================================================================
# clean_all プロジェクト全体の成果物削除ターゲット
# =============================================================================
add_custom_target(clean_all
COMMAND ${CMAKE_COMMAND} -E echo "🧹 ビルド・ドキュメント・カバレッジ成果物を全て削除します..."
COMMAND bash ${CMAKE_SOURCE_DIR}/tools/clean_all.sh
COMMENT "全てのビルド生成物を削除"
VERBATIM
)