# 사용자 정의 함수와 매크로

CMakeLists.txt 파일에서 사용자 정의 함수와 매크로는 반복되는 코드나 복잡한 설정을 간소화하고 재사용성을 높이는 데 유용하다. 사용자 정의 함수와 매크로의 정의, 사용법, 차이점 등을 자세히 설명한다.

#### 사용자 정의 함수 정의

사용자 정의 함수는 `function()` 키워드를 사용하여 정의된다. 함수는 주어진 인자를 받아들이고, 필요한 작업을 수행한 후, 결과를 반환하지 않는다. 함수 내에서 정의된 변수는 함수 외부에서 사용할 수 없으며, 함수 외부에서 정의된 변수는 함수 내에서 접근할 수 있다. 함수의 기본 구조는 다음과 같다:

```cmake
function(<이름> <인자>...)
    # 명령어 또는 작업
endfunction()
```

예시:

```cmake
function(print_message MESSAGE)
    message(STATUS "${MESSAGE}")
endfunction()
```

이 함수는 `print_message("Hello, World!")`와 같이 호출될 수 있으며, "Hello, World!" 메시지를 출력한다.

#### 사용자 정의 매크로 정의

매크로는 `macro()` 키워드를 사용하여 정의된다. 매크로는 함수와 유사하지만, 매크로 내에서 정의된 변수는 글로벌 범위를 갖는다. 이는 매크로가 호출된 위치에서 변수들이 그대로 사용된다는 것을 의미한다. 매크로는 텍스트의 치환을 통해 작동하며, 함수보다 더 낮은 수준에서 동작한다.

```cmake
macro(<이름> <인자>...)
    # 명령어 또는 작업
endmacro()
```

예시:

```cmake
macro(print_message MESSAGE)
    message(STATUS "${MESSAGE}")
endmacro()
```

이 매크로도 `print_message("Hello, World!")`와 같이 호출될 수 있으며, 동일하게 메시지를 출력한다.

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

* **변수 범위**: 함수 내에서 정의된 변수는 함수 외부에 영향을 미치지 않지만, 매크로 내에서 정의된 변수는 매크로가 호출된 위치에 영향을 미친다.
* **텍스트 치환**: 매크로는 단순히 텍스트 치환으로 작동하므로, 함수보다 더 낮은 수준에서 동작한다. 이는 매크로가 매우 단순한 작업에 적합하지만, 복잡한 로직을 구현할 때는 함수가 더 적합한다.
* **리턴**: 함수는 `return()`을 통해 실행을 중단하고 호출 위치로 돌아갈 수 있지만, 매크로는 그런 기능이 없다.

#### 함수와 매크로의 사용 예

**함수 사용 예**

다음은 빌드 설정을 위해 여러 패키지를 찾는 함수를 정의한 예시이다:

```cmake
function(find_dependencies)
    find_package(Boost REQUIRED)
    find_package(Eigen3 REQUIRED)
endfunction()

find_dependencies()
```

**매크로 사용 예**

다음은 컴파일러 플래그를 설정하는 매크로의 예시이다:

```cmake
macro(set_common_flags)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
endmacro()

set_common_flags()
```

#### 함수와 매크로의 결합 사용

함수와 매크로는 서로 보완적으로 사용할 수 있다. 예를 들어, 복잡한 논리를 구현하기 위해 함수 내에서 매크로를 호출하거나, 매크로 내에서 간단한 작업을 정의하고 이를 함수에서 반복적으로 사용할 수 있다.

```cmake
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](https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html#functions-and-macros)
* CMake Cookbook, Radovan Bast and Roberto Di Remigio, Packt Publishing, 2018
