23.1.1 ROS1 Catkin 프레임워크의 의존성 누수 한계 및 Ament 도입 당위성
자율 에이전트 드론을 위한 로보틱스 소프트웨어 개발 생태계는 본질적으로 수많은 센서 라이브러리, 제어 모듈, 비전 알고리즘 노드가 계층 구조를 이루는 고도의 의존성 네트워크다. 과거 ROS1 플랫폼의 산업적 부흥 및 발전에 거대한 공헌을 했던 표준 메타 빌드 시스템 Catkin(Cmake And ToolKIt for ROS)은 이러한 복잡한 코드 트리 위에서 동작하도록 고안되었다. 그러나 최첨단 대규모 드론 시스템 환경에서는 Catkin이 가지는 근본적인 설계 아키텍처 결함들이 치명적인 빌드 에러 체인(Build Error Chain)을 유발하였으며, 이는 차세대 프레임워크인 ROS2에서 Ament 시스템이 도입되는 결정적인 기술적 동력으로 작용하였다.
1. 단일 CMake 인스턴스(Single CMake Instance) 동작의 역학적 결함
Catkin 프레임워크의 가장 핵심적인 한계는 워크스페이스 내의 모든 로보틱스 패키지들을 묶어 단 하나의 거대한 CMakeLists.txt처럼 해석하는 “단일 CMake 인스턴스 파이프라인” 사상에 기인한다.
Catkin은 빌드 프로세스를 가속하기 위해 catkin_make라는 명령어를 통해 워크스페이스 최상단 리포지토리의 CMakeLists.txt를 진입점(Entry point)으로 삼고, 내부의 모든 소스 디렉토리(src/**/*.cmake)를 단일 컴파일 컨텍스트 공간으로 불러온다. 이 아키텍처는 표면적으로는 의존성 해결(Dependency Resolution) 절차를 간소화하고 전체 빌드 시간을 단축하는 듯한 효과를 준다. 그러나 수천 개의 소스 파일이 하나의 가상 공간에 통합되면서 모든 CMake 변수(예: CMAKE_CXX_FLAGS, INCLUDE_DIRECTORIES)와 타겟(Target) 인터페이스들이 암묵적으로 전역 범위(Global Scope)를 공유하게 되는 심각한 구조적 모순을 내포한다.
2. 상호 참조적 전역 변수 오염 및 의존성 누수(Dependency Leaking) 파생 현상
단일 컨텍스트 공간의 공유 현상은 로보틱스 엔지니어링 환경에서 이른바 ‘의존성 누수(Dependency Leaking)’ 패러독스를 촉발한다.
예를 들어, 자율 드론의 카메라 패키지 A가 특수한 버전의 OpenCV 라이브러리를 동적 링킹(Dynamic Linking)하기 위해 고유한 include_directories() 매크로를 선언했다고 가정하자. 이 매크로에 의해 주입된 전역 C++ 컴파일러 플래그는 Catkin 환경 내에서 패키지 A를 넘어, 전혀 무관한 드론 모터 제어 패키지 B의 컴파일 컨텍스트 공간까지 오염시킨다. 만일 패키지 B의 개발자가 스스로의 CMakeLists.txt에 필요한 라이브러리 선언을 누락했더라도, 패키지 A 덕분에 우연히 컴파일이 성공(False Positive)하는 경우가 발생할 수 있다.
이후 배포 환경에서 패키지 A가 제거되거나 리팩토링될 경우, 패키지 B는 잠재되어 있던 심볼 결측 오류(Undefined Reference)를 드러내며 연쇄적인 시스템 크래시를 유발한다. 이처럼 어떤 모듈이 의존성을 명시하지 않고도 빌드가 통과되거나, 역으로 다른 패키지의 매크로 주입으로 인해 의도치 않은 바이너리가 생성되는 현상은 대규모 협업 개발 및 CI/CD(지속적 통합/지속적 배포) 검증의 신뢰성을 근본적으로 파괴한다.
3. Ament 프레임워크의 격리형 컴파일(Isolated Compilation) 인프라 당위성
이러한 로보틱스 시스템의 의존성 관리 부채(Technical Debt)를 해결하기 위해 ROS2 위원회는 Ament 메타 빌드 시스템을 표준 도구로 도입했다. Ament 시스템의 철학적 기반은 Catkin과는 정반대로 “1 패키지 = 1 프라이빗 인스턴스(Private Instance)“라는 완전한 격리형 컴파일 아키텍처를 강제하는 데 있다.
Ament는 워크스페이스 전체를 단일 매크로 공간으로 융합하는 대신, 위상 정렬(Topological Sorting) 알고리즘을 이용해 독립 가능한 컴포넌트들의 트리 계층을 먼저 해석한다. 그 후, 각각의 패키지는 상호 환경 변수를 참조할 수 없는 완전히 분리된 프로세스 환경(Isolated Build Environment)에서 독자적인 cmake 인스턴스를 부여받아 개별적으로 빌드된다. 이러한 패러다임 전환을 통해 특정 패키지의 전역 플래그 오염이 시스템 전체로 파급되는 것을 원천 차단하며, 누락된 package.xml 런타임 의존성 에러를 빌드 타임에서 즉각적으로 포착할 수 있는 확정적(Deterministic)이고 강건한 분산 시스템 엔지니어링 환경을 성취하였다.