Visual Studio에서 CMake 사용하기

윈도우 환경에서 cmake와 visual studio를 이용해 빌드하는 과정은 다음과 같다.

  1. Cmake로 visual studio용 솔루션과 프로젝트 파일을 만든다.
  2. IDE에서 솔루션 파일을 열거나 msbuild로 명령창에서 직접 빌드한다.

Cmake로 nmake 등을 만들어 빌드할 수도 있겠지만 여기선 별로 중요하지 않으니 제외하자. 리눅스 또는 윈도우용 gcc 컴파일러에서는 위처럼 한 단계를 더 거치지 않고 cmake로 바로 빌드할 수 있지만 윈도우에서는 그렇지 않아 다소 불편해 보인다. 하지만 이는 cmake가 특정 플랫폼에 의존하지 않으며, 플랫폼별 빌드 도구에 맞는 빌드 정보를 다시 만들어 내는 도구이기 때문이다. 즉 gcc, visual studio 등 O/S와 개발 도구에 무관하게 작성한 빌드 정보를 바탕으로 해당 도구에 맞는 정보를 새로이 만들어 내기 때문에 빌드 또는 프로젝트 관리가 수월해진다는 장점도 있다. 아무튼 cmake 쓸 일은 없을 줄 알았는데 어쩌다 보니 쓰게 돼 짧은 경험을 적어 본다.

그럼 cmake를 사용하면서 느낀 장단점을 적어 보자.

한 솔루션에 여럿이 프로젝트와 솔루션을 추가, 삭제, 설정 등을 변경할 때 손쉽게 병합할 수 있다. Visual studio 솔루션과 프로젝트 파일은 xml 형식인데 양도 많아 솔직히 눈에 잘 들어 오진 않는다. 빠뜨린 건 없는지, 중복으로 추가하는 건 없는지 꼼꼼히 살펴야 한다. 이에 비해 cmake 설정 파일은 일반 텍스트 파일이고 구조도 단순해 비교하기가 훨씬 쉽다. 간단히 얘기하면 cmake 설정 파일이 눈에 더 잘 들어온다.

설정이 간편하다. 그런데 이는 반은 맞고 반은 틀리다. Visual studio에서 뭔가 설정하려면 때에 따라 설정창 여러 곳을 오가며 바꿔야 하고 심지어 빌드 대상(release, debug)에 따라 맞춰야 한다. 공통으로 설정할 수 있으면 그나마 다행이지만 조금씩 다른 부분이 있어 일일이 대상을 바꾸며 설정해야 할 때는 꽤나 번거롭다. 하지만 cmake는 텍스트 파일에 필요한 내용만 몇 가지 적어주면 끝. 기본으로 필요한 내용은 그다지 많지도 않고, 자주 쓰는 형식을 하나 만들어 두고 복사해 써도 되니 정말 편하다. 게다가 최상위 설정 파일에는 공통, 각 프로젝트별 디렉터리에는 해당 프로젝트에 맞는 설정만 작성해 계층적으로 관리할 수 있다. 하지만 그 설정 키워드를 모르면 어떻게 시작해야 할지조차 난감하다. 적어도 visual studio에서는 설정창만 잘 찾으면 되지만 cmake는 의외로 짧은 시간에 공식 자료만 활용해 원하는 걸 하기기 쉽지 않았다. 솔직히 검색으로 찾은 스택오버플로우와 그외 정보가 없었으면 어떻게 했을지 모르겠다.

검색에 문제가 좀 있어 보인다. 이게 좀 애매해서 ‘보인다’로 적었다. 솔루션과 프로젝트를 사용하면 솔루션, 프로젝트 단위 검색 등에 전혀 문제가 없지만 cmake를 사용할 때는 open folder로 열어야 하는데 기존 검색 기능이 온전히 작동하지 않을 때가 종종 있다. 예를 들면, 보통 빠른 검색(quick search)을 쓰는데 프로젝트 단위 검색을 해 보면 현재 편집 중인 파일 내에서만 검색할 수 있고, 그나마도 찾은 키워드를 강조 표시는 하지만 검색 실패 안내창을 표시하는 현상이 있다. 그러다가도 IDE에서 폴더를 닫지 않고 며칠 계속 열어 두면 제대로 검색한다. 백그라운드에서 정보를 제대로 갱신하지 못하는 듯한데 솔루션을 사용할 때는 전혀 없는 현상이라 다소 아쉽다.

위 현상과 관련이 있는데 visual studio와 함께 사용하는 Resharper C++ 역시 문제가 있어 보인다. 리팩터링, 코드 검사(inspection) 등이 제대로 작동하지 않기도 하고 규모가 큰 프로젝트를 열 때는 정보 갱신에 시간도 많이 걸리지만 도중에 오류가 발생해 IDE 전체가 종료하는 문제도 있다. 물론 IDE에서 며칠 열어 두면 문제가 있던 기능이 다시 잘 작동하기도 하지만 역시 아쉽다. 이 역시 정보 갱신 문제로 보인다.

Visual studio에서 cmake를 지원하긴 하는데 자체 설정 파일을 추가했다. 기본값으로 만들어 주는 설정을 써도 되지만 그렇게 하면 cmake로 만드는 임시 파일을 %USERPROFILE%\CMakeBuilds에 프로젝트 해시값으로 만든다. 문제는 자동으로 지우는 게 아니라 계속 쌓인다. 이 때문에 관리하기 편하게 open folder로 열 프로젝트 최상위 디렉터리에 CMakeSettings.json을 만들고 buildRoot 정보를 프로젝트 빌드 디렉터리로 지정하는 게 좋다. 자세한 정보는 이 내용을 참고하자.

Visual studio의 솔루션 탐색기에서 지원하는 필터 기능은 당연히 없고 오로지 디렉터리 구조 그대로를 보여 주므로 취향에 따라 좋을 수도 아닐 수도 있겠다.

그럼 마지막으로 팁 하나.

검색이나 리팩터링 등이 제대로 작동하지 않을 때는 임시 방편으로 다음처럼 쓰면 된다.

  1. Open folder로 프로젝트를 연다.
  2. Cmake → Cache → Generate 메뉴로 빌드 정보를 만든다. 이전에 만든 정보가 없으면 open folder로 열 때 자동으로 만들며 이때는 할 필요없다.
  3. 빌드 정보를 만들어 내는 디렉터리에 가면 솔루션 파일이 있으므로 이를 열어 작업한다.

이는 물론 cmake 설정을 바탕으로 자동 생성한 정보이므로 cmake 설정을 바꾸고 저장하면 솔루션과 프로젝트 설정을 자동으로 바꾼 후 다시 로드할지 물어본다. Open folder로 작업하는 게 익숙하지 않을 때도 이렇게 하면 설정은 cmake를 이용하면서 작업은 기존 방식 그대로 할 수 있어 불편을 최소화할 수 있지 않을까 싶다.

 

Notes:
1. 어쩌면 검색과 resharper C++ 등에 관한 문제는 회사에서 쓰는 보안 프로그램 때문에 생기는 건 아닐까 싶기도 하지만 명확하지 않다.
2. 최근 업데이트로 바뀌었으며 초기에는 %LOCALAPPDATA%\CMakeBuild에 만들었다.
어쩌면 검색과 resharper C++ 등에 관한 문제는 회사에서 쓰는 보안 프로그램 때문에 생기는 건 아닐까 싶기도 하지만 명확하지 않다.
최근 업데이트로 바뀌었으며 초기에는 %LOCALAPPDATA%\CMakeBuild에 만들었다.

You may also like...