CMakeLists.txt 파일에서 매크로(Macro)는 코드 재사용성과 유지보수성을 높이는 중요한 도구로 사용된다.

매크로란 무엇인가?

매크로는 CMake에서 특정한 기능을 수행하는 일련의 명령어 집합이다. 함수와 유사하지만, 매크로는 함수와 달리 호출된 위치에 그 내용을 그대로 삽입하는 방식으로 동작한다. 이를 통해 코드의 중복을 줄이고, 특정 작업을 반복적으로 수행해야 할 때 유용하게 사용할 수 있다.

매크로 정의 방법

CMakeLists.txt 파일에서 매크로를 정의하려면 macro() 명령어를 사용한다. 매크로는 이름과 매개변수를 가지며, 매크로 내부에는 CMake 명령어들을 포함할 수 있다.

macro(<매크로 이름> [매개변수1] [매개변수2] ...)
    # 여기에 CMake 명령어들을 작성
endmacro()

예를 들어, 특정 파일을 복사하는 매크로를 정의해보자:

macro(copy_file SRC DEST)
    add_custom_command(
        OUTPUT ${DEST}
        COMMAND ${CMAKE_COMMAND} -E copy${SRC} ${DEST}
        DEPENDS ${SRC}
    )
endmacro()

이 매크로는 copy_file이라는 이름을 가지며, SRCDEST라는 두 개의 매개변수를 입력받아 파일을 복사하는 작업을 수행한다.

매크로 활용 방법

정의된 매크로는 CMakeLists.txt 파일 내에서 정의된 이름을 통해 호출된다. 매크로를 호출할 때는 매크로 이름 뒤에 필요한 매개변수들을 순서대로 전달하면 된다.

copy_file(${CMAKE_SOURCE_DIR}/input.txt${CMAKE_BINARY_DIR}/output.txt)

이 예제에서는 input.txt 파일을 output.txt로 복사하는 매크로를 호출 하였다.

매크로와 함수의 차이점

매크로와 함수는 CMake에서 매우 유사한 개념이지만, 중요한 차이점이 존재한다. 매크로는 호출된 위치에 코드를 그대로 삽입하며, 함수는 별도의 스코프를 갖는다. 이는 매크로가 호출되는 위치에서 전역 변수를 그대로 사용할 수 있다는 점에서 유리할 수 있지만, 코드의 가독성을 떨어뜨릴 위험도 있다. 반면 함수는 명확한 스코프를 가지므로, 지역 변수의 활용과 코드의 모듈화에 더 적합한다.

매크로 내부에서 조건문 및 반복문 사용

매크로 내부에서도 일반적인 CMake 명령어들, 예를 들어 조건문(if(), elseif(), else(), endif())이나 반복문(foreach(), endforeach()) 등을 사용할 수 있다. 이를 통해 매크로의 동작을 더욱 유연하게 제어할 수 있다.

macro(print_message MSG)
    if(MSG STREQUAL "Hello")
        message(STATUS "Hello, World!")
    else()
        message(STATUS "Message: ${MSG}")
    endif()
endmacro()

이 매크로는 전달된 메시지에 따라 다른 출력을 한다. 이러한 방법을 통해 매크로의 활용성을 높일 수 있다.

매크로의 범위와 한계

매크로는 전역적으로 정의되며, CMakeLists.txt 내 어디서나 사용할 수 있다. 하지만 매크로는 호출된 위치에 코드를 그대로 삽입하기 때문에, 복잡한 논리나 많은 코드를 포함할 경우, 코드의 가독성과 유지보수성을 떨어뜨릴 수 있다. 또한, 매크로 내에서 생성된 변수는 전역으로 생성되므로, 이름 충돌이 발생할 수 있다. 따라서 매크로를 사용할 때는 변수 이름에 특별한 접두사를 붙이는 등으로 충돌을 방지하는 것이 좋다.


관련 자료: