vs/vscode/cmake/catch2 環境構築メモ

自分用メモ
- Visual Studio 2022
- Visual Studio Code
- Catch2
- CMake: visual studio installer経由で最新
を行き来してc++を書くときの環境を統一するために最低限やったほうがいいこと。
cmake
cmake
は必須。
CMakePresets.json
も必須。これを使わないとプロジェクトの出力先の統一ができない。Debug/ReleaseをVisual Studio上で切り替えられるようにもしておく。
CMakeLists.txt
やCMakePresets.json
の設定は全部copilotなりに書かせるととても楽。必要であればドキュメントを読む。
formatter
clang-formatを使う。
.clang-format
をworkspaceのrootに放り込んでおけばたぶん大丈夫。
一応Visual Studio Installer経由でclangを入れておいた、けど有無で動作が変わるかは確認していない。
BasedOnStyle: Google
IndentWidth: 4
テスト周り
Catch2
を使用する場合、catch_discover_tests
時にTEST_PREFIX
を設定しておく。
set(TEST_PREFIX "${TARGET}.")
catch_discover_tests(${TARGET} TEST_PREFIX "${TEST_PREFIX}" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
-
${TARGET}.
.
で区切っておくとVisual StudioのTest Explorerが.
で階層化してくれる。
google testやboost testならclass / namespace
で階層化してくれるかもしれないけど確認していない。
- working directoryの設定
workspaceのrootを設定しておくとテストでファイル読み込みしたいときのパス指定を全部workspaceから開始できて楽。
vscodeのsettings.json
-
"cmake.ctest.testSuiteDelimiter": "\\.|::|:",
vscode側のtest exproler指定。これをやっておくとtarget名とscenario名で階層化してくれる。
visual studio側にも似たような設定ないかな? -
"C_Cpp.default.cppStandard": "{とりあえず最新}"
cmake側の設定を見てくれないっぽいのでvscode側で最新を参照するように設定しておく。
ひとまずここまで設定するとvs <-> vscodeを行き来してもそんなに困らないくらいになるはず。

buildPresets
"buildPresets": [
{
"name": "x64-Debug",
"configurePreset": "x64-Debug",
"configuration": "Debug",
"hidden": false
},
{
"name": "x64-Release",
"configurePreset": "x64-Release",
"configuration": "Release",
"hidden": false
}
]
configuration
を指定しないと--config {configuration}
に依存した処理が正常に行えないので注意。
catch2のdebug/releaseライブラリのリンクなど。

Windows特有のパスを設定しておく。
visual studio installerからだけインストールしているとパスが通っていない。
vcvarsall.bat
を使って環境変数を設定するのが正しい手法なんだろうけど面倒なのでパスを通す。
-
cmake
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
-
ninja
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\Ninja
ジェネレーターでNinja
ではなくVisual Studio 17 2022
を使用するとvisual studio上のtest explorerからのテストを実行をしたときに、ビルドがすでに完了して変更がない状態でも毎実行依存関係検索を行い処理時間がかかっていた。プロジェクト構成によるかもしれないけど理由がない限りNinja
を使えるようにしたほうがよさそう。

Ninja/CMake/MSVC/git-bash
普段はvscode上でgit-bash
を使用している。
vs/vscodeのGUI上からのビルドやテストは問題なかったのでcopilot agentからテストやビルドを指示したところ正常に動作しなかった。
エラーは単純明快でcl.exe
のパスが認識できないとのことだった。
CMake Error at CMakeLists.txt:11 (project):
The CMAKE_CXX_COMPILER:
cl.exe
is not a full path and was not found in the PATH. Perhaps the extension is
missing?
visual studioはともかくvisual studio codeでの動作は問題なかったので調べたところ、vscode-cmake-tools
はvcvarsall.bat
を良い感じに環境変数として処理しているようだった。(これはそもそもgit-bash
を使ってはいないが)
ひとまず動作確認のためにcmd.exe
上から対応できるか確認することにした。
-
cmd.exe
からvcvarsall.bat
を起動 -
bash.exe
をログインシェルとして起動・対話型シェルとして起動
これでgit-bash
上でMSVC関連のコマンドが正常に動作する。
vcvarsall.bat x64 && bash.exe --login -i
// OK
cmake --preset x64-Debug
vscodeから起動するgit-bashに環境変数を設定する
cmd.exe
からgit-bash
を起動し環境変数を引き継ぐのは簡単。しかしgit-bash
からbat
を呼び出して環境変数だけを引き継ぐのは大変。
最終的にvscodeの標準ターミナルはcmd.exe
とし、起動時にbat
ファイルを実行したあとにgit-bash
を起動する方法で解決した。
まずvcvarsall.bat
を実行してからgit-bash
を起動するbat
を用意する。
@echo off
REM Visual Studioの環境変数を設定
call "{path to }\vcvarsall.bat" x64
REM git-bashをログインシェルとして起動
"{path to }\bash.exe" --login -i
次に、.vscode/settings.json
に起動ターミナルを追加する。
"terminal.integrated.profiles.windows": {
"Cmd with vcvarsall and Git Bash": {
"path": "cmd.exe",
"args": [
"/k",
"open_bash.bat"
],
}
},
"terminal.integrated.defaultProfile.windows": "Cmd with vcvarsall and Git Bash"
これでターミタルを立ち上げると環境変数を引き継いだgit-bash
が自動で立ち上がるようになる。copilot agentが実行するコマンドは(たぶん明示しない限りは)デフォルトのターミナルを使用するのでそちらも環境変数を引き継いだgit-bash
が立ち上がる。