yocto - addtask, add variable, python task, task 개발

markyang92·2021년 12월 18일
1

yocto

목록 보기
17/53
post-thumbnail

addtask : task 추가

  • addtask 명령어를 활용하여, task를 추가 할 수 있다.
    • 다른 글의 bbclass에서 한 것과 거의 똑같다. (bbclass도 레시피니까)

class 에서 태스크 추가하기


  • 참고로, 'HOSTTOOLS'는 global 변수이기 때문에, 각(per) 레시피에서 설정해서 사용할 수 없다.

레시피에서 태스크 추가하기

namespace에 대한 이해

d.setVar('A','Value') 를 했는데 왜 한 레시피의 다른 태스크에서 읽지 못해?
=> namespace가 다르니까!

# === recipeA === #
SRC_URI="www.google.com"
A='hi'

python do_taskA() {
    source = d.getVar('SRC_URI')
    origin_A = d.getVar('A')
    modifiy_A = origin_A + 'B'
    d.setVar('A',modify_A)
}
addtask do_taskA after do_configure befroe do_install

python do_taskB() {
    isModified = d.getVar('A')
    bb.plain(isModified)
}
addtask do_taskB after do_install before do_package
$ bitbake recipeA
hi
  • 전역namespace에서 선언된 변수각 task에서 공유되지만, 한 태스크 내에서 설정한 변수다른 태스크에서 볼 수 없다!!!!
  • 그렇다면 다른 task에는 어떻게 변수를 전달 할 것인가?
    • file write하는 것이 현재 한계. (.lockfile)작성

task를 어떤 flow에서 실행할 것인가?

task를 flow에서 독립적으로 명시적인 실행을 하고 싶은 경우

  • taskyocto task flow에 더해, 자동적으로 실행시키지 않고, -c <my_task>로 실행하고 싶은 경우, 이 문단을 pass하고 바로 addtask를 사용해 task를 만들고, -c <my_task>로 실행하도록한다.

  • 우리가 아는 기본적인 yocto task flow
    • 하지만 실제로는 dummy do_build에서 내 전에 무엇이 있나? 하고 타고 타고 올라가다보니 do_fetch까지 타고 올라가 do_fetch부터 실행 되는 것이다. (이해 안되면, 넘어가자)
    • 여튼, addtasktask를 할 때, before가 항시 필수다.
      • 그렇지 않으면, 내가 추가하는 task가 자동으로 돌아가지 않을 수 가 있다.
        왜냐면, default task(do_build)의 task dependency에 나타나지 않으므로, 실행되지 안흔다.
      • afterbitbake가 실행할 때만 실행할 때 알려준다.
  • addtask <task> after do_deploy before do_build

dash shell

기존 task에 append, prepend

  • base task나 기존 task에서 _append() _prepend() 키워드를 덧붙여, 태스크를 확장할 수 있다.
do_install_append() {
    # 내용 작성
}

변수 할당

LOCAL_BUILD = "${DEPLOY_DIR_IPK}"

python task (class나 recipe에서든 참고)

  • Recipe, Class 에서 Python 으로 task 작성 가능
  1. simple python task
  • task로 사용하는 python taskpython do_mytask () { ... } 이며,
    그냥 python 함수python 문법 그대로 def function(): 임을 주목하자.

python task는 제어를 잘해야함

  • 위와 같은 경우는 태스크가 do_install에서 무언가 작업을 하는 것이기 때문에,
    1) after do_install
    2) before do_build
    로 확실하게 정하자.
    위 처럼 확실히 명시하자
  • task로 사용하는 python taskpython do_mytask () { ... } 이며,
    그냥 python 함수python 문법 그대로 def function(): 임을 주목하자.
  • 결과:

do_mypatch[nostamp] = "1"

  1. do_mypatch[nostamp] = "1" 혹은
  2. $ bitbake recipe -c mypatch -f
  • do_mypatch[nostamp] = "1": mypatch task 를 bitbake build 시, 매번 실행하기 원한다면 [nostamp] = "1"
    • 왜냐하면, stamp가 찍혀 있으면, sstate-hit되기 때문: bitbake의 "up-to-date" task
    • stamp가 찍히지 않으면, --> 매번 실행: bitbake의 "out-of-date" Task
  • 혹은 아래의 명령어로 직접 태스크를 지정해, 강제 re-run시킬 수 있다.
    • $ bitbake 'recipe' -c mypatch -f


전역 namespace에서 python function 정의

  • 변수나 또 다른 사용을 위한 값을 만들어내기 위해 파이썬 함수를 사용할 필요가 있다면
    그냥 아래 처럼 만들자.
def get_depends(d):
    if d.getVar('SOMECONDITION'):
        return "dependecywithcond"
    else:
        return "dependency"
        
SOMECONDITION = "1"
DEPENDS = "${@get_depends(d)}"

python을 사용해, 변수 정의


do_configure:append() {
    URI="${@os.path.join('${A}','${B}','${C}')}"
    bbplain "${URI}"
}

  • bitbake는 다음의 문법으로 변 수 설정 시, 쉽게 파이썬 코드를 사용한다.
VARIABLE = "${@<python-command>}"

DATE = "${@time.strftime('%Y%m%d', time.gettime())}"

CPU_COUNT = "${@oe.utils.cpu_count()}"

BB_NUMBER_THREADS = "${@max(${CPU_COUNT}*7//10,1)}"
PARALLEL_MAKE = "-j ${BB_NUMBER_THREADS}"

SOURCE_MIRROR_URL ?= "http://MIRRORSITE"
INHERIT += "own-mirrors"

d.getVar

  • 위에서 본 내용대로, python task 내부에서 ${d}라는 변수는 어마어마하게 많은 내용을 가지고 있다.
    • 대표적으로 d.getVar('SRC_URI') 같이, recipe변수를 가져올 수 있다.
addtask write_data
python do_write_data() {
    src_uri=d.getVar("SRC_URI", expand=True)
    print(src_uri) # log.do_write_data 에서 확인할 수 있다.
}
argsDescription
expand=<bool>True: 변수의 depend on some other variable도 함께 포함해 output으로 return한다.
B = "architecture_${A}"
return_=d.getVar("B",expand=True)
return_ : "architecture_x86"
------------------------------------------------
False: 변수의 depend on some other variable을 포함하지 않는다.

dash-shell 변수를 파이썬 Task에서 사용할 땐 항상 d.getVar()


bb print

bbplain: dash task의 logger

  • Recipe를 작성하다보면 Recipe의 내부변수의 정보를 비롯하여 print를 해서 보고 싶을 경우가 많을 것이며, 이를 bbplain이라는 것을 이용하여 확인하자
    • bbplain, bbwarn, bbnote등이 있다.
do_compile() {
        bbplain "--------    COMPILE DEBUG ${CFLAGS} "  
        ${CC}  -o test main.c ${CFLAGS} ${LDFLAGS} 
}

do_install() {
        bbplain "--------    INSTALL DEBUG ${bindir} " 
        install -d ${D}${bindir}
        install -d ${D}${sysconfdir}/systemd/network
        install -d ${D}${systemd_system_unitdir}
} 

bbfatal: Error 메세지

  • Error Message를 출력하고 빌드 중지됨

dash shell

do_install() {
    if ... ; then
        bbfatal "---- Error: "
    fi
}

python

python task_name () {
    bb.fatal("[ERROR] \n"
             "A: %s\n"
             "B: %s\n" % (A, B)
            )
}            

devshell

devshell

  • Bitbake와 같이 task engine같은 기능을 same context 동작하게하는 터미널 쉘

$ bitbake -c devshell <recipename>

e.g.
$ bitbake -c devshell myhello

  • 새 터미널은 dev, debug 용으로 환경이 셋업되어 있다.
  • 모든 task들은 최대 do_patch 까지 지정된 타겟을 run할 수 있다.
  • ${S}로 지정한 source directory에서 시작한다.

  1. 레시피에도 동작하는 CC를 알고 싶다면?
  • 그냥 echo CC

  1. 레시피에도 동작하는 LDFLAGS를 알고 싶다면?
  • 그냥 echo LDFAGS

소스 수정, makefile, 컴파일 가능


pydevshell

  • python debug가 매우 불편 하기 때문에, pydevshell을 활용하도록하자.
  1. 현재 쉘에서 $ source oe-init-build-env [TARGET_BUILD_ENV]bitbake 상태로 들어가자
(poky) $ source oe-init-build-env mybuild
(mybuild) $ 

  1. $ bitbake <TARGET_RECIPE> -c do_devpyshell
(mybuild) $ bitbake core-image-minimal -c do_devpyshell

  1. pydevshell로 들어간다.

  1. 현 상황에서 python debug가 가능하다.
profile
pllpokko@alumni.kaist.ac.kr

1개의 댓글

comment-user-thumbnail
2022년 6월 9일

좋은글 감사합니다. 빠르게 도움이 되었어요. 계속 좋은글 부탁 합니다.

답글 달기