# 내장 변수 소개

CMake는 소프트웨어 빌드를 구성하기 위한 크로스 플랫폼 도구이다. CMakeLists.txt 파일은 CMake 프로젝트의 구성을 정의하는데, 이 파일에서 사용되는 내장 변수들은 프로젝트의 설정과 빌드 과정을 제어하는 중요한 역할을 한다. 이 문서에서는 CMakeLists.txt에서 자주 사용되는 내장 변수들을 계층적으로 설명한다.

#### 프로젝트 설정 관련 변수

CMakeLists.txt에서 프로젝트의 기본적인 속성을 설정하기 위해 사용되는 변수들이다.

**`PROJECT_NAME`**

`PROJECT_NAME` 변수는 `project()` 명령어에 의해 설정된다. 이 변수는 프로젝트의 이름을 나타내며, 프로젝트 내에서 다른 설정들에 쉽게 접근할 수 있도록 한다.

```cmake
project(MyProject)
```

위와 같은 설정이 있을 경우, `PROJECT_NAME`은 `MyProject`가 된다.

**`PROJECT_VERSION`**

`PROJECT_VERSION` 변수는 프로젝트의 버전을 지정하는데 사용된다. `project()` 명령어에 `VERSION` 옵션을 추가하여 설정할 수 있다.

```cmake
project(MyProject VERSION 1.2.3)
```

이 경우, `PROJECT_VERSION` 변수는 `1.2.3`이 된다. 이 변수는 소프트웨어의 릴리즈나 패키징에 유용하게 쓰인다.

**`PROJECT_SOURCE_DIR`**

`PROJECT_SOURCE_DIR` 변수는 최상위 CMakeLists.txt 파일이 위치한 디렉토리의 절대 경로를 나타낸다. 프로젝트의 소스 파일에 대한 경로를 지정할 때 유용하다.

```cmake
set(SOURCE_FILES ${PROJECT_SOURCE_DIR}/src/main.cpp)
```

#### 컴파일러와 빌드 관련 변수

CMake는 다양한 컴파일러와 빌드 환경을 지원하며, 이를 제어하기 위해 여러 변수를 제공한다.

**`CMAKE_CXX_COMPILER`**

`CMAKE_CXX_COMPILER` 변수는 C++ 파일을 컴파일하기 위해 사용되는 컴파일러의 경로를 지정한다. 이 변수는 프로젝트의 초기 설정 시 자동으로 감지되며, 명시적으로 설정할 수도 있다.

```cmake
set(CMAKE_CXX_COMPILER /usr/bin/g++)
```

이 변수는 다양한 플랫폼에서 C++ 컴파일러를 설정하거나 변경할 때 중요하다.

**`CMAKE_CXX_FLAGS`**

`CMAKE_CXX_FLAGS` 변수는 C++ 컴파일러에 전달할 추가적인 플래그를 지정할 때 사용된다.

```cmake
set(CMAKE_CXX_FLAGS "-Wall -O2")
```

이 설정은 모든 C++ 파일을 컴파일할 때 경고 메시지와 최적화 옵션을 활성화한다.

**`CMAKE_BUILD_TYPE`**

`CMAKE_BUILD_TYPE` 변수는 빌드 타입을 설정하는 데 사용된다. 대표적인 값으로는 `Debug`, `Release`, `MinSizeRel`, `RelWithDebInfo` 등이 있다.

```cmake
set(CMAKE_BUILD_TYPE Release)
```

이 설정은 프로젝트를 최적화된 릴리즈 모드로 빌드하도록 지시한다.

#### 경로 관련 변수

경로 관련 변수들은 소스 파일, 빌드 디렉토리, 설치 디렉토리 등을 정의하는 데 사용된다.

**`CMAKE_SOURCE_DIR`**

`CMAKE_SOURCE_DIR` 변수는 최상위 소스 디렉토리의 절대 경로를 나타낸다. `PROJECT_SOURCE_DIR`과 유사하지만, 포함된 모든 CMakeLists.txt 파일에서 동일한 경로를 참조한다.

**`CMAKE_BINARY_DIR`**

`CMAKE_BINARY_DIR` 변수는 CMake가 빌드 출력을 생성하는 디렉토리의 절대 경로를 나타낸다. 보통 빌드 디렉토리를 설정할 때 유용하다.

```cmake
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
```

위와 같은 설정은 실행 파일들이 빌드 디렉토리의 `bin` 폴더에 출력되도록 한다.

**`CMAKE_INSTALL_PREFIX`**

`CMAKE_INSTALL_PREFIX` 변수는 프로젝트 설치 시 기본적으로 설치되는 경로를 지정한다. 이 변수는 패키징이나 배포를 위해 중요하다.

```cmake
set(CMAKE_INSTALL_PREFIX /usr/local)
```

이 경우, 설치 과정에서 모든 파일이 `/usr/local` 하위에 위치하게 된다.

#### 시스템 및 환경 관련 변수

시스템 및 환경 관련 변수들은 프로젝트가 빌드되는 시스템의 정보를 제공하거나 환경 설정을 제어하는 데 사용된다.

**`CMAKE_SYSTEM_NAME`**

`CMAKE_SYSTEM_NAME` 변수는 CMake가 인식한 시스템의 이름을 나타낸다. 이 변수는 크로스 컴파일 설정이나 플랫폼 별 빌드 설정에 유용하다.

```cmake
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    # Linux-specific settings
endif()
```

**`CMAKE_SYSTEM_PROCESSOR`**

`CMAKE_SYSTEM_PROCESSOR` 변수는 컴파일 시 사용되는 프로세서의 이름을 나타낸다. 이는 아키텍처별 최적화나 특정 프로세서에 맞춘 빌드를 구성할 때 사용된다.

```cmake
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
    # 64-bit specific settings
endif()
```

#### 사용자 정의 변수

CMakeLists.txt에서는 내장 변수 외에도 사용자가 정의한 변수를 사용할 수 있다. 이러한 변수들은 프로젝트의 특정 요구 사항에 맞게 설정을 제어하는 데 활용된다.

**`option()`**

`option()` 명령어는 사용자 정의 변수로서, 사용자가 프로젝트를 구성할 때 특정 옵션을 켜거나 끌 수 있도록 한다.

```cmake
option(USE_MY_FEATURE "Enable my feature" ON)
```

이 옵션은 `USE_MY_FEATURE` 변수를 `ON` 또는 `OFF` 상태로 설정할 수 있게 한다.

**`set()`**

`set()` 명령어는 특정 변수에 값을 할당하는데 사용된다. 이 변수들은 이후의 설정이나 빌드 과정에서 사용될 수 있다.

```cmake
set(MY_VAR "MyValue")
```

이 설정은 `MY_VAR` 변수에 `"MyValue"`를 할당하며, 이후에 다양한 명령에서 참조할 수 있다.

***

관련 자료:

* CMake 공식 문서: <https://cmake.org/documentation/>
* Mastering CMake 책 및 관련 자료
* 기타 온라인 CMake 튜토리얼 및 가이드
