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.cpp
와 CMakeLists.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
- https://modoocode.com/332
- https://github.com/Kitware/CMake