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를 복사해서 넣으면 되는지는 잘 모르겠다. 별도로 디렉토리 설정을 해줘야 할수도 있을것이다. 이는 차후 알아보기로,,,