[Linux] CMake 명령어 정리 (CMake Commands)

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: 정리필요 (추가 예정)

출처

  1. https://www.tuwlab.com/ece/27234
  2. https://www.tuwlab.com/ece/27260
  3. https://cmake.org/cmake/help/latest/command/get_filename_component.html
  4. https://cmake.org/cmake/help/latest/command/file.html?highlight=file
  5. https://cmake.org/cmake/help/latest/command/add_custom_command.html

Leave a Comment