19.1.3.3. CMake 기반의 모듈 빌드 스크립트(CMakeLists.txt) 초안 작성
메인 C++ 소스 코드(px4_uorb_example.cpp)가 데몬의 뼈대와 진입점을 완벽히 갖추었다 한들, 그 C++ 텍스트 파일은 빌드 시스템의 무자비한 인터페이스 시각에서는 리눅스 하드디스크 구석에 홀로 떠도는 무의미한 메모장 쪼가리에 불과하다. 이 날것의 텍스트 파일을 GCC(GNU Compiler Collection) 툴체인이 기계어로 씹고 소화시켜 .o 오브젝트 파일 덩어리로 번역하게 만들기 위해서는, 그리고 최종적으로 픽스호크 마이크로 컨트롤러(MCU) 코어에 탑재될 .px4 펌웨어 마스터 바이너리 덤프 이미지 속에 이것을 합법적으로 링킹(Linking)시키기 위해서는, PX4 컴파일러 파이프라인과의 공식 계약서인 CMakeLists.txt 스크립트 파일의 정밀 작성이 절대적으로 요구된다.
위대한 PX4 시스템 빌드 아키텍처는 오픈소스 C++ 진영의 글로벌 표준인 CMake 랭귀지 문법을 근본으로 취하되, 드론 비행 제어 모듈 특성에 최적화시켜 자체적으로 고도로 매크로화(Macro-ized)시킨 커스텀 함수 빌드 엔진을 별도로 제공한다. 우리는 이 엔진을 호출하여 모듈의 컴파일 스택 사이즈와 링킹 의존성 위상을 다음과 같이 엄격하게 정의한다.
1. 툴체인 컴파일러와의 공식 외주 계약: px4_add_module 함수 타설
방금 전 빈 공간으로 남겨둔 src/examples/px4_uorb_example/CMakeLists.txt 스크립트 파일을 열고, 아래와 같이 PX4 코어 전용 빌드 매크로 함수를 거침없고 호쾌하게 타설한다.
# PX4 마스터 코어 빌드 엔진 링커에게 이 디렉토리 하위의 파일들을 하나의 완전한 '독립적 실행 모듈' 오브젝트로 승격시켜 등록
px4_add_module(
MODULE examples__px4_uorb_example
MAIN px4_uorb_example
STACK_MAIN 2000
PRIORITY default
SRCS
px4_uorb_example.cpp
DEPENDS
px4_work_queue
)
이 짧고 압축적이지만 매우 폭력적인 파괴력을 지닌 CMake 덤프 스크립트 블록은 툴체인 파서(Parser)를 향해 다음과 같은 극히 중요하고 치명적인 시스템 아키텍처 파라미터 정보들을 강제로 렌더링한다.
MODULE(모듈 고유 패키지 식별자): 이 커스텀 폴더 모듈의 시스템 전역 네임스페이스 식별 경로(examples__px4_uorb_example)를 문자열로 지정한다. 이 유일무이한 토큰(Token)은 훗날 방대한 최상위 보드 타겟 설정 마스터 스크립트(boards/px4/sitl/default.cmake등) 내부에서, 이번 컴파일 빌드 사이클에 이 모듈을 구워서 태워보낼 것인지 기각할 것인지를 켜고 끄는 스위치 트리거 그 자체가 된다.MAIN(NuttShell 실행 가능 심볼): 방금 전 작성한 C++ 코드 최상단에서__EXPORT매크로로 당당하게 노출시켰던 메인 함수의 접두어 명칭(px4_uorb_example)을 하드코딩으로 바인딩한다. 당신이 NSH 터미널 콘솔창을 켜서 타이핑하게 될 런타임 명령어 시그니처, 바로 그 텍스트다.STACK_MAIN(스택 메모리 한계점 할당량): 데스크탑 OS와 달리 하드 리얼타임 OS(NuttX)는 백그라운드 스레드 생성 시 끝없는 가상 메모리(SWAP)의 은총을 베풀지 않는다. 이 커스텀 모듈이 백그라운드 거미줄 데몬으로 기상할 때 물리적 RAM에서 독점적으로 할당받을 절대적인 런타임 스택(Stack) 사이즈 리미트를 바이트(Bytes) 단위로 혹독하게 명시해야만 한다. (일반적인uORB폴링 대기 및 데이터memcpy연산 모듈은 보통 2000바이트 내외에서 생존이 결정된다). 이 수치를 생각 없이 너무 타이트하게 잡으면, 비행 도중 갑자기 C++ 지역 변수(Local Variables)가 스택 천장을 뚫고 나가 커널 메모리를 덮어써 버리고 기체가 공중에서 참혹하게 패닉(Panic) 분해되는 런타임 스택 오버플로우 참사를 직면하게 될 것이다.SRCS(컴파일 소스 파일 링킹 리스트): 실제 객체 파일(.o) 번역 컴파일의 물리적 타깃이 될 C++ 파일들의 경로를 열거한다. 향후 모듈 설계의 부피가 거대해지면publisher.cpp,subscriber.cpp,utils.cpp등 여러 파편화된 파일들을 이곳에 줄무늬처럼 주렁주렁 엮어 하나의 덩어리로 무사히 링크시킬 수 있다.DEPENDS(타 모듈 간 거시적 링킹 의존성): 우리의 독자적인 데몬 스레드가 시스템 내부망에서 겉돌지 않고 효율적인 이벤트 슬립/웨이크(Sleep/Wake) 동기화 통제를 완벽히 받을 수 있도록,px4_work_queue와 같은 강력한 코어 인프라스트럭처 라이브러리의 C++ 심볼들을 링커(Linker) 단에서 컴파일 타임에 강제로 끌고 와 동맹 결합시키는 본드 역할을 한다.
이 단 한 줄의 강력한 px4_add_module CMakeLists.txt 교차로 스크립트 타설 작업이 에러 파싱 없이 파이프라인 매핑 완료를 띄움으로써, 비로소 우리의 고립된 px4_uorb_example 폴더는 외로운 무인도 생태계 공간에서 벗어나 PX4 빌드 생태계의 메인 컴파일 하이웨이(Highway) 백본 위로 정식으로 합법적 안착을 하게 된 것이다. 이제 다음 거대한 모듈 막에서는 이 넓고 단단해진 고속도로 위에 본격적으로 올려 태워 시스템을 지휘할 진정한 페이로드(Payload)인, [uORB 커스텀 메시지 데이터 통신 규격]을 펄펄 끓는 용광로에서 직접 수학적으로 제련하고 뽑아내어 볼 것이다.