# 패키지 구성 및 배포

#### 프로젝트 설정

CMakeLists.txt 파일의 시작 부분에서는 프로젝트의 이름과 최소 요구 CMake 버전을 지정한다. 프로젝트 이름은 `project()` 명령어를 사용하여 설정하며, 최소 CMake 버전은 `cmake_minimum_required()` 명령어로 지정한다.

```cmake
cmake_minimum_required(VERSION 3.10)
project(MyProject)
```

#### 패키지 구성

CMake를 사용하여 패키지를 구성하려면 패키지 설정 파일과 설치 규칙을 정의해야 한다. 이는 프로젝트를 다른 곳에 배포하거나, 다른 프로젝트에서 재사용할 수 있도록 하기 위함이다.

**패키지 구성 파일 생성**

패키지 구성 파일은 보통 `Config.cmake`라는 이름으로 생성된다. 이를 위해 `install()` 명령어를 사용하여 패키지 설정 파일을 지정된 위치에 설치할 수 있다. 일반적으로 패키지 구성 파일은 `CMakePackageConfigHelpers` 모듈을 사용하여 생성한다.

```cmake
include(CMakePackageConfigHelpers)

configure_package_config_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfig.cmake"
    INSTALL_DESTINATION lib/cmake/MyProject
)
```

**패키지 버전 파일 생성**

패키지 버전을 관리하기 위해 버전 파일을 생성할 수 있다. `write_basic_package_version_file()` 명령어를 사용하여 패키지 버전 파일을 생성하고 설치할 수 있다.

```cmake
write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfigVersion.cmake"
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY AnyNewerVersion
)

install(
    FILES "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfigVersion.cmake"
    DESTINATION lib/cmake/MyProject
)
```

**설치 규칙 정의**

프로젝트를 설치하려면 `install()` 명령어를 사용하여 설치 규칙을 정의해야 한다. 예를 들어, 라이브러리, 실행 파일, 헤더 파일 등을 설치할 위치를 지정할 수 있다.

```cmake
install(TARGETS MyLibrary
    EXPORT MyLibraryTargets
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
)

install(FILES include/MyLibrary.h DESTINATION include)
```

이렇게 하면 프로젝트가 빌드된 후, 지정된 위치에 파일들이 설치된다.

#### CMake Targets 및 Dependencies 관리

CMake에서는 타겟을 정의하여 빌드할 소스 파일을 지정하고, 타겟 간의 의존성을 관리할 수 있다.

**타겟 정의**

타겟은 `add_library()` 또는 `add_executable()` 명령어를 사용하여 정의된다. 각 타겟은 이름을 가지고 있으며, 타겟에 포함될 소스 파일들을 명시한다.

```cmake
add_library(MyLibrary src/MyLibrary.cpp)
add_executable(MyExecutable src/main.cpp)
```

**타겟 의존성 설정**

`target_link_libraries()` 명령어를 사용하여 타겟 간의 의존성을 설정할 수 있다. 예를 들어, 실행 파일이 라이브러리를 참조해야 하는 경우 이 명령어를 사용한다.

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

#### 패키지 배포

패키지를 배포하려면 CPack 도구를 사용할 수 있다. CPack은 CMake와 함께 제공되는 패키징 도구로, 다양한 형식의 패키지를 생성할 수 있다.

**CPack 설정**

CPack을 사용하려면 CMakeLists.txt 파일에 CPack 모듈을 포함하고, 필요한 변수들을 설정해야 한다.

```cmake
include(CPack)

set(CPACK_PACKAGE_NAME "MyProject")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_GENERATOR "TGZ;ZIP")
```

**패키지 생성**

`cpack` 명령어를 실행하여 설정된 형식에 따라 패키지를 생성할 수 있다.

```bash
cpack
```

이 명령어는 CMakeLists.txt 파일에 정의된 설정에 따라 패키지를 생성한다.

***

관련 자료:

* CMake 공식 문서: <https://cmake.org/documentation/>
* CMake 패키지 구성 및 배포 예제: <https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html>
* CPack 공식 문서: <https://cmake.org/cmake/help/latest/module/CPack.html>
