# 빌드 도구 colcon 사용법

#### colcon이란?

colcon은 ROS2 패키지의 빌드를 관리하는 도구로, ROS1에서 사용하던 catkin을 대체한다. colcon은 여러 패키지를 병렬로 빌드할 수 있으며, 각 패키지 간의 의존성을 자동으로 처리한다. 또한, 다양한 빌드 도구를 지원하며, 사용자 정의가 용이하다는 장점이 있다.

#### colcon 설치

colcon은 ROS2 환경을 설정할 때 자동으로 설치되기도 하지만, 수동으로 설치할 수도 있다. 다음은 colcon을 수동으로 설치하는 방법이다.

```bash
sudo apt install python3-colcon-common-extensions
```

이 명령어를 통해 colcon의 기본 확장 기능을 함께 설치할 수 있다.

#### 기본 사용법

colcon을 사용하여 패키지를 빌드하려면 ROS2 워크스페이스의 루트 디렉토리에서 `colcon build` 명령어를 실행한다. 워크스페이스는 보통 `src` 디렉토리를 포함하는데, 이 디렉토리 안에 패키지들이 위치한다.

```bash
colcon build
```

이 명령어는 워크스페이스 내 모든 패키지를 빌드한다. 빌드 결과물은 기본적으로 `install` 디렉토리에 저장된다.

**특정 패키지만 빌드하기**

특정 패키지만 빌드하려면 `--packages-select` 옵션을 사용한다. 예를 들어, `my_package`라는 패키지만 빌드하고 싶다면 다음과 같이 명령어를 입력한다.

```bash
colcon build --packages-select my_package
```

**빌드 옵션**

빌드 과정에서 다양한 옵션을 사용할 수 있다. 그중 중요한 옵션 몇 가지를 설명하겠다.

* `--symlink-install`: 빌드 시 심볼릭 링크를 사용하여 변경 사항을 즉시 반영한다. 개발 중인 패키지를 빠르게 테스트할 때 유용하다.

  ```bash
  colcon build --symlink-install
  ```
* `--packages-up-to`: 특정 패키지와 그 의존 패키지들만 빌드한다. 예를 들어, `my_package`와 그 의존 패키지들만 빌드하려면 다음과 같이 명령어를 입력한다.

  ```bash
  colcon build --packages-up-to my_package
  ```

**빌드 후 환경 설정**

빌드가 완료된 후에는 `install` 디렉토리에서 환경 설정을 해야 한다. 이는 ROS2 노드를 실행하거나 ROS2 명령어를 사용하기 위해 필요한 단계이다.

```bash
source install/setup.bash
```

이 명령어는 현재 터미널 세션에서만 적용된다. 매번 새로운 터미널을 열 때마다 이 명령어를 실행해야 한다. 이를 자동화하기 위해서는 `~/.bashrc` 파일에 이 명령어를 추가할 수 있다.

```bash
echo "source ~/your_workspace/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

#### 패키지 의존성 관리

colcon은 패키지 간의 의존성을 자동으로 처리한다. 각 패키지의 `package.xml` 파일에서 의존성을 명시하면, colcon은 이를 기반으로 빌드 순서를 결정한다.

패키지 간의 의존성을 명시하는 방법은 다음과 같다.

```xml
<depend>example_interfaces</depend>
<build_depend>rclcpp</build_depend>
<exec_depend>rclpy</exec_depend>
```

위 예시에서 `depend`는 빌드와 실행 모두에 필요한 의존성을, `build_depend`는 빌드 시에만 필요한 의존성을, `exec_depend`는 실행 시에만 필요한 의존성을 나타낸다.

**의존성 해결**

만약 의존 패키지가 설치되지 않았을 경우, colcon은 빌드 도중 오류를 발생시킨다. 이때는 다음과 같은 명령어로 의존성을 설치할 수 있다.

```bash
rosdep install --from-paths src --ignore-src -r -y
```

이 명령어는 `src` 디렉토리 안의 모든 패키지에 대한 의존성을 확인하고, 아직 설치되지 않은 패키지를 설치한다.

#### colcon 빌드 로그 및 오류 해결

빌드 도중 발생하는 오류나 경고를 확인하고 문제를 해결하는 것은 매우 중요하다. colcon은 기본적으로 빌드 로그를 출력하지 않지만, 옵션을 사용하여 빌드 로그를 확인할 수 있다.

**빌드 로그 확인**

빌드 도중 출력되는 모든 로그를 확인하고 싶다면 `--event-handlers` 옵션을 사용할 수 있다. 예를 들어, 다음과 같이 명령어를 입력하면 빌드 로그를 실시간으로 확인할 수 있다.

```bash
colcon build --event-handlers console_cohesion+
```

이 옵션을 사용하면 빌드 중 발생하는 모든 로그가 터미널에 출력된다.

**빌드 오류 해결**

빌드 도중 오류가 발생하면, `colcon`은 관련된 패키지에서의 빌드를 중단하고 오류 메시지를 출력한다. 오류 메시지는 빌드 과정에서의 문제를 진단하는 데 매우 중요한 정보를 제공한다.

만약 빌드 오류를 해결하려면 오류 메시지를 확인하고, 문제의 원인을 분석해야 한다. 일반적인 빌드 오류는 다음과 같은 원인에서 발생한다.

* 패키지 의존성이 누락되었거나 올바르게 설정되지 않음
* CMakeLists.txt 파일이 잘못 구성됨
* 패키지 내의 코드에서 컴파일 오류 발생

이런 경우, colcon은 문제가 발생한 패키지를 명시하고, 그 패키지에 대한 상세한 로그 파일을 제공한다. 로그 파일은 기본적으로 워크스페이스 내의 `log` 디렉토리에 저장된다.

```bash
cat log/latest_build/my_package/stdout_stderr.log
```

위 명령어로 특정 패키지의 빌드 로그를 확인할 수 있다.

**패키지 빌드 재시도**

특정 패키지가 빌드에 실패했을 경우, 실패한 패키지부터 빌드를 다시 시도할 수 있다. 다음과 같은 명령어를 사용하여 실패한 패키지만 재빌드할 수 있다.

```bash
colcon build --packages-select my_package --continue-on-error
```

이 명령어는 오류를 무시하고 빌드를 계속하며, 실패한 패키지를 선택적으로 빌드할 수 있다.

#### 빌드 시스템 최적화

대규모 ROS2 프로젝트에서는 빌드 시간을 최적화하는 것이 매우 중요하다. colcon은 다양한 빌드 최적화 옵션을 제공하여 빌드 시간을 줄일 수 있다.

**병렬 빌드**

colcon은 기본적으로 패키지를 병렬로 빌드한다. 하지만 시스템 리소스에 따라 병렬 빌드를 제어할 수 있다. `--parallel-workers` 옵션을 사용하여 빌드에 사용할 CPU 코어 수를 제한할 수 있다.

```bash
colcon build --parallel-workers 4
```

위 명령어는 4개의 CPU 코어만을 사용하여 병렬로 빌드를 수행한다. 이 옵션은 빌드 시간이 길거나 시스템 리소스를 절약해야 할 때 유용하다.

**점진적 빌드**

대규모 프로젝트에서 모든 패키지를 다시 빌드하는 것은 시간이 많이 걸린다. 이를 해결하기 위해 colcon은 점진적 빌드를 지원한다. `--merge-install` 옵션을 사용하면 설치 디렉토리를 병합하여 변경된 패키지만을 다시 빌드할 수 있다.

```bash
colcon build --merge-install
```

이 옵션을 사용하면 이전에 빌드된 패키지들을 다시 빌드하지 않고, 변경된 패키지만 빌드할 수 있다.

**캐시 사용**

빌드 속도를 더욱 향상시키기 위해 colcon은 빌드 캐시를 사용할 수 있다. colcon은 패키지 간의 의존성을 기반으로 캐시된 빌드 아티팩트를 재사용하여 빌드 시간을 줄일 수 있다.

```bash
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
```

이 명령어는 최적화된 `Release` 모드로 빌드를 수행하여 실행 속도와 빌드 속도를 모두 향상시킨다.
