# CMake 명령어 참조

CMake는 다양한 빌드 작업을 수행하기 위한 명령어들을 제공한다. 아래는 자주 사용되는 주요 CMake 명령어들과 그 설명이다.

#### project

`project(<name> [LANGUAGES <languages>])`

* **설명**: 프로젝트의 이름과 사용 언어를 정의한다.
* **예시**:

  ```cmake
  project(MyProject LANGUAGES CXX)
  ```

#### add\_executable

`add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] <source1> [source2 ...])`

* **설명**: 실행 파일을 생성한다. `<name>`은 생성될 실행 파일의 이름이고, 나머지는 소스 파일들이다.
* **예시**:

  ```cmake
  add_executable(MyExecutable main.cpp)
  ```

#### add\_library

`add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] <source1> [source2 ...])`

* **설명**: 정적 라이브러리(`STATIC`), 동적 라이브러리(`SHARED`), 또는 모듈(`MODULE`)을 생성한다.
* **예시**:

  ```cmake
  add_library(MyLibrary STATIC lib.cpp)
  ```

#### target\_link\_libraries

`target_link_libraries(<target> [item1 [item2 [...]]])`

* **설명**: 특정 실행 파일이나 라이브러리에 다른 라이브러리를 링크한다.
* **예시**:

  ```cmake
  target_link_libraries(MyExecutable MyLibrary)
  ```

#### set

`set(<variable> <value> [CACHE <type> <docstring> [FORCE]])`

* **설명**: 변수를 설정한다. `CACHE` 옵션을 사용해 캐시된 변수로 설정할 수 있다.
* **예시**:

  ```cmake
  set(CMAKE_CXX_STANDARD 11)
  ```

#### find\_package

`find_package(<package> [version] [EXACT] [QUIET] [REQUIRED] [components...])`

* **설명**: 외부 패키지를 찾아서 설정을 가져온다. `REQUIRED` 옵션을 사용하면 패키지가 없을 시 오류를 발생시킨다.
* **예시**:

  ```cmake
  find_package(Boost 1.70 REQUIRED COMPONENTS filesystem system)
  ```

#### include\_directories

`include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])`

* **설명**: 컴파일 시 포함할 디렉토리를 지정한다. `SYSTEM` 옵션은 시스템 헤더로 취급한다.
* **예시**:

  ```cmake
  include_directories(${CMAKE_SOURCE_DIR}/include)
  ```

#### add\_subdirectory

`add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])`

* **설명**: 하위 디렉토리를 빌드에 포함시킨다. 하위 디렉토리에서 별도의 CMakeLists.txt 파일을 정의할 수 있다.
* **예시**:

  ```cmake
  add_subdirectory(src)
  ```

#### message

`message([<mode>] "message text" [...])`

* **설명**: 메시지를 출력한다. `mode`로 `STATUS`, `WARNING`, `AUTHOR_WARNING`, `SEND_ERROR`, `FATAL_ERROR`를 사용할 수 있다.
* **예시**:

  ```cmake
  message(STATUS "Configuring the project")
  ```

#### if / elseif / else / endif

`if(expression) ... [elseif(expression) ...] [else() ...] endif()`

* **설명**: 조건문을 정의한다.
* **예시**:

  ```cmake
  if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(DEBUG_MODE ON)
  endif()
  ```

#### foreach / endforeach

`foreach(loop_var [items]) ... endforeach()`

* **설명**: 반복문을 정의한다.
* **예시**:

  ```cmake
  foreach(file ${source_files})
    message(STATUS "Source file: ${file}")
  endforeach()
  ```

#### while / endwhile

`while(condition) ... endwhile()`

* **설명**: 조건이 참일 때까지 반복문을 실행한다.
* **예시**:

  ```cmake
  while(condition)
    # commands
  endwhile()
  ```

#### configure\_file

`configure_file(<input> <output> [COPYONLY] [ESCAPE_QUOTES] [@ONLY])`

* **설명**: 파일을 복사하거나, 설정을 기반으로 파일을 생성한다.
* **예시**:

  ```cmake
  configure_file(config.h.in config.h)
  ```

#### install

`install(TARGETS targets... [EXPORT export-name] [RUNTIME|LIBRARY|ARCHIVE|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE] [DESTINATION <dir>] [...])`

* **설명**: 빌드된 파일을 설치할 위치를 정의한다.
* **예시**:

  ```cmake
  install(TARGETS MyExecutable DESTINATION bin)
  ```

#### cmake\_minimum\_required

`cmake_minimum_required(VERSION version [...])`

* **설명**: CMake의 최소 버전을 설정한다. 특정 버전 이상의 CMake에서만 프로젝트가 빌드되도록 한다.
* **예시**:

  ```cmake
  cmake_minimum_required(VERSION 3.10)
  ```

#### list

`list(<operation> <list> <args>...)`

* **설명**: 리스트 변수를 관리하는 다양한 작업을 수행할 수 있다. `APPEND`, `REMOVE_ITEM`, `LENGTH`, `GET` 등의 작업이 가능한다.
* **예시**:

  ```cmake
  list(APPEND my_list "item1" "item2")
  ```

***

관련 자료:

* Kitware Inc., CMake Documentation, <https://cmake.org/cmake/help/latest/>
* Martin, R., Mastering CMake, Kitware, Inc., 2010.
* Saxer, A., Professional CMake: A Practical Guide, Leanpub, 2020.
