CMake 함수 정의

CMake에서 함수는 코드의 재사용성을 높이고, 프로젝트 내에서 반복되는 작업을 간결하게 처리하기 위해 사용된다. 함수를 정의하기 위해 function() 키워드를 사용한다.

function(<함수_이름> [<인자>...])
  # 함수 내용
endfunction()

예시

function(print_message message)
  message(STATUS "Message: ${message}")
endfunction()

이 함수는 print_message라는 이름을 가지며, 하나의 인자 message를 받는다. 이 인자를 message() 명령어와 함께 출력한다.

함수 호출

정의된 함수를 호출하려면 함수 이름과 함께 필요한 인자들을 전달한다.

print_message("Hello, World!")

이 호출은 앞서 정의한 print_message 함수를 실행하며, "Message: Hello, World!"라는 출력이 생성된다.

함수의 동작 방식

함수는 호출 시 전달된 인자를 로컬 스코프에서 처리한다. 이는 함수 내부에서 정의된 변수들이 함수 외부에 영향을 미치지 않음을 의미한다.

함수 내에서 정의된 변수들은 함수가 종료되면 자동으로 삭제된다. 이는 변수 이름 충돌을 피하고, 코드의 안정성을 높이는 데 기여한다.

함수 내 변수 사용

CMake 함수에서 변수를 사용할 때는 set() 명령어를 사용하여 값을 할당할 수 있다.

function(set_var)
  set(my_var "Hello from function")
  message(STATUS "Inside function: ${my_var}")
endfunction()

그러나 함수 외부에서는 my_var 변수를 사용할 수 없다. 함수 내부에서 정의된 변수는 함수의 로컬 스코프 내에서만 존재하기 때문이다.

함수의 반환 값

CMake 함수는 기본적으로 반환 값을 가지지 않는다. 그러나 변수에 값을 저장하여, 함수 호출 후에 사용할 수 있도록 할 수 있다.

function(add_numbers num1 num2 result_var)
  math(EXPR result "${num1} +${num2}")
  set(${result_var} "${result}" PARENT_SCOPE)
endfunction()

add_numbers(10 20 result)
message(STATUS "Result: ${result}")

여기서 PARENT_SCOPE 옵션은 변수 result_var가 함수 외부 스코프에서 사용될 수 있도록 한다.

함수의 고급 사용

CMake 함수는 조건문, 반복문 등과 결합하여 복잡한 논리를 구현할 수 있다.

function(find_libraries lib_list)
  foreach(lib ${lib_list})
    find_library(${lib}_FOUND${lib})
    if(${lib}_FOUND)
      message(STATUS "Found: ${lib}")
    else()
      message(STATUS "Not Found: ${lib}")
    endif()
  endforeach()
endfunction()

이 함수는 전달된 라이브러리 목록을 순회하며, 각 라이브러리를 찾고 결과를 출력한다.

인자 처리

함수에 전달된 인자는 ${ARGN} 또는 ${ARGV}를 사용하여 접근할 수 있다.

예를 들어, 다음과 같이 사용할 수 있다.

function(print_all_args)
  foreach(arg ${ARGN})
    message(STATUS "Arg: ${arg}")
  endforeach()
endfunction()

print_all_args("First" "Second" "Third")

이 함수는 전달된 모든 인자를 순회하며 출력한다.


관련 자료: - CMake 공식 문서 - 함수 정의 - CMake 공식 문서 - 함수 호출