개요
: CMake는 플랫폼 중립적 언어로 빌드 프로세스는 CMakeLists.txt
파일에 기술한다. 이는 C/C++, 자바, 일부 스크립트 언어를 지원하며 Unix 시스템에서 실행될 때 기본 동작은 Make 기반 프레임워크(makefile과 여러개의 프레임워크 파일)를 생성한다.
기초 문법
: 다음의 쉬운 예제를 보며 기본 문법을 소개하겠다.
project (basic-syntax C)
cmake_minimum_required (VERSION 2.6)
set (name Jay)
set (addr Seoul)
message ("${name}, please give me home in ${addr}")
set_property (SOURCE add.c PROPERTY Author Jay)
set_property (SOURCE mult.c PROPERTY Author Ho)
get_property (author_name SOURCE add.c PROPERTY Author)
message ("The author of add.c is ${author_name}")
위에서와 같이,
- 모든 명령은 space로 구분된 인자를 전달받는다:
command (arg1 arg2 ...)
- 두 개의 단어를 하나의 인수로 사용하고 싶다면, 따옴표(
'
)를 사용해 하나의 인수로 지정한다. project
명령은 빌드 시스템을 식별할 수 있는 고유한 이름을 정의한다. 이는 eclipse와 같이 프로젝트 이름이 필요한 네이티브 빌드 도구에서 사용된다. 또한 C/C++, Java처럼 사용할 프로그래밍 언어를 지정한다.cmake_minimum_required
명령은 CMake 2.6 버전 이후부터 지원되는 명령을 사용하겠다는 의미이다.set
명령은 변수와 그 값을 정의한다.set_property
명령을 통해 속성 값을 설정한다. 이를 통해 파일에 값을 저장할 수 있고 빌드 시스템은 이 파일 이름을 기준으로 속성값을 관리하고 다른 명령에서 자유롭게 접근할 수 있다.
add_exectuable (calculator add sub mult calc)
- 컴파일 명령을 생성하고 종속성 그래프에 파일 이름을 추가한다.
- 여기서 확장자가 사용되지 않았는데, CMake는 확장자를 자동으로 붙여준다. 따라서 최종 실행 프로그램명은
calculator.exe
가 된다.
add_library (math STATIC add sub mult)
add_executable (calculator calc)
target_link_libraries (calculator math)
add_library
명령에서add.c
,sub.c
,mult.c
를 컴파일해 정적 라이브러리를 생성한다.add_executable
,target_link_libraries
명령을 통해calc.c
파일을 컴파일한 후math
라이브러리와 링크하여calculator
프로그램을 생성한다.
기타
include_directories
명령을 통해 컴파일러에 헤더 파일 경로를 추가할 수 있다. 이는 gcc의-I
옵션과 같다.link_directories
명령을 통해 라이브러리 경로를 추가할 수 있다. 이는 gcc의-L
명령과 같다.
컴파일 플래그 설정
: 빌드 specification에 어떤 타입의 결과물을 생성할지 지정하고, 사용할 컴파일 플래그를 설정한다.
set (CMAKE_BUILD_TYPE Debug)
명령을 통해 소스 레벨 디버깅 정보를 포함한 debug 빌드를 생성할 수 있다.set_property (DIRECTORY PROPERTY COMPILE_DEFINITIONS TEST=1)
명령을 통해 현재 디렉토리에 있는 모든 C 파일을 컴파일 시 TEST 심볼을 정의하도록 한다.set_property (SOURCE add.c PROPERTY COMPILE_DEFINITIONS QUICKADD=1)
명령을 통해 add.c를 컴파일 할 때 QUICKADD 심볼이 추가되게 한다.
외부 명령과 타겟 추가
add_custom_target
명령은 새로운 상위 레벨 타겟을 정의하고 실행될 순서를 지정한다. 이는 결과물을 생성하지 않고 파일의 갱신상태에 의존하지 않는다.
project (custom_target)
cmake_minimum_required (VERSION 2.6)
add_custom_target (print-city ALL
COMMAND echo "Seoul is nice city")
add_custom_target (print-time
COMMAND echo "SIt is now 8:45")
add_custom_target (print-day
COMMAND echo "Today is Sunday")
add_dependencies (print-city print-time print-day)
add_custom_target (print-city ALL ...
에서 ALL 키워드는 개발자가 타겟을 명시하지 않을 때print-city
가 default build로 실행되게 정의한다.add_dependencies
명령을 통해 print-city가 print-time, print-day에 종속된다는 것을 정의한다.
흐름제어
if (${my_var})
message ("..")
else ()
endif()
if (NOT my_var) # 변수에 ${}를 사용하지 않아도 됨
if (${my_age} EQUAL 40) #다른 변수나 상수와 비교 가능
if (EXIST file.txt) # 파일의 존재여부 확인
if (file.txt IS_NEWER_THAN file2.txt) # 두 파일 간 생성순서 비교
macro (my_macro ARG1 ARG2 ARG3) # 매크로 정의
message("${ARG1} ...")
my_macro(1 2 3) # 정의한 매크로 사용
일반적으로 사용되는 캐시 변수
: 새로운 캐시 변수를 정의할 수 있고, 아래의 값들을 기본값으로 초기화할 수도 있으며, 캐시 변수는 일반 변수와 같이 사용될 수 있다. 그리고 이 값을 set
명령으로 변경할 수 있다.
CMAKE_AR
,CMAKE_C_COMPILER
,CMAKE_LINKER
: 라이브러리를 묶어주는 아카이브 도구, C 컴파일러, 오브젝트 링커의 절대 경로이다.CMKAE_MAKE_PROGRAM
: /usr/bin/gmake와 같은 네이티브 빌드 도구의 절대 경로이다. 기본 설정 버전을 다른 버전으로 변경할 수 있다.CMAKE_BUILD_TYPE
: 생성하고 싶은 빌드 트리의 타입을 지정할 수 있다.Debug
: 생성되는 오브젝트 파일과 실행파일이 디버깅 정보를 포함하게 한다.Release
: 최종 실행 파일이 최적화되고 디버깅 정보를 포함하지 않게 된다.RelWithDebInfo
: 실행 파일이 최적화되지만, 디버깅 정보를 포함한다.MinSizeRel
: 실행 파일이 최소한의 메모리를 사용하게 한다.
CMAKE_C_FLAGS_*
: 앞의 네 가지 빌드 타입에 따라 C 컴파일 옵션이 지정된다.CMAKE_EXE_LINKER_FLAGS_*
: 앞의 C 컴파일 옵션과 유사하게 각 빌드 타입에 따른 링커 옵션을 나타낸다.
'빌드&테스트도구 > GCC&Make&CMake' 카테고리의 다른 글
make - make에 대한 개요 (0) | 2020.10.06 |
---|---|
GCC - (4) 링커(ld)에 관하여 (0) | 2020.09.13 |
GCC - (3) gcc의 각종 옵션 (0) | 2020.09.09 |
GCC - (2) gcc의 세부 과정 (0) | 2020.09.07 |
GCC - (1) C 컴파일 과정 개요 (0) | 2020.09.02 |