waf 빌드 시스템 - whdlgp/look_into_pixhawk_with_apm GitHub Wiki

waf 빌드 시스템

Optical Flow 센서를 이용하기 위해 값이 정상적으로 읽어지는지 확인해보고 싶어졌는데, 각 라이브러리에 example 폴더로 이동해 make px4-v2를 해보니 빌드가 되지 않았다.
혹시 몰라 ardupilot 사이트에 들어가보니 example에 관해 약간 다른점이 생긴 것 같다.
(혹시 모르지 원래 똑같았는데 내가 까먹었을지)
(이 빌드 시스템을 써본적이 없는데 까먹고 있었으면 바보인거지;)

쨋든 태스트용 소스를 작성하고 실험해보기 위해서는 이 waf 라는 빌드시스템을 사용할 줄 알아야 할탠대, 우선 ardupilot에 나와있는 빌드시스템 사용방법을 보도록 하자.

waf를 위한 준비

기본적으로 waf는 wscript 라는 스크립트파일(파이썬으로 작성되있다)을 이용하고, 각 library 들의 example 디렉토리들 안에는(또는 그 하위 디렉토리) wscript 가 있다. 때문에 사전에 파이썬과 관련된 것들을 미리 설치해두어야 한다. (나는 미리 설치가 되있어서 어떤걸 설치해야 되는지 까먹었다)
(미안)
또 Cmake를 쓰는 모양이니 Cmake를 설치해주자

sudo apt-get install cmake

waf 는 ardupilot 폴더 안에 실행파일이 존제하고 있기 때문에, 별도로 설치할 필요없이 해당 파일을 실행하면 된다.

실행시 주게 되는 옵션이 몇가지 있는데, 아래 옵션 정도면 왠만한건 다 할 수 있을 것 같다.

./waf --help

를 통해 아래 옵션 이외에 다른 옵션들도 볼 수 있다.
(근대 길어서 보기는 싫더라;)

 --board=BOARD       Target board to build, choices are ['aero', 'bbbmini', 'bebop', 'bhat', 'disco', 'erleboard', 'erlebrain2', 'linux',
                        'minlure', 'navio', 'navio2', 'px4-v1', 'px4-v2', 'px4-v4', 'pxf', 'pxfmini', 'raspilot', 'sitl', 'zynq'].


  Build and installation options:
    -p, --progress      -p: progress bar; -pp: ide output
    --targets=TARGETS   task generators, e.g. "target1,target2"


  Ardupilot build options:
    --program-group=PROGRAM_GROUP
                         Select all programs that go in <PROGRAM_GROUP>/ for the build. Example: `waf --program-group examples` builds all
                        examples. The special group "all" selects all programs.
    --upload             Upload applicable targets to a connected device. Not all platforms may support this. Example: `waf copter --upload`
                        means "build arducopter and upload it to my board".
    --summary-all        Print build summary for all targets. By default, only information about the first 20 targets will be printed.

보드 타겟 설정 및 빌드

빌드 까지만

./waf configure --board=보드명
./waf build --target examples/예제명

업로드 까지

./waf configure --board=보드명
./waf build --target examples/예제명 --upload

--board=보드명을 통해 먼저 타겟 보드를 설정한 뒤, 원하는 example 소스를 컴파일 하는 방식이다.

예시로 다음과 같이 하면 px4-v2를 타겟보드로 하고, AP_OpticalFlow_test라는 예제를 빌드 한다.

./waf configure --board=px4-v2
./waf build --target examples/AP_OpticalFlow_test

업로드 옵션까지 하면 다음과 같다.

./waf configure --board=px4-v2
./waf build --target examples/AP_OpticalFlow_test --upload

지원하는 범위

waf 를 통해 빌드할 수 있는 소스는 list 명령을 통해 볼 수 있다.

./waf list

현재는 아래와 같은 소스들을 빌드할 수 있다.

APMrover2_libs 
AntennaTracker_libs 
ArduCopter_libs 
ArduPlane_libs 
ap 
ap_version 
bin/antennatracker 
bin/arducopter-coax 
bin/arducopter-heli 
bin/arducopter-hexa 
bin/arducopter-octa 
bin/arducopter-octa-quad 
bin/arducopter-quad 
bin/arducopter-single 
bin/arducopter-tri 
bin/arducopter-y6 
bin/arduplane 
bin/arduplane-tri 
bin/ardurover 
examples/AC_PID_test 
examples/AHRS_Test 
examples/AP_BattMonitor_test 
examples/AP_Common 
examples/AP_Compass_test 
examples/AP_Declination_test 
examples/AP_Mission_test 
examples/AP_Notify_test 
examples/AP_OpticalFlow_test 
examples/AP_Parachute_test 
examples/Airspeed 
examples/AnalogIn 
examples/BARO_generic 
examples/DataFlash_AllTypes 
examples/DataFlash_test 
examples/Derivative 
examples/Filter 
examples/GPS_AUTO_test 
examples/GPS_UBLOX_passthrough 
examples/Hello 
examples/INS_generic 
examples/LowPassFilter 
examples/LowPassFilter2p 
examples/ModuleTest 
examples/Printf 
examples/RCInput 
examples/RCInputToRCOutput 
examples/RCOutput 
examples/RCOutput2 
examples/RC_Channel 
examples/RC_UART 
examples/RFIND_test 
examples/RPM_generic 
examples/Scheduler_test 
examples/Storage 
examples/StorageTest 
examples/ToshibaLED_test 
examples/UART_test 
examples/eulers 
examples/location 
examples/pid 
examples/polygon 
examples/rotations 
examples/routing 
examples/simple 
examples/trivial_AP_Mount 
mavlink 
objs/AC_AttitudeControl 
objs/AC_Avoidance 
objs/AC_Fence 
objs/AC_InputManager 
objs/AC_PID 
objs/AC_PrecLand 
objs/AC_Sprayer 
objs/AC_WPNav 
objs/APM_Control 
objs/AP_ADC 
objs/AP_ADSB 
objs/AP_ADSB/ArduCopter 
objs/AP_ADSB/ArduPlane 
objs/AP_ADSB/UNKNOWN 
objs/AP_AHRS 
objs/AP_AccelCal 
objs/AP_AccelCal/APMrover2 
objs/AP_AccelCal/AntennaTracker 
objs/AP_AccelCal/ArduCopter 
objs/AP_AccelCal/ArduPlane 
objs/AP_AccelCal/UNKNOWN 
objs/AP_AdvancedFailsafe 
objs/AP_Airspeed 
objs/AP_Arming 
objs/AP_Avoidance 
objs/AP_Avoidance/ArduCopter 
objs/AP_Avoidance/ArduPlane 
objs/AP_Avoidance/UNKNOWN 
objs/AP_Baro 
objs/AP_BattMonitor 
objs/AP_BattMonitor/APMrover2 
objs/AP_BattMonitor/AntennaTracker 
objs/AP_BattMonitor/ArduCopter 
objs/AP_BattMonitor/ArduPlane 
objs/AP_BattMonitor/UNKNOWN 
objs/AP_BoardConfig 
objs/AP_Buffer 
objs/AP_Button 
objs/AP_Camera 
objs/AP_Common 
objs/AP_Compass 
objs/AP_Compass/APMrover2 
objs/AP_Compass/AntennaTracker 
objs/AP_Compass/ArduCopter 
objs/AP_Compass/ArduPlane 
objs/AP_Compass/UNKNOWN 
objs/AP_Declination 
objs/AP_EPM 
objs/AP_Frsky_Telem 
objs/AP_GPS 
objs/AP_HAL 
objs/AP_HAL_Empty 
objs/AP_HAL_PX4 
objs/AP_HAL_PX4/APMrover2 
objs/AP_HAL_PX4/AntennaTracker 
objs/AP_HAL_PX4/ArduCopter 
objs/AP_HAL_PX4/ArduPlane 
objs/AP_HAL_PX4/UNKNOWN 
objs/AP_ICEngine 
objs/AP_IRLock 
objs/AP_InertialNav 
objs/AP_InertialSensor 
objs/AP_InertialSensor/APMrover2 
objs/AP_InertialSensor/AntennaTracker 
objs/AP_InertialSensor/ArduCopter 
objs/AP_InertialSensor/ArduPlane 
objs/AP_InertialSensor/UNKNOWN 
objs/AP_L1_Control 
objs/AP_LandingGear 
objs/AP_Math 
objs/AP_Menu 
objs/AP_Mission 
objs/AP_Mission/APMrover2 
objs/AP_Mission/AntennaTracker 
objs/AP_Mission/ArduCopter 
objs/AP_Mission/ArduPlane 
objs/AP_Mission/UNKNOWN 
objs/AP_Module 
objs/AP_Motors 
objs/AP_Mount 
objs/AP_NavEKF 
objs/AP_NavEKF/APMrover2 
objs/AP_NavEKF/AntennaTracker 
objs/AP_NavEKF/ArduCopter 
objs/AP_NavEKF/ArduPlane 
objs/AP_NavEKF/UNKNOWN 
objs/AP_NavEKF2 
objs/AP_NavEKF2/APMrover2 
objs/AP_NavEKF2/AntennaTracker 
objs/AP_NavEKF2/ArduCopter 
objs/AP_NavEKF2/ArduPlane 
objs/AP_NavEKF2/UNKNOWN 
objs/AP_Navigation 
objs/AP_Notify 
objs/AP_OpticalFlow 
objs/AP_Parachute 
objs/AP_Param 
objs/AP_Proximity 
objs/AP_RCMapper 
objs/AP_RPM 
objs/AP_RSSI 
objs/AP_Rally 
objs/AP_Rally/APMrover2 
objs/AP_Rally/AntennaTracker 
objs/AP_Rally/ArduCopter 
objs/AP_Rally/ArduPlane 
objs/AP_Rally/UNKNOWN 
objs/AP_RangeFinder 
objs/AP_Relay 
objs/AP_Scheduler 
objs/AP_Scheduler/APMrover2 
objs/AP_Scheduler/AntennaTracker 
objs/AP_Scheduler/ArduCopter 
objs/AP_Scheduler/ArduPlane 
objs/AP_Scheduler/UNKNOWN 
objs/AP_SerialManager 
objs/AP_ServoRelayEvents 
objs/AP_SpdHgtControl 
objs/AP_TECS 
objs/AP_Terrain 
objs/AP_Tuning 
objs/AP_Vehicle 
objs/DataFlash 
objs/Filter 
objs/GCS_MAVLink 
objs/PID 
objs/RC_Channel 
objs/StorageManager 
px4_msg_gen 
px4_prebuild_targets 
px4_romfs_static_files 
tools/CPUInfo 

내가 원하는 소스를 빌드할 수 있는가

내가 원하는 소스(예를들어 동작 테스트용 소스 등등,,,)를 빌드할 수 있는지는 살펴보아야 한다.
사실 관련 wscript를 소스 디렉토리에 추가해주고, waf가 자동으로 잡도록 해줄 수 있다면 큰 문제가 없을것이다. 근대 내가 waf를 처음 보고, 단순히 다른 예제에 있던 wscript를 복사해서 넣으면 되는지는 잘 모르겠다. 별도로 디렉토리 설정을 해줘야 할수도 있을것이다. 이는 차후 알아보기로,,,