## 0.1 ROS 특화 도구 한계를 극복한 범용 다중 패키지 빌드 아키텍처 철학

## 0.1 ROS 특화 도구 한계를 극복한 범용 다중 패키지 빌드 아키텍처 철학

ROS(Robot Operating System)의 발전 과정에서 초기 세대인 ROS 1은 catkin_makecatkin_tools라는 빌드 시스템을 표준으로 채택하였다. 이들 도구는 ROS 환경에 고도로 최적화되었으나, 이로 인해 CMake 빌드 시스템에 대한 강한 종속성(Coupling)을 지니게 되었다. 이러한 설계적 한계는 현대 소프트웨어 공학이 지향하는 이기종 언어(Heterogeneous Language) 통합과 범용적 패키지 관리의 유연성을 저해하는 주요 원인으로 작용하였다. ROS 2를 위한 차세대 메타 빌드 프레임워크인 Colcon(Collective Construction)은 이러한 과거의 한계를 극복하고, ROS 생태계를 넘어 범용 다중 패키지 빌드 도구로 자리매김하기 위한 아키텍처 철학을 바탕으로 구현되었다.

0.1.1 ROS 생태계 종속성의 탈피

과거의 catkin_make는 본질적으로 전체 ROS 워크스페이스를 거대한 단일 CMake 프로젝트로 취급하였다. 즉, 루트 디렉터리에 위치한 탑 레벨(Top-level) CMakeLists.txt 파일이 내부의 모든 패키지를 통합하여 컴파일하는 구조였다. 이는 패키지 간의 C++ 네임스페이스 및 타겟 심볼(Target symbol) 충돌을 빈번하게 유발했으며, Python이나 여타 비(非) CMake 언어로 작성된 패키지를 통합하는 데 상당한 복잡성을 야기했다.

이와 대조적으로 Colcon은 철저한 패키지 간 격리(Package Isolation) 및 ROS 의존성 탈피를 핵심 철학으로 삼는다. Colcon의 코어 로직은 ROS(ament, rclcpp 등)에 대한 어떠한 사전 지식도 지니지 않는다. 단지 주어진 디렉터리 구조를 순회하면서 개별 패키지가 사용하는 고유의 빌드 시스템(CMake, Make, setuptools, Gradle 등)을 파악하고, 해당 시스템의 컴파일러를 래핑(Wrapping)하여 독립적으로 호출할 뿐이다. 이는 Colcon이 ROS 패키지뿐만 아니라 Gazebo 시뮬레이터 플러그인, 일반적인 시스템 라이브러리, 나아가 순수 웹 기반 패키지까지 단일 워크스페이스 내에서 일관되게 빌드할 수 있는 범용성(Universality)을 확보하게 한다.

0.1.2 메타 빌드(Meta-build) 파이프라인의 추상화

다기종 빌드 시스템을 조율하기 위해 Colcon은 빌드 파이프라인 단계에 대한 엄격한 추상화(Abstraction)를 도입했다. 워크스페이스 내의 한 패키지를 처리하는 과정은 크게 ‘의존성 분석(Dependency Analysis)’, ‘구성(Configure)’, ‘빌드(Build)’, 그리고 ’설치(Install)’라는 표준화된 추상 인터페이스를 따른다.

  • 파서(Parser)의 다형성 보장: 빌드 시스템은 패키지의 루트 경로에 위치한 메타데이터 파일(예: package.xml, setup.py, Cargo.toml)을 분석하여 필요한 라이브러리와 빌드 순서를 판별한다. 파싱 메커니즘을 플러그인 형태로 분리함으로써 임의의 포맷에 대한 의존 트리 확장이 가능하다.
  • 불변적 상태 전이(Immutable State Transition): A 패키지의 환경 변수나 매크로가 B 패키지에 암묵적으로 전파되는 것을 금지한다. 앞서 빌드된 패키지의 설치된 결과물(Artifacts)만이 CMAKE_PREFIX_PATH 등의 지정된 인터페이스를 통해 후속 패키지로 안전하게 전달된다.

0.1.3 확장성 우위의 설계 원칙 (Extensibility by Default)

Colcon의 설계 철학은 “핵심(Core)은 견고하게, 기능(Feature)은 유연하게“로 요약될 수 있다. ROS 2 프로젝트의 특성상 향후 도입될 수 있는 임베디드 실시간 운영체제(RTOS)의 빌드 크로스 컴파일(Cross-compilation) 요구사항이나 새로운 딥러닝 프레임워크와의 결합을 상정해야 한다.
따라서 Colcon은 단일 거대 프로그램(Monolithic program)이 아닌, Python 진입점(Entry point) 기반의 분산형 패키지 모음(예: colcon-core, colcon-ros, colcon-cmake, colcon-defaults)으로 배포된다. 새로운 플랫폼에 대한 특수 도구가 필요할 경우 프레임워크 코어의 수정 없이 개별 패키지 개발자가 독자적인 플러그인을 작성하여 주입할 수 있다. 이는 ROS 1의 catkin 툴체인이 직면했던 유지보수의 복잡성과 경직성을 해결하는 결정적인 아키텍처 혁신이다.

결론적으로, Colcon은 특정 로봇 프레임워크나 언어에 귀속되지 않는 범용적(Agnostic) 파이프라인 통합 관리자로서의 설계 이데올로기를 지니고 있다. 이는 ROS 2 생태계가 다양한 이기종 시스템과 학제 간 오픈소스를 매끄럽게 포용할 수 있도록 지원하는 가장 강력한 인프라스트럭처 기둥이라 할 수 있다.