Zenn
Open4

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.txtCMakePresets.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-toolsvcvarsall.batを良い感じに環境変数として処理しているようだった。(これはそもそもgit-bashを使ってはいないが)
https://github.com/microsoft/vscode-cmake-tools/blob/main/src/installs/visualStudio.ts

ひとまず動作確認のためにcmd.exe上から対応できるか確認することにした。

  1. cmd.exeからvcvarsall.batを起動
  2. 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を用意する。

open_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に起動ターミナルを追加する。

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が立ち上がる。

ログインするとコメントできます