본문 바로가기

도구의발견

CMake

CMake?

CMake는 주로 리눅스 환경에서 C/C++프로젝트의 빌드, 테스트, 패키징을 도와주는 크로스 플랫폼 오픈 소스 툴입니다(물론 다른 언어에도 사용 가능합니다). CMake는 복잡한 make파일을 직접 작성하는 대신 간단한 명령어들의 조합으로 파일들 끼리의 의존성이나 컴파일 환경에 따른 make 결과물을 컨트롤 합니다.

CMake 공식 홈페이지 : https://cmake.org

HelloWorld 디렉토리 안에 main.cpp 파일이 있다고 가정하고 CMake를 작성하는 방법을 배워 보도록 하겠습니다.

CMakeLists.txt

가장 먼저 HelloWorld 디렉토리 안에 CMakeLists.txt 파일을 만들어 줍니다. CMakeLists.txt는 약속된 파일이름으로써 cmake 커맨드는 이 파일을 읽어 make파일을 만들어 냅니다.

NOTE - CMakeLists.txt는 고정된 이름입니다. 다른 이름의 cmake파일은 사용 할 수 없습니다.

변수

set( <변수 이름> 값 )
  • '변수'를 선언 할때는 set 커맨드를 사용합니다. 커맨드는 대소문자를 가리지 않습니다.
  • '값'은 숫자, 문자열, 리스트 무엇이든 가능합니다.
  • 변수에 접근 할때는 ${<변수이름>} 과 같이 씁니다.
set(PROJECT_NAME "HelloWorld")

주석

주석은 '#'를 사용합니다.

 

message 명령어

message([<모드>] "message text" ...)
message(${PROJECT_NAME})

project 명령어

project(<프로젝트 이름>)

모든 CMakeLists.txt는 project 명령어를 가지고 있어야 합니다. 그렇지 않으면 "No project() command is present" 경고가 나옵니다.

project("HelloWorld") or project(${PROJECT_NAME})

그런데 프로젝트 이름을 매번 지정하기 귀찮습니다. 이번에는 현재 디렉토리의 이름을 프로젝트 이름으로 지정해 보겠습니다.

get_filename_component 명령어

get_filename_component(<변수 이름> <파일 이름> <모드> [CACHE])
get_filename_component(PROJECT_NAME ${CMAKE_SOURCE_DIR} NAME)
message(${PROJECT_NAME}) # "HelloWorld"

${CMAKE_SOURCE_DIR}는 cmake 내장 변수로써 현재 디렉토리 위치를 나타 냅니다. NAME은 ${CMAKE_SOURCE_DIR}로부터 디렉토리 경로를 제외한 파일 이름만 리턴하라는 의미입니다(라고 설명은 되어 있지만, 사실은 단순히 마지막 '/' 뒤의 문자열을 리턴합니다. 위 예제에서는 'HelloWorld' 입니다). 그리고 그걸 PROJECT_NAME이라는 변수에 저장합니다.

NOTE - get_filename_componet 명령어를 사용 할 때 cmake_minimum_required 명령어를 통해 버전을 확인하지 않으면 "No cmake_minimum_required command is present" 경고가 발생 합니다.

cmake_minimum_required 명령어

cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])
cmake_minimum_required(VERSION 3.16)

get_filename_component(PROJECT_NAME ${CMAKE_SOURCE_DIR} NAME)
message(${PROJECT_NAME}) # "HelloWorld"

project(${PROJECT_NAME})

add_executable 명령어

add_executable(<결과 바이너리 파일 이름> [WIN32] [MACOSX_BUNDLE] [EXECLUDE_FROM_ALL] soruce1 soruce2 ...)
  • soruce1, source2 같이 컴파일 될 파일들의 리스트를 적어주면 컴파일에서 부터 링크까지 완료해서 <결과 바이너리 파일 이름>의 바이너리를 만들어 줍니다.
cmake_minimum_required(VERSION 3.16)

get_filename_component(PROJECT_NAME ${CMAKE_SOURCE_DIR} NAME)
message(${PROJECT_NAME}) # "HelloWorld"

project(${PROJECT_NAME})

add_executable(${PROJECT_NAME} main.cpp)

cmake CMakeLists.txt 와 make

기본적인 CMake 파일의 작성이 끝났습니다. 이제 커맨드 창으로 가서 cmake CMakeLists.txt 명령어를 입력하고 결과로 나온 Makefile을 이용해 make를 해보겠습니다.

$ cmake CMakeLists.txt
HelloWorld
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/d/HelloWorld
$ make
Scanning dependencies of target HelloWorld
[ 50%] Building CXX object CMakeFiles/HelloWorld.dir/main.cpp.o
[100%] Linking CXX executable HelloWorld
[100%] Built target HelloWorld
$ ls
CMakeCache.txt CMakeFiles CMakeLists.txt HelloWorld Makefile cmake_install.cmake main.cpp

컴파일, 링킹 과정을 거쳐서 HelloWorld 실행 파일이 만들어 진것을 확인 할 수 있습니다.

다음 포스트에는 add_executable의 인자로 넘어가는 파일 리스트를 자동으로 생성하는 방법을 알아 보도록 하겠습니다.

[도구의발견] - [cmake] 자동으로 컴파일 대상 파일 리스트 만들기

 

[cmake] 자동으로 컴파일 대상 파일 리스트 만들기

NOTE - [도구의발견] - CMake에서 CMake의 기본 사용법을 익혀 보세요. cmake를 이용해 실행 바이너리를 만들기 위해서는 add_executable 명령을 사용하면 됩니다. add_executable( [WIN32] [MACOSX_BUNDLE] [EXC..

kukuta.tistory.com

부록 1. 전체 CMakeLists.txt

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!