글에 앞서 먼저 말하고 싶은 것은 이 글은 CMake 강좌의 내용이 아닌 cmake 파일 기반의 프로젝트를 접하게 되었을 때에 최소한에 알아야 할 만한 내용들을 설명하고자 한다.
이 내용을 알게되면 간단한 구조의 cmake 파일의 복사 붙여넣기 식의 작성은 충분히 가능할 것이라고 생각된다.
필자는 그동안 MSVS 만을 계속 사용하였으나 필요에 따라 OpenCV 와 같은 오픈소스 라이브러리 등을 필요하여 cmake 기반의 빌드 시스템을 어쩔 수 없이 사용한 적이 많았다.
하지만 그때마다 블로그 정보나 간단한 tutorial 을 통해서 기계적으로 또는 뭔지도 모르고 cmake-gui 기반에서 MSVS 프로젝트를 생성하여 사용하는게 전부였다.
솔직히 cmake 프로젝트를 보면 정말 해석할 생각은 하지도 못하고 그냥 무시한채로 어려운 것 이라고만 생각해왔다.
최근 Qt, Vtk 기반의 프로젝트를 진행하면서 cmake에 대한 공부를 조금 하였고 기본적인 활용하기에 생각만큼 어려운 것도 아니었구나 생각이 들어 혹시라도 필자와 같이 cmake를 어려워하는 개발자들에게 도움이 되었으면 한다.
1. Compile + Linking = Build
프로그램은 간단히 컴파일 단계와 링크 단계를 합쳐 빌드를 수행한다.
컴파일은 소스코드를 기계언어로 변환하는 것이고 링크는 여러개의 컴파일 완료된 파일을 연결하여 작업을 수행한다.
일련의 빌드 과정은 다양한 명령 옵션 들의 조합에 따라 작업을 수행하게 된다.
필자는 처음부터 MSVS 를 접하게되면서 컴파일러가 뭔지 빌드 옵션은 뭐가 있는지 전혀 모른체 개발을 하는 것이 당연하였고 보고싶지도 않았었다.
하지만 알고보면 MSVS에서도 여러 옵션을 gui 기반에서 활용하고 있었다. 명령 코드만 모른체...
여기에서 CMake 도 바로 그런 역할을 하는 것이다. 프로젝트에 필요한 include 경로는 어떤 것을 넣을 지 참조할 library 파일은 어떤 것을 할지 프로젝트가 여러개 있을 경우 dependency 는 어떻게 설정할 지 등등을 cmake 만의 명령 문법을 이용하여 작성하는 것이다.
그래서 Cmake에서 configure, generate 를 하면 모든 옵션 정보를 기입한 MSVS 프로젝트를 자동으로 만들게 되는 것이다.
뭔가 프로젝트 설정의 macro와 template의 개념처럼 쉽게 프로젝트를 생성할 수 있는 것 같다.
특히 아래에서 예제로 사용할 VTK 와 같이 참조할 라이브러리가 너무 많은 경우에는 정말 cmake 활용이 편한 것 같다.
2. CMake 구문 해석
아래는 vtk-example tutorial 1 의 예제 파일을 위한 CMakeList.txt 파일을 최소한으로 간략화 한 것이다.
cmake_minimum_required(VERSION 3.0.0)
project(vtkTestProject VERSION 0.1.0)
set(EXAMPLE myVtkTarget)
find_package(VTK COMPONENTS
CommonColor
CommonCore
FiltersSources
RenderingCore
REQUIRED
)
include_directories(include)
add_executable(${EXAMPLE} include/vtktest.h vtktest.cpp)
target_link_libraries(${EXAMPLE} ${VTK_LIBRARIES})
vtk_module_autoinit(
TARGETS ${EXAMPLE}
MODULES ${VTK_LIBRARIES}
)
cmake 최소 버전을 확인한다.
cmake_minimum_required(VERSION 3.0.0)
project 이름과 버전을 입력한다.
project(vtkTestProject VERSION 0.1.0)
파일 내에서 사용할 변수를 선언한다.
set(EXAMPLE myVtkTarget)
VTK 패키지를 찾고 그 안의 특정 component 모듈만 찾겠다고 지정한다.
여기에서 지정한 모듈은 VTK_LIBRARIES에 리스트 형태의 변수로 저장된다.
마지막의 REQUIRED 는 옵션 명령으로 입력된 모듈을 모두 찾아야 한다고 알려주는 거다. 만약에 못찾으면 cmake에서 에러 정보를 출력한다.
find_package(VTK COMPONENTS CommonColor CommonCore FiltersSources RenderingCore REQUIRED )
빌드에 참조할 경로 정보를 추가한다. : /I
include_directories(include)
실행파일을 만든다. 실행파일명은 위에서 변수로 지정한 이름인 myVtkTarget이고 실행파일이니 .exe 로 만들어 진다.
그리고 실행파일에 추가할 소스 및 헤더 파일을 지정한다.
add_executable(${EXAMPLE} include/vtktest.h vtktest.cpp)
타겟에 연결할 라이브러리 (lib) 를 지정한다. : /L
target_link_libraries(${EXAMPLE} ${VTK_LIBRARIES})
Vtk 패키지에서 사용하는 모듈의 autoinit을 위한 define을 만들어주는 초기화 명령어이다.
vtk_module_autoinit( TARGETS ${EXAMPLE} MODULES ${VTK_LIBRARIES} )
3. 마무리
간단한 내용이지만 cmake 사용하게 된다면 필수적으로 알면 좋을 것 같은 명령들만 볼 수 있도록 정리하였다.
앞서 언급한 듯이 본 글은 cmake 의 강좌를 위한 글이 아니므로 정확한 공부를 원한다면 아래의 블로그를 참조하면 좋을 것 같다.
cmake 대부분의 명령을 다양한 시나리오에 따라 정리를 잘 해 놓았다.
필자 또한 이 블로그를 보고 공부한 내용을 정리해야 겠다는 생각을 하게 되었다.
참조 : https://gist.github.com/dongbum/d1d49e38a20f9cf52ea39f9ce2702160