[CMake] 06. 개념 이해 (변수와 캐시)

글쓴이 keunjun 날짜

이번 글에서는 변수 variable과 캐시 cache를 알아본다.

1. Variable

변수 variable은 대다수의 다른 프로그래밍 언어에서의 변수와 같은 역할을 수행한다. 값을 저장하고 나중에 그 값을 읽을 수 있다. 값을 저장할 때는 set() (doc) 함수를 이용하고 변수에 저장된 값을 읽을 때는 ${VARIABLE} 표기법을 사용한다. 아래 예제를 보면 FOO라는 변수를 정의한 후 값을 넣고 출력하는 코드를 확인 할 수 있다.

# FOO is undefined

set(FOO 1) # FOO is now set to 1
message(${FOO}) # 1

set(FOO 0) # FOO is now set to 0
message(${FOO}) # 0

변수를 사용할 때는 scope을 고려하면서 사용해야한다. Scope이란 쉽게 말해서 변수가 수정될 때 영향을 끼치는 범위를 뜻한다. 어떤 CMakeLists 파일에서 var라는 변수를 만들었다고 생각해보자. 하위 CMakeLists 파일에서 부모 파일에서 만들어진 var라는 변수를 사용할 수 있다. 하지만 하위 파일에서 var를 변경한다고 해서 부모의 var에는 영향을 주지 않는다. 이건 function 함수에도 같은 메커니즘으로 작동한다.

function(foo)
    message(${var}) # 1
    set(var 2) # var is set to 2, but only in this scope
    message(${var}) # 2
endfunction()

set(var 1) # var is set to 1
foo()
message(${var}) # 1

7번째 줄을 보면 var를 1로 설정한 것을 볼 수 있다. 이후 foo 함수 안에서 2로 바꼈지만 foo 함수는 새로운 scope이기 때문에 foo 함수가 끝나면 다시 1이 된다. 즉, foo 안에서 var를 아무리 변경해도 호출 되기전 scope의 var에는 영향을 주지 않는다. 만약에 부모 (호출을 부른 쪽의) scope에 영향을 주기 위해서는 set 함수에 PARENT_SCOPE 옵션을 추가하면 된다. (3번째 줄을 set (var 2 PARENT_SCOPE)로 바꾸면 9번째 줄의 결과 2가 된다.)


2. Cache

캐시 cache란 캐시 파일에 저장, 관리 되고 있는 변수를 지칭한다. 캐시는 cmake를 시작할 때 GUI 또는 command line의 flag option으로 설정할 수 있다. 캐시를 사용하기 위해서는 먼저 CMakeLists 파일에서 정의해야한다. 캐시를 정의하는 방법은 두가지가 있다. 먼저 option() (doc)을 이용하면 캐시를 만들고 기본 값을 저장 할 수 있다.

option(USE_FOO "Do you want to use the foo function?")

CMakeLists 파일에 option 함수를 넣고 GUI를 실행해보면 다음과 같이 USE_FOO를 ON/OFF를 선택할 수 있게 되어있다.

두번째 방법은 set() 함수를 이용하는 방법이다. set()을 이용하는 경우는 ON/OFF만을 설정 할 수 있는 option()과는 다르게 PATH, FILEPATH, STRING 그리고 BOOL 자료형으로 캐시를 만들 수 있다. 사용하는 방법은 set() 함수의 인자로 캐시 이름, 초기값, CACHE, 자료형 그리고 설명 순으로 들어간다.

set(FOO_FILEPATH "/usr/local/" CACHE STRING "Where is the foo file?")

위의 코드로 CMake GUI를 실행하면 다음과 같이 나온다.

set() 함수를 이용하면 정해진 list에서 고르게 할 수도 있다. 예를 들어 최적화 알고리즘 라이브러리를 IPOPT, NLopt 또는 CFSQP에서 골라 빌드를 수행 하려고 하면 다음과 같이 설정하면 GUI에서 3개 중에 하나를 고를 수 있게 된다.

set(OPTIMIZATION "IPOPT" CACHE STRING "Select a optimization library")
set_property(CACHE OPTIMIZATION PROPERTY STRINGS "IPOPT" "NLopt" "CFSQP")

위의 코드로 GUI를 실행하면 다음과 같이 나온다.

캐시 cache를 사용하는 경우 조심해야하는 부분이 있다. CMakeLists에 의해서 한번 캐시가 정의되어 캐시 파일에 저장되는 경우 CMakeLists 파일 내에서 캐시 파일에 영향을 줄 수 있는 방법은 없다. 캐시 파일 내용을 바꿀 수 있는 방법은 GUI나 command line의 옵션을 통해서만 가능하다. 또한 한번 캐시가 정의되어 캐시 파일에 저장되면 option() 명령이나 set() 명령은 무시된다. 즉, 초기화를 시키기 위해서는 캐시 파일을 지우거나 강제로 값을 바꿔야 한다.

# assume that FOO is set to OFF in the cache

set(FOO ON)
카테고리: CMake

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다