# CMakeLists.txt와 package.xml의 역할 및 구성 이해

#### CMakeLists.txt의 역할

`CMakeLists.txt`는 ROS2 패키지를 빌드하기 위한 설정 파일로, ROS2의 빌드 시스템인 `colcon`을 사용하여 CMake 기반의 프로젝트를 관리하고 빌드하는 데 사용된다. `CMakeLists.txt` 파일은 ROS2 패키지가 종속된 라이브러리와 빌드 옵션을 지정하고, ROS2에서 제공하는 노드, 메시지, 서비스 등을 컴파일하고 연결하는 과정을 정의한다.

**주요 구성 요소**

1. **프로젝트 정의**

   * `CMakeLists.txt` 파일은 `cmake_minimum_required`와 `project()` 명령어로 시작한다. 이 두 명령어는 최소 CMake 버전을 지정하고, 프로젝트 이름과 속성을 정의한다.

   ```cmake
   cmake_minimum_required(VERSION 3.5)
   project(my_ros2_package)
   ```
2. **패키지 의존성 설정**

   * ROS2 패키지는 여러 다른 패키지나 라이브러리에 의존한다. 이러한 의존성을 관리하기 위해 `find_package()` 명령어를 사용한다. 예를 들어, ROS2의 핵심 패키지인 `rclcpp`와 `sensor_msgs`를 포함할 수 있다.

   ```cmake
   find_package(rclcpp REQUIRED)
   find_package(sensor_msgs REQUIRED)
   ```
3. **실행 파일 및 라이브러리 추가**

   * 패키지에서 제공하는 실행 파일이나 라이브러리를 정의하고, 이를 빌드하는 방법을 설정한다. `add_executable()` 명령어로 실행 파일을 추가하고, `target_link_libraries()` 명령어로 해당 실행 파일이 종속된 라이브러리를 연결한다.

   ```cmake
   add_executable(my_node src/my_node.cpp)
   target_link_libraries(my_node rclcpp)
   ```
4. **설치 설정**

   * 빌드된 결과물을 설치하기 위한 경로와 설정을 지정한다. ROS2 패키지를 시스템 경로에 배포하기 위해 `install()` 명령어를 사용하여 실행 파일과 라이브러리를 설치할 수 있다.

   ```cmake
   install(TARGETS my_node
     DESTINATION lib/${PROJECT_NAME})
   ```

#### package.xml의 역할

`package.xml` 파일은 ROS2 패키지의 메타데이터를 정의하는 파일로, 패키지의 이름, 버전, 유지보수자 정보, 라이선스 정보 등을 포함한다. 또한 패키지 간의 의존성을 관리하며, 패키지를 배포하고 다른 패키지와 상호작용하는 데 필요한 정보를 제공한다.

**주요 구성 요소**

1. **패키지 메타데이터**

   * 패키지 이름, 버전, 유지보수자, 라이선스 등의 기본 정보를 정의한다.

   ```xml
   <package format="3">
     <name>my_ros2_package</name>
     <version>0.1.0</version>
     <description>My ROS2 Package</description>
     <maintainer email="developer@example.com">Developer</maintainer>
     <license>Apache-2.0</license>
   </package>
   ```
2. **빌드 및 실행 의존성**

   * 패키지가 의존하는 다른 ROS2 패키지나 라이브러리를 정의한다. `build_depend`는 빌드 시 필요한 패키지, `exec_depend`는 실행 시 필요한 패키지를 나타낸다.

   ```xml
   <build_depend>rclcpp</build_depend>
   <exec_depend>sensor_msgs</exec_depend>
   ```
3. **테스트 의존성**

   * 패키지 테스트를 수행할 때 필요한 의존성을 정의할 수 있다. 테스트 시 필요한 ROS2 패키지나 툴을 정의하는 부분이다.

   ```xml
   <test_depend>ament_lint_auto</test_depend>
   <test_depend>ament_cmake_pytest</test_depend>
   ```
4. **빌드 도구 의존성**

   * 패키지를 빌드하기 위해 필요한 도구를 정의한다. 예를 들어, ROS2 패키지를 빌드하는 데 사용하는 `ament_cmake`는 필수적인 빌드 도구 의존성이다.

   ```xml
   <buildtool_depend>ament_cmake</buildtool_depend>
   ```
5. **기타 의존성**

   * `package.xml` 파일에는 `build_export_depend`와 `exec_depend` 등의 의존성도 정의할 수 있다. 이러한 의존성들은 패키지가 빌드될 때뿐만 아니라 다른 패키지에서 이 패키지를 사용할 때도 필요한 의존성을 관리한다.
   * 예를 들어, `build_export_depend`는 빌드된 패키지가 다른 패키지에서 사용될 때 필요한 의존성을 정의하고, `exec_depend`는 패키지를 실행할 때 요구되는 의존성을 정의한다.

   ```xml
   <build_export_depend>std_msgs</build_export_depend>
   <exec_depend>geometry_msgs</exec_depend>
   ```
6. **파이썬 패키지 관리**

   * 만약 패키지에 파이썬 스크립트나 라이브러리가 포함된 경우, `ament_python`과 같은 의존성을 정의해야 한다. 이를 통해 파이썬 기반의 ROS2 노드를 관리할 수 있다.

   ```xml
   <buildtool_depend>ament_python</buildtool_depend>
   ```

#### CMakeLists.txt와 package.xml의 상호작용

* `CMakeLists.txt`와 `package.xml`은 상호 보완적인 역할을 하며, `CMakeLists.txt`가 실제 빌드 프로세스를 담당하고, `package.xml`은 패키지의 메타데이터 및 의존성 관리를 담당한다.
* 예를 들어, `package.xml`에서 의존성을 정의한 패키지나 라이브러리는 `CMakeLists.txt`에서 `find_package()` 명령어를 통해 실제로 빌드할 때 찾아 사용하게 된다.
* 또한 `ament_cmake`와 같은 빌드 도구는 `package.xml`에서 정의한 빌드 도구 의존성에 기반하여 CMake 프로세스를 실행한다. 이처럼 두 파일은 긴밀히 연결되어 있어, ROS2 패키지의 정상적인 빌드와 실행을 위해서는 두 파일이 일관되게 작성되어야 한다.

**패키지 관리 예시**

1. **패키지 생성 및 의존성 설정**

   * ROS2 패키지를 생성할 때 `ros2 pkg create` 명령어를 사용하면, 기본적인 `CMakeLists.txt`와 `package.xml`이 자동으로 생성된다. 사용자는 이후 필요한 의존성을 `package.xml`에 추가하고, `CMakeLists.txt`에 필요한 라이브러리와 파일을 설정한다.
   * 예를 들어, 패키지를 생성할 때 `rclcpp`와 `sensor_msgs`와 같은 의존성을 추가했다면, 해당 의존성은 `package.xml` 파일에 포함되며, `CMakeLists.txt`에서는 이를 `find_package()`를 통해 참조하게 된다.

   ```bash
   ros2 pkg create my_ros2_package --build-type ament_cmake --dependencies rclcpp sensor_msgs
   ```
2. **빌드 및 설치**

   * 패키지를 빌드하기 위해서는 `colcon build` 명령어를 사용하여 빌드 프로세스를 시작한다. 이 과정에서 `CMakeLists.txt`에 정의된 빌드 규칙이 적용되며, 종속성 확인과 컴파일이 진행된다.
   * 빌드 후, 패키지는 시스템 경로에 설치되며, 설치 과정은 `CMakeLists.txt`에 정의된 `install()` 명령어에 따라 실행된다.

   ```bash
   colcon build
   ```
3. **ROS2 실행 시 package.xml의 역할**
   * 패키지를 실행할 때, ROS2는 `package.xml` 파일을 참조하여 패키지 간의 의존성을 확인하고, 실행 환경을 설정한다. 예를 들어, `rclcpp`와 `sensor_msgs` 같은 패키지가 설치되지 않은 상태에서 패키지를 실행하려고 하면 의존성 오류가 발생할 수 있다.
