Etc.,  Programming

CMake 사용법

What is CMake?

CMake란 cross-platform build system으로 우리가 일반적으로 많이 이용하는 Make에서 확장된 프로그램이다. 어떤 platform을 target으로 사용되는 Make와 다르게 다양한 platform에서도 동작 할 수 있는 build system을 CMake를 통해 이용 가능하다.

위 그림을 보면 CMakeLists.txt 라는 파일에 우리가 만들고자 하는 build system을 기술해주면 해당 파일을 통해 Makefile을 생성해서 최종적으로 Makefile을 통해 executable file을 생성한다. 물론 반드시 Makefile만을 생성해야 되는것은 아니다.

최상위 CMakefileLists.txt에는 반드시 두 가지 내용은 들어가야 한다.

# CMake 프로그램의 최소 버전
cmake_minimum_required(VERSION 3.11)

# 프로젝트 정보
project(
  ShuminProject
  VERSION 0.1
  DESCRIPTION "예제 프로젝트"
  LANGUAGES CXX)
  • Program version
  • Project information

참고로 주석은 #로 남길 수 있으며, CMake 명령어들은 대소문자를 구분하지 않는다.

실행파일 만들기

# main.cpp
#include <iostream>
    
int main() {
    std::cout << "Hello CMake" << std::endl;
    return 0;
}
# CMakeLists.txt                 
# Minimum required CMake version 
cmake_minimum_required (VERSION 3.20)
                                 
# Project information            
project (                        
    ShuminProject                
    VERSION 0.1                  
    DESCRIPTION "Toy Exmaple"    
    LANGUAGES CXX                
       )                         

add_executable (program main.cpp)

우선 위와 같이 main.cppCMakeLists.txt 파일을 만들어준다. 그리고 build directory를 생성해서 해당 directory에서 cmake 명령을 수행해준다. 이유는 각종 makefile에 필요한 파일들이 생성 (캐시 용도) 이 되면 프로젝트 directory가 난장판이 될 수 있기 때문이다.

$ tree
.
|-- build
|-- CMakeLists.txt
`-- main.cpp

1 directory, 2 files
$ cmake ..
-- The CXX compiler identification is GNU 7.5.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /user/soca/tools/rhel7.9/envs/sparta/bin/x86_64-conda_cos6-linux-gnu-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /user/soca/users/km.hero.lee/01_Misc/tests/cmake/example/build

build directory에 가서 cmake .. 명령을 수행하게 되면 다음과 같이 다양한 파일 및 디렉토리가 생성된다.

$ tree
.
|-- CMakeCache.txt
|-- CMakeFiles
|   |-- 3.20.2
|   |   |-- CMakeCXXCompiler.cmake
|   |   |-- CMakeDetermineCompilerABI_CXX.bin
|   |   |-- CMakeSystem.cmake
|   |   `-- CompilerIdCXX
|   |       |-- a.out
|   |       |-- CMakeCXXCompilerId.cpp
|   |       `-- tmp
|   |-- cmake.check_cache
|   |-- CMakeDirectoryInformation.cmake
|   |-- CMakeOutput.log
|   |-- CMakeTmp
|   |-- Makefile2
|   |-- Makefile.cmake
|   |-- program.dir
|   |   |-- build.make
|   |   |-- cmake_clean.cmake
|   |   |-- compiler_depend.make
|   |   |-- compiler_depend.ts
|   |   |-- DependInfo.cmake
|   |   |-- depend.make
|   |   |-- flags.make
|   |   |-- link.txt
|   |   `-- progress.make
|   |-- progress.marks
|   `-- TargetDirectories.txt
|-- cmake_install.cmake
`-- Makefile

6 directories, 24 files

CMake를 통해 Makefile이 생성됐기 때문에 make 명령을 통해 최종 executable file (program)이 생성된 것을 볼 수 있다.

$ make
[ 50%] Building CXX object CMakeFiles/program.dir/main.cpp.o
[100%] Linking CXX executable program
[100%] Built target program
$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile  program
$ ./program 
Hello CMake

Reference

  1. https://modoocode.com/332
  2. https://github.com/Kitware/CMake

Leave a Reply

Your email address will not be published. Required fields are marked *