메타데이터 파일, 변수, task, 연산자, OVERRIDES

markyang92·2021년 4월 23일
1

yocto

목록 보기
3/53
post-thumbnail

메타데이터 파일

  • 메타데이터 파일은 환경설정 파일, 레시피 분류로 나뉜다.

환경 설정 파일

  • 변수 할당 형태의 전역 빌드 시스템 설정
    • 전역 데이터 디렉토리에 위치 시키는 것을 추천
    • 모든 메타데이터 파일에서 접근 가능
      • 레시피 안에서 작성된 할당은 레시피 내에서만 사용 가능
  • bitbake.conf
  • layer.conf
    • <layer>/conf/layer.conf
  • bblayers.conf
  • local.conf
  • <dist-name>.conf
    • <layer>/conf/distro/<distro-name>.conf
    • distrolocal.conf에서 DISTRO 변수를 사용하여 결정
  • <machine-name>.conf
    • <layer>/conf/machine/<machine-name>.conf
    • machinelocal.conf에서 MACHINE 변수를 사용하여 결정

  • 환경 설정 파일의 변수는 그래서 대부분 대문자이다.

레시피 파일

  • .bb, .bbappend, .class
  • 레시피 내 이루어진 모든 변수할당레시피 내에서만 사용 가능
    • 각 레시피에서 환경 설정 파일 변수 설정을 참조하여 목적에 따라 덮어 쓰기를 하기 때문
  • 레시피의 공통을 묶은 것이 <layer>/classes/<class-name>.bbclass
  • 레시피에 첨부하는 것이 <recipe-name>.bbappend

실행가능한 메타데이터

  • bb, bbappend, class
    • 실행가능한 메타데이터에 대한 정의를 포함 할 수 있다.
  • 실행 가능한 메타데이터: , 파이썬함수
  • 비트베이크는 실행 가능한 메타데이터를 변수와 같게 다룬다.
    • 함수 이름은 할당된 값을 나타내는 함수 코드와 함께 데이터 딕셔너리에 저장된다.
    • 결과적으로 함수는 보통의 변수와 같이 :append, :prepend가 가능하고 메타데이터 속성을 가질 수도 있다.
  • .bb, .bbappend에 정의된 함수특정 파일에 지역적
  • .class에 정의된 함수전역적

함수

  • 레시피 내에서 그냥 함수이다.
    • 그냥 함수는 레시피를 실행 시키는 것으로는 실행되지않는다. (task가 아니므로)
    • task도구 수단 이다.

쉘 함수

  • /bin/sh 실행
  • 변수는 쉘 함수에서 읽고 쓰기가 가능하다. 그러나 변수의 쓰기는 쉘 스크립트 범위 내에서 지역적으로만 그 값을 바꾼다.

python: 파이썬 함수

  • 키워드 python 은 비트베이크에게 아래에 나오는 코드를 파이썬 코드로 해석할 것을 지시한다.
    실행 가능한 메타데이터를 위해 python을 사용하면 모든 파이썬 모듈을 가져올 수 있고, 다양한 함수 사용성에 대한 이점을 취할 수 있다.

def : 전역 파이썬 함수

  • def 파이썬(d):

값 목록 얻기


태스크

  • 태스크는 레시피, 클래스에서 정의된다.
  • 태스크는 do_ prefix가 붙는다!!
  • 기본 태스크는 변수 BB_DEFAULT_TASK 변수로, base 클래스에 의해 설정된다.

쉘 태스크


파이썬 태스크

  • def 로 하면 안된다.

태스크 체인


클래스에서 태스크

  • base.bbclass내 있는 task를 대신하기 위해선, EXPORT_FUNCTIONS 키워드를 사용해야한다.

    또한 현재 작성된 클래스 이름이 myclass.bbclass인데, 그래서 myclass_<task_name>형식이다.

  • python 태스크는 위 처럼, 클래스 이름을 붙이지 않아도 된다.

변수, 함수 속성 (flag)

PACKAGECONFIG[python3] = "-DPYTHON3_NUMPY"
do_mytask[nostamp] = "1"
등과 같이 bitbake의 변수나 함수는 '속성'(flag)를 가질 수 있다.

  • d.getVarFlag(변수, 속성)
  • d.setVarFlag(변수, 속성, 값) 을 사용할 수 있다.
func[run] = "1"
python func () {
    run = d.getVarFlag('func', 'run')
    if run == 1:
        # 작업 수행
        ...
        d.setVarFlag('func', 'run', 0) # func[run] = "0"
    else:
        # 지금은 수행하지 않음
}

변수 설정

  • 기본적으로 비트베이크 메타데이터 작성은 쉘과 거의 같지만 몇 몇 다른 특징이 있다.

  1. 띄워쓰기가능

1.1. Shell: 당연히 쉘 에선 띄워쓰기를 주면 변수에 할당되지 않는다. 개별 명령어로 알아 듣는다.


1.2. bitbake 에선 변수 설정 assign 시, 띄워쓰기 가능


  1. assignment

2.1. Shell: 위에서부터 순차적으로 대입된다.

  • 위와 같은 경우 line 5A="change"line4B에게 영향을 주지 않는다.

2.2. bitbake는 실제 레시피 사용 시, 변수 확장 실행

  • 실제 bbplain "B: ${B}" 때, 변수확장이 적용되어 아래의 ABassign
  • 즉, 쉘 처럼 순차 실행이라기보다는 모아서 한방에 적용시킨다 라고 생각하면 이해하기 쉽다.

초간단 레시피로 확인해보자.

  1. poky
  2. 레이어 추가 하기 귀찮으니 원래 있는 meta-poky에 간단한 레시피 제작
  3. myhello.bb
  4. Do Bitbake!
$ bitbake myhello

Operand


  • VARIABLE = "value"
  1. = hard assignment

  1. ?=: soft assignment

    • variable이 = 선언되지 않았다면 사용되는 변수 값
      • MACHINE ?= "qemuarm"
        • MACHINE =로 hard assignment가, 위든 아래든 set 되었다면 ?=문장은 무시
        • MACHINE =이 set되지 않았다면, MACHINE ?= "qemuarm"이 최종 적용 뒤에 MACHINE =set 되면 =한게 먹힌다.
      • ?=가 여러 개 선언되면 제일 첫 번째 것이 적용된다.

  1. ??=: weak assignment
    • MACHINE =이 위든 아래든 set되면 = 적용
    • =이 없으면, ??=제일 뒤에꺼 최종 적용

= hard assignment

  • =hard assignment
    • 즉시 대입되고, '현재' 위치에 밑에서 assign 된 것도 적용한다.
    • 즉, 위아래 안가리고 적용됨

?= soft assignment

  • 만약 = 가 없다면 ?= 가 먹음
  • ?=가 여러 개 선언되면 제일 첫 번째 것이 적용된다.

  • 예: local.conf
MACHINE ?= "qemuarm"

.... 중략 ...
MACHINE = "qemux86"
  • 결과

??= weak assignment

  • MACHINE =이 위든 아래든 set되면 = 적용
  • =이 없으면, ??=제일 뒤에꺼 최종 적용

:= 즉시 위로 보기

T = "123"
A := "${D} ${A} test ${T}"
  • 적용결과: A = "test 123"
  • 즉, 변수실제 사용 시점이 아닌 해석되는 시점에서 즉시 사용

+= 공백하나 추가

A = "11"
A += "12"
-> A = "11 12"

.= 공백 없이 추가

A = "11"
A .= "12"
-> A = "1112"
  • 그냥 FB_append 사용하기

_append 공백 없이 추가

A = "11"
A_append = "12"
-> A = "1112"

:append

  • yocto kirkstone 부터, _ 사용 금지
    • :append = " " 의무화

_prepend 공백 없이 앞에 추가

A = "11"
A_prepend = "12"
-> A = "1211"

:prepend

  • yocto kirkstone 부터, _ 사용 금지
    • :prepend = " " 의무화

_remove

  • VARIABLE_remove제거

:remove

  • yocto kirkstone 부터, _ 사용 금지
    • :remove = " " 의무화

remove 특징

  • append는 한칸 띄우고 사용하지만, remove는 그럴 필요가 없음
    • qtbase에서, PACKAGECONFIGeglfsappend하는 경우
      • PACKAGECONFIG:append = " eglfs"
    • qtbase에서, PACKAGECONFIGeglfsremove하는 경우
      • PACKAGECONFIG:remove = "eglfs"
  • remove는 마지막에 적용되는 거라, 앞에서 :append 쳐놔도 마지막에 :remove가 있다면, VARIABLE에 VAL이 먹히지 않음

OVERRIDES

  • OVERRIDES 변수를 두면, : 콜론으로 분리해 선택 조건을 나열한다.
  • 오른쪽에서 왼쪽으로 ← 조건을 OR 처리한다.

    변수 A와 변수 B는 각각 machine, os를 가졌으므로 가진 변수가 override된다.

yocto kirkstone부터, :으로하자.

  • local.conf에 위를 넣고, 한 번 검사해보자.
$ bitbake -e | grep "^A=\|^B=\|^C="

OVERRIDES = "sun:rain:snow"
PROTECTION:rain = "umbrella"
PROTECTION:snow = "sweater"

# ===================================== #
결국 PROTECTION = "sweater"


  • 위에서 OVERRIDEShail을 넣어보자.
OVERRIDES = "sun:rain:snow:${OTHER}"
OTHER = "hail"

PROTECTION:rain = "umbrella"
PROTECTION:hail = "duck"

# ===================================== #
PROTECTION = "duck"
  • 특정 조건이 만족되면 특정 값으로 덮어쓰는 효과를 가진다.
    이 방법은 빌드 시스템에 의해 자주 사용된다.
    특히 머신에 의존적인 코드를 위한, 컴파일러에 특정 매개변수를 전달하기 위해 필요하다.

MACHINEOVERRIDES

  • colon-separated list 가 현재 머신에 적용된다.


  1. local.conf
# ==== local.conf ==== #
MACHINE = "qemux86-64"
  1. 확인
$ bitbake -e | grep "^MACHINE"
-> MACHINEOVERRIDES="qemuall:qemux86-64"
  • 주의
VARIABLE:qemuall:qemux86-64 = "1.4.6" # 사용하는 변수는 이런식으로 쓰면 안된다. 

RDEPENDS:${PN}:append:qemuall = "\
	${VARIABLE} \
    "

RDEPENDS:${PN}:append:qemux86-64 = "\
	${VARIABLE} \
    "
  • 위는 틀린 예이다.
    • 사용하려는 VARIABLE:override1:override2 방식(마치 'OR')은 생각처럼 동작하지 않고, 한번에 하나만 선택한다.
VARIABLE ?= ""
VARIABLE:qemuall = "1.4.6"
VARIABLE:qemux86-64 = "1.4.7"
RDEPENDS:${PN}:append:qemuall = "\
	${VARIABLE} \
    "
    

RDEPENDS:${PN}:append:qemux86-64 = "\
	${VARIABLE} \
    "

특정 '변수'를 특정 '레시피'에서만 변경

  1. 변경할 변수: DEPLOY_DIR_IPK
  2. 변경할 레시피 : package-index
# local.conf
DEPLOY_DIR_IPK_pn-package-index = "새 할당 변수 값"

변수_pn-<레시피> = "새 값"

파이썬 변수 확장

  • @연산자를 사용해, 비트베이크에게 파이썬 코드로 이뤄진 표현식을 다루라고 알린다.
  • 코드는 반드시 값을 뽑아내야한다.
DATE = "${@time.strftime('%A %B %d, %Y', time.gmtime())}"
TODAY := "Today is: ${DATE}."

  • 태스크 쉘 내에서 사용할 경우 띄워쓰기 주의
do_install () {
	DATE="${@time.strftime('%A %B %d, %Y', time.gmtime())}"
    bbplain "${DATE}"
}

def : 전역 파이썬 함수

  • def func(d):
    • d: 전역 Bitbake 변수를 담은 딕셔너리
    • def 키워드를 사용하면, 어느 파일에서 정의되든지 간에 전역으로 정의할 수 있다.


python :

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글