CMakeLists.txt 파일에서 사용자 정의 함수와 매크로는 반복되는 코드나 복잡한 설정을 간소화하고 재사용성을 높이는 데 유용하다. 사용자 정의 함수와 매크로의 정의, 사용법, 차이점 등을 자세히 설명한다.
사용자 정의 함수 정의
사용자 정의 함수는 function()
키워드를 사용하여 정의된다. 함수는 주어진 인자를 받아들이고, 필요한 작업을 수행한 후, 결과를 반환하지 않는다. 함수 내에서 정의된 변수는 함수 외부에서 사용할 수 없으며, 함수 외부에서 정의된 변수는 함수 내에서 접근할 수 있다. 함수의 기본 구조는 다음과 같다:
function(<이름> <인자>...)
# 명령어 또는 작업
endfunction()
예시:
function(print_message MESSAGE)
message(STATUS "${MESSAGE}")
endfunction()
이 함수는 print_message("Hello, World!")
와 같이 호출될 수 있으며, "Hello, World!" 메시지를 출력한다.
사용자 정의 매크로 정의
매크로는 macro()
키워드를 사용하여 정의된다. 매크로는 함수와 유사하지만, 매크로 내에서 정의된 변수는 글로벌 범위를 갖는다. 이는 매크로가 호출된 위치에서 변수들이 그대로 사용된다는 것을 의미한다. 매크로는 텍스트의 치환을 통해 작동하며, 함수보다 더 낮은 수준에서 동작한다.
macro(<이름> <인자>...)
# 명령어 또는 작업
endmacro()
예시:
macro(print_message MESSAGE)
message(STATUS "${MESSAGE}")
endmacro()
이 매크로도 print_message("Hello, World!")
와 같이 호출될 수 있으며, 동일하게 메시지를 출력한다.
함수와 매크로의 차이점
- 변수 범위: 함수 내에서 정의된 변수는 함수 외부에 영향을 미치지 않지만, 매크로 내에서 정의된 변수는 매크로가 호출된 위치에 영향을 미친다.
- 텍스트 치환: 매크로는 단순히 텍스트 치환으로 작동하므로, 함수보다 더 낮은 수준에서 동작한다. 이는 매크로가 매우 단순한 작업에 적합하지만, 복잡한 로직을 구현할 때는 함수가 더 적합한다.
- 리턴: 함수는
return()
을 통해 실행을 중단하고 호출 위치로 돌아갈 수 있지만, 매크로는 그런 기능이 없다.
함수와 매크로의 사용 예
함수 사용 예
다음은 빌드 설정을 위해 여러 패키지를 찾는 함수를 정의한 예시이다:
function(find_dependencies)
find_package(Boost REQUIRED)
find_package(Eigen3 REQUIRED)
endfunction()
find_dependencies()
매크로 사용 예
다음은 컴파일러 플래그를 설정하는 매크로의 예시이다:
macro(set_common_flags)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
endmacro()
set_common_flags()
함수와 매크로의 결합 사용
함수와 매크로는 서로 보완적으로 사용할 수 있다. 예를 들어, 복잡한 논리를 구현하기 위해 함수 내에서 매크로를 호출하거나, 매크로 내에서 간단한 작업을 정의하고 이를 함수에서 반복적으로 사용할 수 있다.
macro(print_with_prefix PREFIX MESSAGE)
message(STATUS "${PREFIX}:${MESSAGE}")
endmacro()
function(log_messages)
print_with_prefix("INFO" "Starting process")
print_with_prefix("INFO" "Process running")
print_with_prefix("INFO" "Process finished")
endfunction()
log_messages()
관련 자료: - CMake Documentation - CMake Cookbook, Radovan Bast and Roberto Di Remigio, Packt Publishing, 2018