# 매크로 정의 및 활용

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

#### 매크로란 무엇인가?

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

#### 매크로 정의 방법

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

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

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

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

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

#### 매크로 활용 방법

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

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

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

#### 매크로와 함수의 차이점

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

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

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

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

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

#### 매크로의 범위와 한계

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

***

관련 자료:

* [CMake 공식 문서: macro() 명령어](https://cmake.org/cmake/help/latest/command/macro.html)
* [CMake의 매크로와 함수 비교](https://cliutils.gitlab.io/modern-cmake/chapters/functions/macros.html)
* [CMake에서의 변수 스코프와 매크로](https://cmake.org/Wiki/CMake/Tutorials/MacroVsFunction)
