# 조건문 사용 방법

#### 조건문 기본 개념

CMakeLists.txt에서 조건문은 특정 조건에 따라 빌드 설정을 다르게 적용하기 위해 사용된다. 이 조건문은 `if`, `else`, `elseif`, `endif` 등의 키워드를 통해 구현된다. 기본적인 형태는 다음과 같다:

```cmake
if(조건)
    # 조건이 참일 때 실행되는 코드
elseif(다른 조건)
    # 다른 조건이 참일 때 실행되는 코드
else()
    # 모든 조건이 거짓일 때 실행되는 코드
endif()
```

CMake의 조건문은 주로 변수의 값, 파일의 존재 여부, 컴파일러 종류, 플랫폼 등에 따라 다르게 빌드 설정을 해야 할 때 사용된다.

#### 조건문에서 사용되는 주요 표현식

CMake 조건문에서 자주 사용되는 표현식은 다음과 같다:

* **변수 검사**: 변수가 정의되었는지, 또는 특정 값과 일치하는지를 확인한다.

  ```cmake
  if(DEFINED 변수명)
  if(변수명 STREQUAL "값")
  ```
* **파일 검사**: 파일이나 디렉토리의 존재 여부를 확인한다.

  ```cmake
  if(EXISTS "경로/파일명")
  if(IS_DIRECTORY "경로")
  if(IS_FILE "파일명")
  ```
* **플랫폼 검사**: 운영체제나 컴파일러를 확인하여 특정 플랫폼에 맞는 설정을 적용한다.

  ```cmake
  if(WIN32)
  if(UNIX)
  if(APPLE)
  if(MSVC)
  ```
* **논리 연산자**: 조건을 결합하거나 부정할 때 사용된다.

  ```cmake
  if(NOT 조건)
  if(조건1 AND 조건2)
  if(조건1 OR 조건2)
  ```

#### 고급 조건문 사용법

조건문은 기본적인 조건 검사를 넘어서 복잡한 빌드 스크립트를 작성하는 데 유용하다.

* **정규 표현식 사용**: 문자열 매칭을 통해 조건을 검사할 수 있다.

  ```cmake
  if(변수명 MATCHES "정규표현식")
  ```
* **조건부 옵션 설정**: 특정 조건에 따라 옵션을 활성화하거나 비활성화할 수 있다.

  ```cmake
  option(OPTION_NAME "옵션 설명" OFF)

  if(조건)
      set(OPTION_NAME ON)
  endif()
  ```
* **함수 내부에서 조건문 사용**: CMake 함수나 매크로 내에서 조건문을 사용해 동적으로 설정을 조정할 수 있다.

  ```cmake
  function(함수명)
      if(조건)
          # 조건에 따른 작업 수행
      endif()
  endfunction()
  ```
* **정의된 대상에 따라 조건적 빌드 설정**: 특정 대상(target)이 존재하는지에 따라 설정을 다르게 할 수 있다.

  ```cmake
  if(TARGET target_name)
      # 대상이 존재할 때 수행할 작업
  endif()
  ```

#### 조건문을 사용한 예제

다음은 실제 프로젝트에서 조건문을 사용하는 예제이다:

```cmake
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    add_definitions(-DDEBUG_MODE)
    message(STATUS "디버그 모드로 빌드 중이다.")
else()
    add_definitions(-DNDEBUG)
    message(STATUS "릴리즈 모드로 빌드 중이다.")
endif()

if(WIN32)
    set(OS_SPECIFIC_LIBS ws2_32)
elseif(UNIX)
    set(OS_SPECIFIC_LIBS pthread)
endif()

target_link_libraries(내_타겟 ${OS_SPECIFIC_LIBS})
```

이 예제에서는 빌드 타입과 운영체제에 따라 서로 다른 정의와 라이브러리를 설정한다. 이는 멀티플랫폼 프로젝트에서 필수적인 방법이다.

#### 조건문 디버깅

CMake에서 조건문이 예상대로 동작하지 않을 경우, `message()` 함수를 사용하여 조건문 내부에서 변수 값을 출력함으로써 디버깅할 수 있다.

```cmake
if(NOT DEFINED 변수명)
    message(STATUS "변수명이 정의되지 않았다.")
endif()
```

이렇게 하면 스크립트 실행 중에 변수의 상태를 명확하게 파악할 수 있어, 조건문이 올바르게 평가되는지 확인하는 데 도움이 된다.

***

관련 자료:

* [CMake 공식 문서: 조건문 사용법](https://cmake.org/cmake/help/latest/command/if.html)
* [CMake tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/index.html)
