### 0.0.1 Python 환경: 스크립팅, 코드 생성기(Jinja2), MAVLink 헤더 파싱 역할
C++로 작성된 펌웨어 아키텍처라는 거죽 이면에는, 개발자의 수동 하드드라이빙 타이핑(Typing)을 말살시키기 위한 고도화된 스크립트 기반 코드 공장이 24시간 도사리고 있다. PX4 빌드가 시작되면 컴파일러가 투입되기 전 **Python 환경(환경 변수 내 Python 3.6+)**이 전위대로 투입되어 소스 트리의 배수로를 파괴적으로 재설계한다.
Jinja2: uORB 마이크로 오브젝트 바인딩(Binding) 공장
18장에서 자세히 다루게 될 uORB 메시지 인터페이스들은 본래 단순한 distance_sensor.msg 와 같은 껍데기 텍스트 파일(Type 선언)에 불과하다.
이 텍스트 규격서를 진정한 C++의 강타입 구조체(struct distance_sensor_s)로 만들어내는 것이 바로 파이썬 템플릿 엔진인 **Jinja2 (및 empy)**의 몫이다.
파이썬 스크립트가 msg/ 디렉토리 아래의 단어들을 스캐닝한 다음, 템플릿(.cpp.template) 문서의 빈칸에 변수명 속성을 주입하여 순식간에 수백 개의 C++ 소스 코드(.h 와 .cpp) 덩어리를 build/ 공간 너머로 토해낸다. 이 스크립트 메커니즘이 존재하기에 개발자는 단 한 줄의 msg 설계도만 던져주면, 빌드 시스템이 C++ 구조체, MAVLink 패킷 래퍼(Wrapper), 리플레이 데이터 로깅 코드(ULog)까지 3계층 코드를 통째로 찍어내는 마법을 만끽할 수 있다.
Param 메타데이터 수집 포크(Fork)
소스 코드 각개 전투지마다 흩뿌려져 있는 PARAM_DEFINE_FLOAT(EKF2_RNG_NOISE, 0.1f); 와 같은 C++ 매크로 상수들을 Python 파서(Parser)가 정규 표현식으로 싹싹 긁어 모은다. 수집된 결과들은 XML 및 JSON 딕셔너리로 압축 번역되어 펌웨어 빌드 바이너리의 메타데이터 꼬리말 섹션(Metadata section)으로 직접 삽입된다.
추후 QGroundControl이 USB로 보드에 접속했을 때, 수천 개의 파라미터 트리 구조체와 그 설명서 문구를 단박에 렌더링해 낼 수 있는 근본 이유가 바로 이 파이썬의 사전 크롤링(Crawling) 및 통합 아티팩트(Artifact) 포장 능력에 기인한다. Python 스크립트 종속성이 깨어지는 순간 PX4는 단 한 줌의 Kconfig 인터페이스나 파라미터도 조립해내지 못하는 시체 베이스 코드로 전락할 뿐이다.