28.7.2.1. 디렉토리 생성(`src/modules/flight_mode_manager/tasks/Custom`) 및 `CMakeLists.txt` 소스 등록

28.7.2.1. 디렉토리 생성(src/modules/flight_mode_manager/tasks/Custom) 및 CMakeLists.txt 소스 등록

커스텀 객체(FlightTaskCustom)의 헤더 파일과 소스 코드 파일(CPP)에 로직을 구상했다면, 그다음으로 해야 할 일은 PX4의 방대한 소스 트리 안에 이 파일들을 안착시킬 물리적인 공간(Directory) 을 만들고 빌드 시스템(CMake)에 등록하는 것이다.

본 절에서는 리눅스(Linux) 환경 기준의 디렉토리 구조 생성 방법과, PX4의 빌드 시스템 구조상 소스 파일이 컴파일러에 포함(Include)되기 위해 거쳐야 하는 CMakeLists.txt 수정 절차를 상세히 안내한다.


1. Flight Task 디렉토리 구조 파악 및 생성

PX4 펌웨어에서 모든 비행 모드에 관련된 FlightTask 클래스들은 Flight Mode Manager 모듈 내부의 종속 디렉토리인 src/modules/flight_mode_manager/tasks/ 아래에 철저하게 모듈화되어 모여 있다.

px4-autopilot/
├── src/
│   ├── modules/
│   │   ├── flight_mode_manager/
│   │   │   ├── tasks/
│   │   │   │   ├── Auto/
│   │   │   │   ├── AutoMapper/
│   │   │   │   ├── ManualPosition/
│   │   │   │   └── Orbit/
│   │   │   │   └── ...

위의 트리를 보면 Auto, ManualPosition, Orbit 등 각 역할을 담당하는 비행 모드들이 각자 대문자로 시작하는 고유 폴더를 꿰차고 있는 것을 볼 수 있다.
우리가 새롭게 작성할 커스텀 모드 역시 이들과 동등한 지위를 부여받기 위해 동일한 위치에 전용 폴더를 신설해야 한다.

1.1 커스텀 폴더 및 소스 파일 뼈대 생성

터미널을 열고 PX4 소스 루트 디렉토리에서 아래 명령어를 수행하여 공간을 할당한다. (접두사는 대문자를 권장한다.)

# 1. 커스텀 Task 디렉토리 생성
mkdir -p src/modules/flight_mode_manager/tasks/Custom

# 2. 해당 디렉토리로 이동하여 빈 소스 파일 생성
cd src/modules/flight_mode_manager/tasks/Custom
touch FlightTaskCustom.hpp
touch FlightTaskCustom.cpp

이제 이 두 파일 안에 앞서 설계한 클래스 선언과 update() 함수 구현체를 집어넣으면 된다.


2. 해당 폴더의 로컬 CMakeLists.txt 작성

소스 파일을 제자리에 넣었다고 해서 컴파일러(GCC)가 알아서 이 파일들을 찾아 빌드해 주지는 않는다. 각각의 폴더 내부에는 이 폴더 안의 소스 파일들을 묶어 하나의 정적 라이브러리(Static Library) 단위로 뭉쳐주는 지역 CMakeLists.txt 파일이 필요하다.

src/modules/flight_mode_manager/tasks/Custom 폴더 안에 새 CMakeLists.txt를 생성하고 다음과 같이 작성한다.

# src/modules/flight_mode_manager/tasks/Custom/CMakeLists.txt

px4_add_library(FlightTaskCustom
	FlightTaskCustom.cpp
)

# FlightTask 코어 클래스에 의존성을 가짐을 선언
target_link_libraries(FlightTaskCustom PRIVATE FlightTask)

이 짧은 코드가 매우 중요하다. px4_add_library 매크로는 FlightTaskCustom.cpp를 컴파일하여 FlightTaskCustom이라는 이름의 라이브러리 객체를 만들어낸다.


3. 부모 디렉토리의 CMakeLists.txt 소스 등록 (Binding)

로컬 폴더에서 라이브러리를 만들었다 하더라도, 상위 디렉토리(Flight Mode Manager 전체)의 CMake가 이 폴더의 존재를 모른다면 링킹(Linking) 과정에서 최종 펌웨어에 포함되지 않고 무시되어 버린다.

따라서 한 단계 상위 디렉토리인 tasks 폴더 혹은 flight_mode_manager 모듈의 메인 CMakeLists.txt를 찾아 다음과 같이 서브 디렉토리 등록(Subdirectory Addition) 을 수행해야 한다.

파일 경로: src/modules/flight_mode_manager/CMakeLists.txt (버전에 따라 tasks/CMakeLists.txt 일 수 있음)

# 기존 코드 블록
add_subdirectory(tasks/Auto)
add_subdirectory(tasks/AutoMapper)
add_subdirectory(tasks/ManualPosition)
add_subdirectory(tasks/Orbit)
# ...

# [NEW] 방금 생성한 커스텀 폴더를 CMake 트리에 등록한다.
add_subdirectory(tasks/Custom)

# (중략) 아래쪽의 모듈 생성 링크 블록에서도 라이브러리를 바인딩해 주어야 한다.
px4_add_module(
	MODULE modules__flight_mode_manager
	MAIN flight_mode_manager
	SRCS
		FlightModeManager.cpp
	DEPENDS
		# ... (기존 종속성 목록) ...
		FlightTaskCustom  # [NEW] 로컬 라이브러리 심볼 링크 추가
)

이 과정은 톱니바퀴를 물리는 것과 같다. 상위 CMake 파일은 add_subdirectory(tasks/Custom) 구문을 읽는 순간 우리의 커스텀 폴더로 진입하여 로컬 CMakeLists.txt를 실행하고, 거기서 뱉어낸 FlightTaskCustom 라이브러리를 메인 flight_mode_manager 모듈에 단단히 결합(Link)시킨다.

이 등록 절차가 모두 끝난 뒤 펌웨어 전체 빌드(make px4_fmu-v...)를 수행하면 컴파일 퍼센티지가 올라가는 도중 [ ##%] Building CXX object .../FlightTaskCustom.cpp.o 구문이 노출되며, 여러분의 커스텀 뇌(Brain)가 드론의 시스템 메모리에 성공적으로 인스톨된다.