CMake에 대해서 정리해보려고 했는데 출처 1, 2에 설명이 정말 잘 정리되어 있어서 개인적으로 사용하는(사용해본) 명령어만 정리해보았다. 대부분 출처 1, 2에서 발취한 내용이다.
CMake 최소 지원 버전 선택하기 (CMAKE_MINIMUM_REQUIRED)
CMake 지원 최소 버전을 명시할 때 사용한다. 보통 CMakeLists.txt 파일 제일 처음에 작성한다.
//MK: Baseline
CMAKE_MINIMUM_REQUIRED(VERSION <VER>)
//MK: (예제) CMake Version 2.0 이상을 사용해야 함
CMAKE_MINIMUM_REQUIRED(VERSION 2.0)
- VER: CMake 최소 버전
File 및 Folder 위치 정보 변수에 저장하기 (GET_FILENAME_COMPONENT)
File 및 Folder의 위치를 변수에 저장할 때 사용한다. 소스 코드와 컴파일하는 위치를 달리할 때 많이 사용하는 것 같다. 예를 들어서 ./build라는 폴더에 빌드한 파일을 저장하고 싶고 소스 파일은 ./src에 저장되어 있으면 ./build 폴더를 기준으로 ./src 위치 값을 알아야 한다.
//MK: Baseline
GET_FILENAME_COMPONENT(<VAR> <FILENAME> <MODE> <CACHE>)
//MK: (예제) PROPATH에 ../src PATH의 절대 경로 값을 저장함
GET_FILENAME_COMPONENT(PROPATH ../src ABSOLUTE)
- VAR: 위치 값을 저장하기 위한 변수 이름
- FILENAME: 변수에 저장할 위치 정보
- MODE: 아래 2가지 중 선택
- ABSOLUTE: Full path to file (파일의 실제 위치를 의미)
- REALPATH: Full path to existing file with symlinks resolved (Symbolic Linked를 제거한 파일 위치를 의미)
- CACHE: 변수에 추가로 저장할 정보 값 (If the optional CACHE argument is specified, the result variable is added to the cache)
Header 파일 폴더 추가 (-I) (INCLUDE_DIRECTORIES)
소스파일에서 #include를 사용해서 포함하는 Header 파일들의 위치를 추가할 때 사용한다. 컴파일 옵션 중 “-I”에 해당한다.
//MK: Baseline
INCLUDE_DIRECTORIES ( <DIRECTORY> <DIRECTORY> ... )
//MK: (예제) /usr/include 와 ${PROPATH}/include을 추가한다.
//MK: ${PROPATH} 변수는 "File 및 Folder 위치 정보 변수에 저장하기"에서 저장한 경로를 의미한다.
INCLUDE_DIRECTORIES ( /usr/include ${PROPATH}/include )
- DIRECTORY: Header 파일들이 위치한 폴더
Library 파일 폴더 추가 (-l) (LINK_DIRECTORIES)
컴파일하는 과정에 필요한 Linked Library 폴더 위치를 추가할 때 사용한다. 컴파일 옵션중 “-l”에 해당한다.
//MK: Baseline
LINK_DIRECTORIES ( <DIRECTORY> <DIRECTORY> ... )
//MK: (예제) /usr/lib 와 ${PROPATH}/lib을 추사한다.
//MK: ${PROPATH} 변수는 "File 및 Folder 위치 정보 변수에 저장하기"에서 저장한 경로를 의미한다.
LINK_DIRECTORIES ( /usr/lib ${PROPATH}/lib )
- DIRECTORY: Linked Library가 위치한 폴더
여러 파일 이름을 변수에 저장하기 (FILE <FileSystem>)
여러 파일 이름을 변수에 저장하기 위해서 사용한다. Regular Expression을 사용해서 파일 이름을 탐색한다.
//MK: Baseline
FILE( <GLOB|GLOB_RECURSE> <VAR> <PATH+EXPRESSION> ... )
//MK: ${PROPATH} 변수는 "File 및 Folder 위치 정보 변수에 저장하기"에서 저장한 경로를 의미한다.
//MK: ${PROPATH} 변수 폴더 아래 있는 모든 .cpp 파일을 NONRECURSIVE 변수에 저장한다.
FILE( GLOB NONRECURSIVE ${PROPATH}/*.cpp )
//MK: ${PROPATH} 변수 폴더와 모든 하위 폴더에 있는 .h 파일을 RECURSIVE 변수에 저장한다.
FILE( GLOB_RECURSE RECURSIVE ${PROPATH}/*.h )
- GLOB|GLOB_RECURSE
- GLOB: 폴더에 위치한 파일만 의미함
- GLOB_RECURSE: 폴더에 위치한 모든 파일과 하위 폴더에 포함된 모든 파일을 의미함
- VAR: 파일 이름을 저장하기 위한 변수 이름
- PATH+EXPRESSION: 경로와 저장하고자 하는 파일을 의미함
빌드 바이너리 추가하기 (ADD_EXECUTABLE)
빌드에 필요한 모든 파일을 추가하고 최종적으로 빌드되는 파일을 정의한다.
//MK: Baseline
ADD_EXECUTABLE ( <EXEFILE> <SRCFILE> ... )
//MK: (예제) main.cpp를 사용해서 mkExe를 빌드한다.
ADD_EXECUTABLE ( mkExe main.cpp )
//MK: ${NONRECURSIVE} 변수는 "여러 파일 이름을 변수에 저장하기"에서 저장한 파일을 의미한다.
//MK: (예제) ${NONRECURSIVE} 변수에 저장된 파일들을 사용해서 mkExe를 빌드한다.
ADD_EXECUTABLE ( mkExe ${NONRECURSIVE} )
- EXEFILE: Executable File 이름
- SRCFILE: Executable File을 생성하기 위해서 필요한 파일
빌드 과정에 다양한 명령어 추가 (ADD_CUSTOM_COMMAND)
빌드하는 과정에 추가로 실행이 필요한 명령어를 추가할 때 사용한다. 크게 2가지 Target 또는 Output 형태로 정의를 할 수 있다.
Target은 CMakeLists.txt에 정의된 Target(파일이름 등)을 기준으로 추가 명령어의 실행 시점을 설정한다. 예를 들어서 ADD_EXECUTABLE를 사용해서 빌드하는 파일을 Target으로 설정할 수 있다. 아래는 ADD_CUSTOM_COMMAND에서 Target을 사용해서 추가로 명령어를 등록하는 방법을 정리하였다.
//MK: Baseline
ADD_CUSTOM_COMMAND ( TARGET <TARGET_NAME> <PRE_BUILD|PRE_LINK|POST_BUILD>
COMMENT <MESSAGE>
WORKING_DIRECTORY <DIRECTORY_PATH>
COMMAND <CMD> )
//MK: (예제) mkExe빌드가 완료되면 아래 저장된 명령어를 실행한다.
//MK: (예제) 명령어는 Copy Folder라는 문구를 출력한 다음에 폴더를 복사한다.
ADD_CUSTOM_COMMAND( TARGET mkExe POST_BUILD
COMMENT "MK: Copy Folder"
COMMAND ${CMAKE_COMMAND} -E copy_directory ./testConfig ./finalTestConfig)
- TARGET_NAME: Target 이름
- PRE_BUILD|PRE_LINK|POST_BUILD
- PRE_BUILD: 빌드 전에 명령어를 실행함
- PRE_LINK: 빌드 중에 명령어를 실행함
- POST_BUILD: 빌드가 완료되면 명령어를 실행함
- MESSAGE: 출력하는 메시지
- DIRECTORY_PATH: 작업 폴더
- CMD: 실행하고자 하는 명령어
- 추가로 다양한 옵션이 있음 (출처 5)
아래는 ADD_CUSTOM_COMMAND에서 Output을 사용하는 방법을 정리하였다.
//MK: 정리필요 (추가 예정)
출처
- https://www.tuwlab.com/ece/27234
- https://www.tuwlab.com/ece/27260
- https://cmake.org/cmake/help/latest/command/get_filename_component.html
- https://cmake.org/cmake/help/latest/command/file.html?highlight=file
- https://cmake.org/cmake/help/latest/command/add_custom_command.html