2/21/2020

Yocto 기본문법 과 정보정리

1. Yocto 관련기본정보  

이전에는 Chip Vendor의 Yocto를 가져다 사용하다보니, Yocto Version에 크게 신경을 쓰지 않았으나,
처음부터 Yocto를 전체 구성하려면 어쩔수 없이 호환성 부터 체크를 해야겠다는 생각이 들어 아래와 같이 정리한다.


1.1 Yocto 의 Version 정보확인 

Yocto의 Main이라고 할 수 있는 Poky의 각각의 Version을 알아보도록하자.
이외 OpenEmbbedded 관련부분도 알아보도록 하자.

  • Yocto Poky Version (Branch) 
 Yocto의 Reference Distro Layer 인 Poky의 version 과  Codename (branch)
CodenameYocto Project VersionRelease DateCurrent VersionSupport LevelPoky VersionBitBake branch
Gatesgarth3.2Oct 2020Dreaming24.01.48
Dunfell3.1April 2020Dev23.01.46
Zeus3.0October 20193.0.2Stable22.01.44
Warrior2.7April 20192.7.3Stable21.01.42
Thud2.6Nov 20182.6.4Community20.01.40
Sumo2.5April 20182.5.3EOL19.01.38
Rocko2.4Oct 20172.4.4EOL18.01.36
Pyro2.3May 20172.3.4EOL17.01.34
Morty2.2Nov 20162.2.4EOL16.01.32
Krogoth2.1Apr 20162.1.3EOL15.01.30
Jethro2.0Nov 20152.0.3EOL14.01.28
Fido1.8Apr 20151.8.2EOL13.01.26
Dizzy1.7Oct 20141.7.3EOL12.01.24
Daisy1.6Apr 20141.6.3EOL11.01.22
Dora1.5Oct 20131.5.4EOL10.01.20
Dylan1.4Apr 20131.4.3*EOL9.01.18
Danny1.3Oct 20121.3.2EOL8.01.16
Denzil1.2Apr 20121.2.2EOL7.01.15
Edison1.1Oct 20111.1.2EOL6.01.13
Bernard1.0Apr 20111.0.2EOL5.01.11

  • Yocto(Poky) Release  관련사항
아래사이트에서 Poky의 Code Name이외 관련정보들을 더 확인가능
  https://wiki.yoctoproject.org/wiki/Releases

  • Yocto(Poky) Branch(version) 와 Tag 파악
Pocky의 Branch 마다 소스구조 및  세부사항확인가능
  https://git.yoctoproject.org/cgit/cgit.cgi/poky/refs/


1.2  Yocto 관련부분 정리한 부분

우선적으로  직접 정리한 부분을 링크 
  • Yocto의 기본정보 와 동작 전체적인 흐름파악 (필요환경설정값 확인)
Yocto에 Reference Manual 기반으로 직접 정리했으며, 전체적인 흐름파악에 필요.
처음에 반드시 동작방식을 알아야함 (중요)
  https://ahyuo79.blogspot.com/2015/10/yocto.html

  • Yocto (Poky) 기반으로 직접 내가 구성한 예 
일반적으로 Chip vendor에서 제공해주는 Yocto 말고 직접 Poky 기반으로 구성
  https://ahyuo79.blogspot.com/2018/02/raspberry-pi-systems-with-yoctohtml.html


1.3  Yocto 관련된 정리된 외부 Manual 

Yocto 관련된 정리되 Manual들을 링크했으며, 처음보기에는  Bootlin의 Manual이 가장 쉽게 잘 정리되어 나와있다.

  • bootlin의 Yocto Reference Manual 
bootlin의 Yocto Manual이 Update가 되었으며 관련부분을 링크 (각 보드에 적용된 부분확인)

TI의 BeagleBone 과 ST의 STM 예제
  https://bootlin.com/training/yocto/
  https://bootlin.com/doc/training/yocto/


  • Yocto의 wiki
Yocto에 관련된 기본질문에 대한 해결방법
  https://wiki.yoctoproject.org/wiki/How_do_I


  • OpenEmbedded Layer의 Recipes 관련검색 
  https://layers.openembedded.org/rrs/recipes/OE-Core/3.1/M4/


  • 다양한 Yocto Recipe 예제 (Xilinx Yocto의 예제)
Xilinx에서 사용하는 Yocto로 다양한 예제를 확인가능
  https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842475/PetaLinux+Yocto+Tips

  • recipe 작성방법 및 user configuration 설정방법
자신의 Recipe 작성 후 이를 user configuration에 등록방법
  https://www.wolfssl.com/docs/yocto-openembedded-recipe-guide/
  https://wiki.yoctoproject.org/wiki/Building_your_own_recipes_from_first_principles

  • recipe 쉽게 작성방법 (recipetool 과 devtool 사용법)
yocto에서 제공하는 recipe 관련 tool을 이용하여 작성법으로, 
주로 recpipetool 과 devtool 사용하지만, 나의 경우는 거의 직접 작성하는게 편하다. 
reciptetool 이용법 
  http://embeddedguruji.blogspot.com/2019/03/yocto-recipetool-tutorial.html



1.4  Yocto 의 공식 Manual 

  • Yocto Project Quick Build 
  https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html

  • Yocto의 Reference Manual
  https://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html

  • Yocto 의 Kernel 관련설정 
  https://www.yoctoproject.org/docs/current/kernel-dev/kernel-dev.html

  • Yocto 의 BSP Manual 
BSP Layer 구성시 다시 한번 확인
  https://www.yoctoproject.org/docs/current/bsp-guide/bsp-guide.html

  • Yocto 의 Bitbake User Manual
bitbake의 기본사용법 및 Recipe의 기본문법도 이곳에서 쉽게파악
  https://www.yoctoproject.org/docs/current/bitbake-user-manual/bitbake-user-manual.html
  https://www.yoctoproject.org/docs/current/bitbake-user-manual/bitbake-user-manual.html#basic-syntax

  • Yocto 관련 Manual 의 Variable 관련내용
아래의 Recipe 작성시 필요한 변수 or 환경값을 이곳에서 찾자
  https://www.yoctoproject.org/docs/3.0/ref-manual/ref-manual.html#ref-variables-glossary
  https://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#ref-variables-glossary


2.  Yocto 의 Recipe/Config 의 기본지식 

Yocto 의 경우 Layer의 config 를 비롯하여 각각의 recipes 및 User Configuration을 수정할 때 거의 동일한 것이 기본적인 환경변수의 Operator 지식이다.
이를 비롯하여 환경변수에 확장되는 Suffix 부분을 비롯하여 OVERRIDE부분을 알아두자.


2.1 Recipe/Config의 기본 Operators

  • Recipe 의 Value에 사용되어지는 Operators 
Value, 즉 환경변수에 적용되어지는 Operator들의 동작방식
  1. '='  expand the value when using the variable,  
  2. ':='  immediately expand the value
  3. "+=" append (with space)    
  4. "=+" prepend (with space)   
  5. ".="  append (without space)
  6. "=."  prepend (without space) 
  7. "?=" assign if no other value was previously assigned, 이전에 할당이 없으면, 기본값
  8. "??=" same as previous, with a lower precedence, 상위와 같지만 우선순위 더 떨어짐

상위 중 거의 쉽게 이해가 가는데, expand 개념만 이해가 가지 않아 예제로 정리

  • expand 와 immediately expand의 이해 
= 와 := expand 이라고 하지만 Variable의 Assign으로 위치만 다를 뿐이다.
내 생각에 주의해야할 것은 recipe를 전체 Parsing할 때 동일한 이름의 변수가 있는 것들이 문제가 될수 있을 것 같다.

ex.1 
   A = "11"
   B = "B:${A}"   # 상위 A의 11을 미적용하고 마지막에 적용된 A로 적용 
   A = "22"      
   C := "C:${A}"
   echo $C   # C:22
   echo $B   # B:22


ex.2    
   T = "123"                          # 현재 값은 가지고 있지만,다시 T가 expand되며 그 값으로 대체 
   A := "${B} ${A} test ${test}"  # 현재위치에서 즉시 expand  
   B = "${T} bval"                    
   T = "456"               
   C = "cval"
   C := "${C}append"           # 이전값에 append를 즉시 추가 

   echo $A   #  test 123      # :=로 즉식 expand 해서 T가 123로 출력
   echo $B   #  456 bval      # 마지막 expand된 값으로 출력 
   echo $C   #  cvalappend    # 즉시 expand로 적용 


expand operator 관련예제
  https://www.yoctoproject.org/pipermail/yocto/2012-March/005640.html
  https://books.google.co.kr/books?id=t9L8AwAAQBAJ&pg=PT123&lpg=PT123&dq=yocto+operators&source=bl&ots=vFEXcnCGEZ&sig=ACfU3U1pVLs35QUeINgp55iD9dU_wJ4XHA&hl=ko&sa=X&ved=2ahUKEwiiv9_m76LoAhWEfd4KHYK2CqIQ6AEwBHoECAkQAQ#v=onepage&q=yocto%20operators&f=false


+=, =+, .= and =. 의 사용은 $BUILDDIR/conf/local.conf 피하라고 하는데, 이유는 Parsing순서문제이다  (세부사항은 bootlin 문서참조 or 아래링크참조)
  https://www.yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#var-IMAGE_INSTALL


2.2  환경변수의 일반 Suffix 기능 

환경변수 or Task function Suffix 의 이름에 각각의 이름이 존재하며, 이부분은 Operator로 동작한다.

  • 환경변수의 Suffix 기능(_preprend/_append/_remove)
  1. IMAGE_INSTALL_prepend: 상위 Operator 기능과 동일(without space) 
  2. IMAGE_INSTALL_append: 상위 Operator 기능과 동일(without space)   
  3. IMAGE_INSTALL_remove: 환경값 삭제 

  • 상위 operator 와 suffix 기능의 우선순위 
ex. 3
A = "1"
A_append = "2"
A_append = "3"
A += "4"
A .= "5"
#  우선 operator 먼저 실행된 후 _append는 나중에 실행됨 
# A 값은 "1 4523" 된다고 한다.


  • Task Function의 Suffix operators
  1. do_configure() { }:  config 설정
  2. do_configure_prepend() { }: do_configure 전에 실행
  3. do_configure_append() { }: do_configure 후에 실행
  4. do_compile() { }: do_compile 부분 실행 
  5. do_install() { }: do_install 부분실행
  6. 이외 생략 

상위 suffix operator를 동작이 안된다고 하며, 상위 보통 operator로 써야한다고 한다.


2.3 OVERRIDES의 기본개념 및 활용 

value에 suffix "_"와 함께 소문자로 확장되어있는 것이 많이 존재하는데, 이부분은 OVERRIDES라는 것을 이용

주의해야할 것은 "-"로 확장되는것하고 다르므로 착각주의해야 할 것 같다

ex.1
# Selecting a Variable , 즉 변수의 선택이 가능 
# OVERRIDES를 이용하여 여러 변수 중 선택이 가능하며 반드시 소문자로만 작성 
OVERRIDES = "arch:os:machine"  # :로 분리되며, arch/os/machine 설정

# TEST_A 의 값이 아래와 같이 3개 존재하면 상위 OVERRIDES를 설정해서 arch or os or machine 중으로 설정 
TEST_A = "testdefault"
TEST_A_os = "testos"  # OVERRIDES로 os 가 존재하므로 이를 설정되며, TEST = TEST_os 와 동일
TEST_A_none = "testnone"

##TEST_A의 값은 "testos" 사용 

# TEST_B의 값 중 arch or os or machine 존재하지 않아서 기본값설정 
TEST_B = "testdefault"
TEST_B_del = "testdel"
TEST_B_none = "testnone"

##TEST_B의 값은 "testdefault" 사용 

# TEST_C의 값 중 os or machine 존재하지만 두개가 선택된 후 최종 마지막 선택된 machine선택 
TEST_C = "testdefault"
TEST_C_os = "testos"
TEST_C_machine = "testmachine"
TEST_C_none = "testnone"

##TEST_C의 값은 "testmachine" 사용 

ex.2
# Appending and Prepending 에 확장 
DEPENDS = "glibc ncurses"
OVERRIDES = "mahcine:local # :로 분리되며, machine/local 설정

#DEPENDS_append 2개 존재하며, OVERRIDES로 machine을 설정했을 경우만 2번째 것은 설정가능 
DEPENDS_append =  "libxxx"     # 상위 DEPENDS 에 libxxx 추가 
DEPENDS_append_machine =  "libmad"  # OVERRIDES에 machine이 있어 동작 
# 최종 DEPENDS 값은 "glibc ncurses libxxx libmad "

OVERRIDES 관련설명  


  • OVERRIDES 의 확장  
MACHINEOVERRIDES 각 MACHINE 기반으로 설정시 변수설정가능

# 주석
MACHINE ?= "arm9"
MACHINEOVERRIDES ?= "${MACHINE}"

SRC_URI = "file://test0.config "
SRC_URI_append = "file://test1.config "
SRC_URI_append_arm9 = "file://test2.config "

# 최종 SRC_URI 값은 "file://test0.config file://test1.config file://test2.config "

FILESOVERRIDES : OVERRIDES의 세부설정이며, FILE에 적용
DISTROOVERRIDES: OVERRIDES의 세부설정이며 DISTRO 기준으로 적용

상위 3개의 OVERRIDES들의 설정은 최종 OVERRIDES에 포함적용되므로 세부적용시에는 상위 OVERRIDES를 사용하자.

3. Configuration 설정 과 Recipe 설정


Yocto의 Configuration은 아래의 Manual을 보면, Distro , Machine , Local 이지만, 각각 사용되는 곳을 보면 약간씩 달라진다.

  1. User Configuration 설정: Build Directory 에 위치하며, 기본으로 두개의 설정 구성 
  2. Distro Configuration 설정: 아래의 Layer Configuration 과 구성되고, 별도로 구성 
  3. Machin Configuration 설정: BSP를 위해서 Layer Configuration 구성되고 별도구성
  4. Layer Configuration 설정: 각 Layer마다 설정되는 기본 Configuration 
  5. Recipe 설정 

Yocto의 Configuration 관련내용
  https://www.yoctoproject.org/docs/2.4/ref-manual/ref-manual.html#ref-varlocality-configuration