event_handler

markyang92·3일 전
0

yocto_guide

목록 보기
2/2

이벤트 핸들러

  • 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 지시문을 사용한다.
    • 이벤트 핸들러는 python 함수로 구현
  • 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')
    • 일반 Bitbake 함수/태스크 내부에서 사용
    • d는 데이터 딕셔너리 객체
  일반 BitBake 함수:
  def my_function(d):
      var_value = d.getVar('SOME_VAR')  # 직접 전달받은 d 사용
  • 결론: 본질적으로 같은 데이터에 접근하지만, 접근 경로가 다름 - 이벤트 핸들러는 e.data를 거쳐야 하고, 일반 함수는 d를 직접 사용.

bb.event.RecipePostKeyExpansion

  • RDEPENDS 다뤄버림
# 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: 레시피의 변수 확장 완료후 발생
    • 모든 변수가 최종 값으로 확정된 시점
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글