## 0.1 데이터 타입 생성 패키지와 소비 패키지 간 빌드 위상 순서 강제 모델
ROS2의 분산 컴포넌트 아키텍처 환경에서 커스텀 데이터 타입(메시지, 서비스, 액션 인터페이스)을 정의하는 패키지(생성 패키지)와 해당 데이터 타입을 노드 통신 체계에 통합하여 사용하는 패키지(소비 패키지)는 엄격한 구조적 의존 관계를 형성한다. 빌드 시스템인 Colcon 및 CMake 프레임워크는 멀티 코어 환경에서 다중 패키지의 동시성에 기반한 병렬 컴파일을 수행하므로, 생성 패키지의 직렬화 코드가 완벽히 생성되고 라이브러리로 링킹되기 이전에 소비 패키지가 컴파일을 시도하는 경쟁 상태(Race Condition)를 원천적으로 차단해야 한다. 이를 위해 ROS2 워크스페이스는 의존성 그래프(Dependency Graph) 상에서 위상 정렬(Topological Sorting) 알고리즘을 통한 빌드 순서를 강제하는 통제 모델을 채택한다.
첫째, 패키지 매니페스트(package.xml) 계층에서의 선언적 제어가 수행된다. 소비 패키지는 자신이 의존하는 생성 패키지를 <depend> 태그 혹은 빌드 파이프라인의 필요에 따라 <build_depend> 및 <exec_depend> 태그를 활용하여 명시적으로 정의해야 한다. 이 매니페스트 선언은 ament 빌드 툴체인과 Colcon이 전체 작업 공간의 글로벌 의존성 트리를 해석하는 일차적인 척도가 되며, 의존성이 요구되는 인터페이스 패키지가 소비 패키지보다 그래프의 선행 노드(Predecessor Node)로서 우선 컴파일되도록 스케줄링 위상 순서를 강제한다.
둘째, 빌드 스크립트(CMakeLists.txt) 계층에서의 타겟 링킹(Target Linking) 및 인터페이스 보장 체계가 작동한다. 소비 패키지의 CMake 스크립트 내부에서는 find_package(생성_패키지_이름 REQUIRED) 구문을 통해 선행 빌드된 인터페이스 패키지의 구성 파일(Config file)을 탐색하고 환경 내 존재 유무를 검증한다. 탐색이 완료된 이후, ament_target_dependencies 함수를 호출하거나 최신 ROS2 빌드 패러다임에서 권장되는 구체적 링킹인 rosidl_target_interfaces를 사용하여, 소비 패키지 내의 실행 파일 타겟이나 라이브러리 타겟이 커스텀 데이터 타입의 헤더 파일 경로 및 공유 라이브러리 바이너리에 정확히 바인딩되도록 유도한다.
C++ 기반 소비 패키지의 관점에서 rosidl_target_interfaces(소비_타겟 생성_패키지_이름) 형태의 CMake 지시어는 생성 패키지가 노출한 메시지 생성 타겟 파일(예: .hpp, 식별자 정의 구조체)의 물리적 위치를 소비 타겟의 포괄적인 헤더 탐색 경로(Include directories)에 강제로 상속시킨다. C 파이프라인이나 파이썬 모듈 래퍼의 경우에도 대상 인터페이스 라이브러리 객체를 로드하기 위한 라이브러리 탐색 경로 연결이 동반된다. 이러한 제약 조건 매핑 절차를 거치지 않으면, 소비 패키지의 컴파일 단계에서 컴파일러(예: GCC, Clang)가 커스텀 메시지 타입 정의를 스코프 내에서 탐색하지 못해 전처리 및 심볼 링킹 오류(fatal error)를 발생시킨다.
결론적으로 패키지 메타데이터(XML)를 통한 Colcon 구동기의 컴포넌트 단위 글로벌 위상 스케줄링 메커니즘과, 로컬 CMake 타겟 간에 의존성을 명시하는 세부 링킹 지시어는 서로 상호보완적으로 엮여 있다. 이는 생성 패키지가 우선적으로 파싱(Parsing) 및 컴파일되어 ROS IDL(Interface Definition Language) 인터페이스 객체 풀을 안전하게 형성한 직후에만 소비 패키지가 해당 객체를 참조할 수 있도록 시점적 동기화(Temporal Synchronization)를 메타 시스템 계층에서 엄격하게 통제한다.