CMake - 함수

mohadang·2022년 8월 13일
0

CMake

목록 보기
9/24
post-thumbnail

함수 예제

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

권고

  • 함수 이름이 다른 모듈과 함수와 충돌하는 것을 방지하려면 이름 앞에 프로젝트 이름을 붙인다.
  • 함수 이름이 모듈 이름과 일치하는 경우 간단한 파일 내 검색으로 코드에 사용된 모듈을 확인 할 수 있다.
profile
mohadang

0개의 댓글