함수 예제
function(foo) <-- 함수 선언
message("Calling 'foo' function")
endfunction()
foo() <-- 함수 호출
함수 인자
cmake_minimum_required(VERSION 2.8)
project(foo NONE)
function(foo x y z)
message(" x = ${x}") # x = 1
message(" y = ${y}") # y = 2
message(" z = ${z}") # z = 3
message(" ${ARGV}") # 1;2;3
message(" x = ${ARGV0}") # x = 1, ARGV 라는 예약된 변수 이름으로 접근 가능
message(" y = ${ARGV1}") # y = 2
message(" z = ${ARGV2}") # z = 3
message(" total = ${ARGC}") # total = 3
endfunction()
function(bar x y z)
message("Calling function 'bar':")
message(" All = ${ARGV}") # All = 7;8;9;10;11
message(" Unexpected = ${ARGN}") # Unexpected = 10;11
endfunction()
foo(1 2 3)
bar("7" "8" "9" "10" "11")
cmake_parse_arguments
- cmake_parse_arguments는 prefix를 붙여서 자동으로 변수들을 생성해 준다.
set(optional FOO BOO)
set(one X Y Z)
set(multiple L1 L2) # 배열형 변수 파싱할 변수들 준비
cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}")
# cmake_parse_arguments를 사용하여 변수들을 파싱한 결과
# x 라는 prefix를 붙여서 다음 같은 변수들을 생성한다.
# - x_FOO, x_BOO
# - x_X, x_Y, x_Z
# - x_L1, x_L2
# CMakeLists.txt : cmake_parse_arguments 를 사용하여 변수 파싱 1
cmake_minimum_required(VERSION 2.8)
project(foo NONE)
# include(CMakeParseArguments) # cmake_parse_arguments, cmake 3.4 버전 이하는 선언 필요
function(foo)
set(optional FOO BOO)
set(one X Y Z)
set(multiple L1 L2)
cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}")
# - x_FOO, x_BOO
# - x_X, x_Y, x_Z
# - x_L1, x_L2
# 예기치 못한 변수를 확인
string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed)
if(has_unparsed)
message(FATAL_ERROR "Unparsed arguments: ${x_UNPARSED_ARGUMENTS}")
endif()
# 파싱된 변수를 출력
message("FOO: ${x_FOO}")
message("BOO: ${x_BOO}")
message("X: ${x_X}")
message("Y: ${x_Y}")
message("Z: ${x_Z}")
message("L1:")
foreach(item ${x_L1})
message(" ${item}")
endforeach()
message("L2:")
foreach(item ${x_L2})
message(" ${item}")
endforeach()
endfunction()
# 실행 : 함수의 L1, X 변수 사용
foo(L1 item1 item2 item3 X value FOO)
# 출력
#[[
FOO: TRUE
BOO: FALSE
X: value
Y:
Z:
L1:
item1
item2
item3
L2:
]]
# 실행 : 함수의 L2, Y, Z 변수 사용
foo(L2 item1 item3 Y abc Z 123 FOO BOO) # 함수로 넘겨진 값들만 출력됨
# 출력
#[[
FOO: TRUE
BOO: TRUE
X:
Y: abc
Z: 123
L1:
L2:
item1
item3
]]
# 실행 : 함수의 L1 변수를 나눠서 사용
foo(L1 item1 L1 item2 L1 item3) # 이런식으로 리스트형 사용 가능
# 출력
#[[
FOO: FALSE
BOO: FALSE
X:
Y:
Z:
L1:
item1
item2
item3
L2:
]]
# CMakeLists.txt : cmake_parse_arguments 를 사용하여 변수 파싱 2
function(boo)
set(optional "")
set(one PARAM1 PARAM2)
set(multiple "")
cmake_parse_arguments(foo "${optional}" "${one}" "${multiple}" "${ARGV}")
# foo_PARAM1, foo_PARAM2
string(COMPARE NOTEQUAL "${foo_UNPARSED_ARGUMENTS}" "" has_unparsed)
if(has_unparsed)
message(FATAL_ERROR "Unparsed arguments: ${foo_UNPARSED_ARGUMENTS}")
endif()
message("{ param1, param2 } = { ${foo_PARAM1}, ${foo_PARAM2} }")
endfunction()
# 실행 : 함수의 PARAM1, PARAM2 변수 사용
boo(PARAM1 123 PARAM2 888)
# 출력
#[[
{ param1, param2 } = { 123, 888 }
]]
return
- cmake 에서는 return이 존재하지 않는다 따라서 값을 반환하기 위해서는 부모 변수의 값을 설정하거나 out parameter 방식을 사용한다
cmake_minimum_required(VERSION 2.8)
project(foo NONE)
function(boo)
set(A "123" PARENT_SCOPE)
endfunction()
set(A "333") # 부모 변수
message("Before 'boo': ${A}") # Before 'boo': 333
boo()
message("After 'boo': ${A}") # After 'boo': 123
# out parameter 방식 사용
function(bar arg1 result) # out parameter 방식
set("${result}" "ABC-${arg1}-XYZ" PARENT_SCOPE)
endfunction()
bar("123" var_out) # var_out을 미리 선언하지 않아도 사용 가능
message("Output: ${var_out}") # Output: ABC-123-XYZ
권고
- 함수 이름이 다른 모듈과 함수와 충돌하는 것을 방지하려면 이름 앞에 프로젝트 이름을 붙인다.
- 함수 이름이 모듈 이름과 일치하는 경우 간단한 파일 내 검색으로 코드에 사용된 모듈을 확인 할 수 있다.