Bitbake 빌드 프로세스에서 특정 발생이나, 상태 변화를 감지, 수동적이고 반응적인 메커니즘.
빌드 흐름을 직접 변경하지 않으면서, 빌드 프로세스에 대한 모니터링, 로깅 및 외부 시스템 통합을 위한 훅 제공
빌드 프로세스의 핵심 로직을 변경하지 않고도 빌드에 대한 가시성을 확보
핸들러 | 설명 | 트리거 시점/단계 | 데이터스토어 d 범위 |
---|---|---|---|
bb.event.BuildStarted | 빌드 시작시 트리거 | 빌드 시작 전 | 전역 구성 데이터스토어 (레시피 특정X) |
bb.event.BuildCompleted | 빌드 완료시 트리거 | 빌드 완료 후 | 전역 구성 데이터스토어 (레시피 특정X) |
bb.event.ParseStarted | 파싱 시작시 트리거 | 메타데이터 파싱 시작 시 | 전역 구성 데이터스토어 |
bb.event.ParseProgress | 파싱 진행 중 트리거 | 파싱 진행 중 | 전역 구성 데이터스토어 |
bb.event.ParseCompleted | 파싱 완료시 트리거 | 파싱 완료 시 | 전역 구성 데이터스토어 |
bb.event.CacheLoadProgress | 캐시 로드 진행 중 트리거 | ||
bb.event.CacheLoadCompleted | 캐시 로드 완료시 트리거 | ||
bb.build.TaskFailed | 특정 태스크 실패시 트리거 | 태스크 실행 중 실패 시 | 레시피/태스크 특정 데이터스토어 |
bb.runqueue.runQueueTaskStarted | 런큐 태스크 시작 시 트리거 | 태스크 실행 시작 시 | 레시피/태스크 특정 데이터스토어 |
bb.runqueue.runQueueTaskFaeild | 런큐 태스크 실패 시 트리거 | 태스크 실행 중 실패 시 | 레시피/태스크 특정 데이터스토어 |
bb.command.CommandFailed | 명령 실패 시 트리거 | 명령 실행 중 실패 시 | 전역 구성 데이터스토어 |
bb.event.HartbeatEvent | 태스크 독립적인 작업을 위해 정기적으로(예: 10초 간격) 트리거 | 정기적인 시간 간격 | 전역 구성 데이터스토어 |
addhandler
지시문을 사용한다.eventmask
속성을 통해 어떤 이벤트에 반응할지 지정한다.myclass_eventhandler[eventmask] = "bb.event.BuildStarted bb.event.BuildCompleted
는addhandler myclass_eventhandler
python myclass_eventhandler() {
from bb.event import getName
print("The name of the Event is %s" % getName(e))
print("The file we run for is %s" % d.getVar('FILE'))
}
myclass_eventhandler[eventmask] = "bb.event.BuildStarted bb.event.BuildCompleted"
d
컨텍스트는 이벤트 유형에 따라 달라진다.BuildStarted
, BuildCompleted
이벤트의 경우, 이들은 태스크가 실행되기 전에 실행되므로d
의 컨텍스트가 이벤트 유형에 따라 어떻게 달라지는지에 대한 명시적인 설명은 이벤트 핸들러가 어떤 정보에 접근할 수 있고, 그 행동이 어떤 영향을 미칠지에 직접적인 영향을 미치므로 매우 중요하다.BuildStarted
이벤트 중 d
에서 레시피 특정 변수를 읽으려고 시도하면, 잘못된 데이터가 반환되거나 데이터가 없을 수 있e다.e
, d
차이e.data.getVar('SOME_VAR')
e
는 이벤트 객체e.data
를 통해 데이터 딕셔너리에 접근 이벤트 핸들러:
def my_event_handler(e):
var_value = e.data.getVar('SOME_VAR') # 이벤트를 통해 접근
addhandler my_event_handler
d.getVar('SOME_VAR')
d
는 데이터 딕셔너리 객체 일반 BitBake 함수:
def my_function(d):
var_value = d.getVar('SOME_VAR') # 직접 전달받은 d 사용
# busybox_rprovider.bbclass
python busybox_rprovider() {
import re
packages = d.getVar('PACKAGES').split()
preferred_rprovider_bash = d.getVar('PREFERRED_RPROVIDER_bash') or ""
if 'busybox' == preferred_rprovider_bash:
for pkg in packages:
rdeps = d.getVar('RDEPENDS:%s' % pkg)
bb.warn("rdeps for %s: %s" % (pkg, rdeps))
if rdeps:
new_rdeps = rdeps.replace('bash', 'busybox')
if new_rdeps != rdeps:
d.setVar('RDEPENDS:%s' % pkg, new_rdeps)
}
addhandler busybox_rprovider
busybox_rprovider[eventmask] = "bb.event.RecipePostKeyExpansion"
bb.event.RecipePostKeyExpansion
: 레시피의 변수 확장 완료후 발생