내용
- ROS 2에서
CMakeLists.txt
파일은 패키지의 빌드 규칙을 정의하는 역할
- ROS 2는 CMake 빌드 시스템을 사용하여 패키지를 빌드하며,
CMakeLists.txt
는 CMake가 각 패키지를 어떻게 컴파일하고 링크할지 지시하는 지침을 포함
CMakeLists.txt
의 주요 역할
- 패키지에 필요한 최소 CMake 버전을 지정
- 프로젝트 이름과 버전을 설정
빌드해야 할 타겟(executables, libraries)을 정의
필요한 종속성 패키지를 찾고 링크
특정 빌드 옵션을 설정하거나 사용자 정의 빌드 규칙을 추가
테스트 실행 및 설치 규칙을 정의
setup.py
나 setup.cfg
와의 비교
- Python 프로젝트의
setup.py
나 setup.cfg
와 유사하게, CMakeLists.txt
는 패키지의 빌드 및 설치 방식을 조정
- 하지만,
setup.py
나 setup.cfg
는 주로 Python 패키지와 관련된 설정을 정의하는 반면,
CMakeLists.txt
는 아래와 같은 더 넓은 범위의 작업을 다룹니다.
- C/C++ 코드의 컴파일과 링크,
- ROS에서 사용되는 메시지 및 서비스의 생성
package.xml과의 비교
CMakeLists.txt
는 빌드 시 필요한 지침을 담고 있으며, 주로 코드 컴파일과 관련이 깊음
package.xml
은 패키지의 메타데이터와 의존성을 관리하는데 중점
- 두 파일은 함께 작동하여 ROS2 패키지의 빌드와 배포를 가능하게 합니다.
- CMakeLists.txt:
- 이 파일은 빌드 시스템 설정을 위한 것으로, CMake를 사용하여 소스 코드를 컴파일하고 패키지를 빌드하는 데 필요한 지침을 포함
CMakeLists.txt
는 빌드 프로세스에서 아래 것들을 정의
- 어떤 소스 파일이 실행 파일이나 라이브러리로 컴파일되어야 하는지,
- 어떤 외부 라이브러리나 의존성이 필요한지,
- 특정 빌드 옵션이나 컴파일러 플래그가 필요한지
- C++ 프로젝트에 주로 사용되지만, ROS에서는 Python 패키지와 관련된 설치 작업을 정의하는 데에도 사용
- package.xml:
- 이 파일은 패키지의 메타데이터와 의존성 관리를 위한 것
- 패키지의 이름, 버전, 유지보수자, 라이선스 정보 등을 포함
- 또한 패키지가 빌드하거나 실행할 때 필요한 다른 패키지들에 대한 의존성을 명시
package.xml
은 패키지 관리자와 빌드 도구가 패키지를 적절히 처리하고 다른 패키지와의 호환성을 확보할 수 있도록 돕습니다.
코드 분석하기!
cmake_minimum_required(VERSION 3.5)
project(nav_temp_interfaces)
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(std_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/PoseStampedArray.msg"
"msg/StampRecords.msg"
"msg/BoolStamped.msg"
"msg/FloatStamped.msg"
"msg/FloatArrayStamped.msg"
DEPENDENCIES builtin_interfaces std_msgs geometry_msgs
)
ament_export_dependencies(rosidl_default_runtime)
ament_package()
- 간단히 말해, 이
CMakeLists.txt
파일은 nav_temp_interfaces
라는 ROS 2 패키지에 대한 빌드 규칙을 설정
- 이 규칙들은 패키지 내에서 사용자 정의 ROS 메시지를 생성하고, 패키지가 올바르게 빌드될 수 있도록 필요한 의존성을 찾고, 다른 패키지가 이 패키지를 사용할 때 필요한 정보를 제공
cmake_minimum_required(VERSION 3.5)
:
- 이 라인은 CMake의 최소 요구 버전을 지정합니다. 여기서는 3.5 버전 이상이 필요하다고 명시
project(nav_temp_interfaces)
:
- 이 라인은 프로젝트의 이름을
nav_temp_interfaces
로 설정
- 이 이름은 패키지의 이름과 일치해야 합니다.
find_package(...)
:
- 이 명령들은 현재 패키지가 의존하는 다른 패키지나 라이브러리를 CMake가 찾도록 지시
- 여기서는
ament_cmake
, rosidl_default_generators
, builtin_interfaces
, std_msgs
, geometry_msgs
를 필요로 함
- 이 패키지들은 메시지를 생성하고 패키지를 빌드할 때 필요
rosidl_generate_interfaces(...)
:
- 이 명령은 지정된 메시지 타입(
.msg
파일들)을 기반으로 필요한 ROS 인터페이스 파일을 생성
- 이 경우
PoseStampedArray
, StampRecords
, BoolStamped
, FloatStamped
, FloatArrayStamped
메시지를 생성하며,
- 이들은
builtin_interfaces
, std_msgs
, geometry_msgs
패키지에 정의된 메시지 타입에 대한 의존성을 가짐
ament_export_dependencies(rosidl_default_runtime)
:
- 이 라인은 빌드 후 다른 패키지가 이 패키지를 찾을 때
rosidl_default_runtime
패키지가 필요하다는 것을 나타냄
ament_package()
:
- 이 명령은 ament 빌드 시스템에 패키지 설정이 끝났음을 알리고, 설치하거나 테스트하기 위한 준비를 합니다.