C , C++, C#

[CMake] VS 2022 CMakePresets error using toolset

vhxpffltm 2023. 6. 5. 23:00

VS 2022 최신 버전에서 CMake를 지원해주는데

 

이번 최신 피처에 Configuration 관련해서 다양한 기능을 제공한다길래 사용해보려고 했다.

 

결론은.. Error로 인해 적용못했지만, 깃헛 이슈에도 물어보고 한번 처리해 봐야할듯하다.

 

이것이 된다면, Ninja 제너레이터에서 VS 2022 IDE로 v141 2017 툴셋으로 쉽게 환경을 구성하고 빌드할수 있을것 같다.

 

먼저, CMakePresets.json을 보자

 "configurePresets": [
    {
      "name": "debug",
      "description": "default debug preset",
      "hidden": true,
      "installDir": "${sourceParentDir}/install/debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      }
    },
    {
      "name": "ninja-debug",
      "inherits": "debug",
      "displayName": "ninja-build Debug",
      "description": "This build is available on both Linux and Windows",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build-ninja-release",
    }
  ]

 

이런 JSON이 있을때, VS 2022 IDE로 VS 2017 toolset을 사용하여 제너레이트 하고 싶었다. 

 

하지만, 우선 VS에 많은 문제가 있다.

 

https://gitlab.kitware.com/cmake/cmake/-/issues/20180

 

Invalid character escape \P error when path to compiler is passed from VS2019 (#20180) · Issues · CMake / CMake · GitLab

The compiler path passed to CMake is not converted to forward slashes: set(CMAKE_C_COMPILER "C:\Program Files\LLVM/bin/clang-cl.exe") In VS2019's CMakeSettings.json I have defined the following environment to configure...

gitlab.kitware.com

 

컴파일 플래그쪽에 cl 경로를 2017로 잡으려고 했는데.. 얘들이 이스케이프 문자에 대해 처리를 개판으로 되어 있는지 윈도우상의 경로를 제대로 읽지 못한다....

 

그리고 위 방식으로 잡았다 해도.. cl 을 제대로 인식하지 못하는지 CMake Configuration 에러가 발생하고 있다...

 

그러다 toolset 이란 데이터를 보게됬다.

 

https://github.com/microsoft/vscode-cmake-tools/issues/2423

 

Setting only the VS toolset name in CMakePresets.json does not select the correct toolset for Ninja generators · Issue #2423 ·

When specifying a toolset name in CMakePresets.json, the correct toolset version is selected when using Visual Studio generators but not Ninja Generators. I have both VS 2017 and VS 2019 installed ...

github.com

 

해당 패치로 toolset을 설정할 수 있는것 같은데 로컬 환경에서는 이상하게 작동하고 있다...

 

"toolset": {
    "value": "v143,host=x64,version=14.16....",
    "strategy": "external"
},

 

 

 

컴파일러를 VS가 아닌 다른 컴파일러로 인식하고 configuration하고 있다.

 

이것만 고쳐진다면 VS 2022 IDE를 통해 손쉽게 CMake를 제너레이터 할수 있고 꼭 VS가 아닌 Ninja 제너레이터를 활용하는데 쉬울거 같다.

 

이거만 보면... CLion이랑 너무 차이가 나는데.. VS도 얼른 고쳐줬으면 좋겠다.

 

아 그리고 어쩌다 알게되었는데 CMake에서 Generator에 툴셋을 적용하고 싶으면 -T 옵션을 사용하면 된다.

 

혹시 모르니 MS의 VS CMake 관련 문서도 꼭 확인해서 점검해보자.

 

여기서는 아래와 같은 내용을 확인 가능했다.

 

1. Visual Studio CMakePresets.json에서 경로 path에 이스케이프에 이슈가 있다. 그래서 환경 변수로 경로를 주고 path에 환경변수를 사용해서 적용할 수 있다.

2. CMakePresets.json에 toolset을 사용해서 대상 타겟을 설정할수 있다. 

3. Cmake 커맨드로 -T 옵션을 사용해서 대상 타겟을 원하는 VS 컴파일러로 사용할 수 있다.

 

 

 

https://learn.microsoft.com/ko-kr/cpp/build/configure-cmake-debugging-sessions?view=msvc-170 

 

Visual Studio에서 CMake 디버깅 세션 구성

Visual Studio를 사용하여 CMake 디버거 설정을 구성하는 방법을 설명합니다.

learn.microsoft.com

 

https://learn.microsoft.com/ko-kr/cpp/build/cmakesettings-reference?view=msvc-170&viewFallbackFrom=vs-2019#environments 

 

CMakeSettings.json 스키마 참조

자세한 정보: CMakeSettings.json 스키마 참조

learn.microsoft.com