25.3 의존성 전이 및 컴포넌트 내보내기(Export) 제어 메커니즘
모듈화된 ROS 2 아키텍처의 설계 철학은 코드 재사용성의 극대화에 있다. 임의의 패키지 A가 범용적인 정역학 궤적 최적화 알고리즘을 C++ 공유 라이브러리(.so)로 구현했다면, 이 패키지는 단순히 스스로 컴파일되는 것에 그치지 않고, 후속 패키지 B나 패키지 C가 자신을 쉽게 발견하고 링크할 수 있도록 메타데이터와 심볼을 시스템에 노출(Export)해야 한다. ament_cmake 프레임워크는 이 과정을 자동화하기 위해 타겟 내보내기(Target Exporting)와 의존성 전이(Dependency Transitivity) 제어 장치를 제공한다.
1. 타겟 익스포트와 인덱스 네임스페이스 매핑
패키지가 자신만의 라이브러리를 생성하고 배포하고자 할 때, CMake 구문 상에 다음과 같은 일련의 지시어가 요구된다.
먼저 ament_export_targets(export_타겟_이름 HAS_LIBRARY_TARGET) 매크로를 사용하여 선언된 컴파일 타겟의 CMake 프로퍼티를 ament 환경에 등록한다. 이 과정은 단순히 바이너리 파일의 위치를 알리는 것이 아니라, 타겟이 사용하고 있는 인클루드 경로 자원과 링킹 옵션들을 묶어 추상화된 CMake 타겟 객체(Abstract CMake Target Object) 단위로 캡슐화하는 작업을 포함한다.
결과적으로, 이 패키지가 빌드되어 시스템에 인스톨되면 다운스트림(Downstream) 패키지들은 find_package(상위패키지_이름 REQUIRED)를 호출한 뒤 ament_target_dependencies(내타겟 상위패키지_이름)를 사용하여 네임스페이스화된 심볼 공간에 안전하게 접근할 수 있게 된다.
2. ament_export_dependencies 기반의 전이적 종속성 제어
가장 고도화된 스크립트 작성 기술이 요구되는 지점은 ‘의존성 전이(Transitive Dependency)’ 문제의 해소이다.
예를 들어, 현재 패키지가 노출하고자 하는 퍼블릭 API 헤더 파일(예: my_algorithm.hpp) 내부에서 rclcpp/node.hpp나 std_msgs/msg/string.hpp를 #include하여 사용하고 있다고 가정해 보자. 이 헤더 파일을 참조하는 상위(다운스트림) 패키지들은 비록 명시적으로 rclcpp를 사용하지 않더라도, C++ 전처리기(Preprocessor)의 동작 원리에 의해 반드시 rclcpp의 인클루드 경로를 필요로 하게 된다.
이러한 상황을 타개하기 위해 CMakeLists.txt 스크립트 후반부에는 ament_export_dependencies(rclcpp std_msgs) 매크로가 호출되어야 한다. 이 매크로는 “현재 패키지를 find_package()로 로드하는 모든 타 패키지들에게 rclcpp와 std_msgs의 종속성 요구 사항을 강제적으로 상속(Pass-through)시킨다“는 의미를 지닌다.
이를 통해 상위 계층의 패키지 개발자는 하위 라이브러리의 내부 구현 종속성까지 일일이 파악하여 CMake에 하드코딩(Hard-coding)할 필요가 없어지며, 객체지향적 책임 분리 원칙이 빌드 시스템 레벨에서 충실히 구현된다.
3. CMakeLists.txt와 package.xml 형상 정합성
주의할 점은 CMakeLists.txt에 작성된 ament_export_dependencies(목표_의존성) 구문이 논리적으로 유효성을 지니려면, 해당 구성이 package.xml의 메타데이터와 논리적 연성(Consistency)을 갖추어야 한다는 사실이다.
만약 ament_export_dependencies(rclcpp)를 선언했다면, package.xml 내부에는 시스템 차원의 스케줄러가 이 전이 관계를 선험적으로 인지할 수 있도록 명시적인 <build_export_depend>rclcpp</build_export_depend> 태그가 조응(Mapping)하여 존재해야 한다. (또는 두 의미를 모두 함의하는 <depend>rclcpp</depend> 태그로 포괄해야 한다.)
CMake와 매니페스트 간의 이러한 이중 선언 구조는 언뜻 중복(Redundancy)으로 보일 수 있으나, Colcon 빌드 스케줄러가 무거운 CMake 파이프라인을 완전히 파싱하기 전에 XML 스캐닝만으로 빠르고 안전하게 전체 워크스페이스의 위상 정렬(Topological Sorting DAG) 그래프를 선제 구축할 수 있도록 돕는 핵심적인 비대칭 아키텍처이다. (참고 버전: ament_cmake 코어, ROS 2 Humble/Jazzy)