2017년 8월 30일 수요일

yocto

poky는 빌드시스템 템플릿이다. 빌드는 bitbake를 통해 진행되며 이것은 make와 비슷한 역할을 담당한다. bitbake는 메타데이터라는 빌드설정에 따라 빌드를 수행한다. poky는 재사용되는 이런 빌드설정파일을 모아둔 빌드템플릿으로 보면된다.

poky 다운로드

$ git clone git://git.yoctoproject.org/pok
$ git clone git://git.openembedded.org/meta-openembedded
$ git clone git://code.qt.io/yocto/meta-qt5.git

빌드환경 구성 스크립트

poky 에서 제공되는 스크립트로 빌드환경을 설정한다. 실행시 지정한 빌드디렉토리를 생성하고 bitbake 경로 설정등을 수행한다.
$ cd poky
$ source oe-init-build-env [build-directory]


빌드를 위한 설정파일은 *.conf, *.bb, *.bbclass 세가지가 있다. 이 파일들을 메타데이터라 한다. bitbake는 빌드시 이 세가지 파일을 분석완료 한 후 빌드에 필요한 모든 일을 수행한다.

빌드 환경설정파일

환경설정파일은 *.conf 형식이며, 빌드시 전역적으로 적용된다.

/build/conf/bblayers.conf

“bitbake core-image-minimal “ 과 같이 이미지 빌드 명령을 주면 이 파일을 가장 먼저 파싱한다.
아래처럼 BBLAYERS에 */conf/layer.conf가 있는 디렉토리를 등록한다.
BBLAYERS ?= " poky/meta /poky/meta-poky /meta-qt5 … “

/meta-xx/conf/layer.conf

아래처럼 레시피파일(*.bb, *.bbappend)이 위치를 등록한다. 등록되지 않은 경로의 레시피는 포함되지 않는다.
BBFILES += "${LAYERDIR}/recipes*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend"

/meta-xx/conf/machine/machine-name.conf

아래와 같이 보드와 관련된 빌드 변수가 설정된다.

MACHINE_FEATURES = "kernel26 apm alsa ext2 ext3 usbhost ..”
KERNEL_DEVICETREE = "sama5d31ek.dtb …”

/meta-xx/conf/distro/distro-name.conf

기본으로 적용되는 빌드정책을 설정한다.

DISTRO = "poky-atmel"
# Because there is no opengl, some qt packages are empty
ALLOW_EMPTY_qt3d-mkspecs = "1"
...

/build/conf/local.conf
oe-init-build-env 스크립트를 수행하면 local.conf가 자동으로 생성된다. 필요에 따라 이파일을 수정하면 된다.
이 파일을 수정하여 빌드타겟, 크로스컴파일러, CFLAG세팅 등 필요한 빌드설정을 변경할 수 있다.
이 파일을 통해 메타데이터의 설정을 추가하거나 덮어쓸 수 있다.

아래 경로에 등록된 보드이름을 MACHINE변수에 설정한다.
/meta-name/conf/machine/*.conf

아래 경로에 등록된 정책을 DISTRO변수에 설정한다.
/meta-name/conf/distro/*.conf

HOB

hob는 GUI를 통해 local.conf를 설정하고 빌드하여 이미지까지 생성할 수있다.
oe-init-build-env 수행후 hob을 실행하면 직관적인 GUI가 뜬다.

레시피

레시피(*.bb)는 빌드 태스크 단위로 하나의 레시피에서 하나의 패키지가 생성된다고 보면된다.(여러개의 패키지도 가능)
파일형식: <package-name>_<version>.bb
예:  busybox_1.21.1.bb
이 파일에서 소스다운, 패치적용, 의존성 관계, 컴파일, 인스톨 등을 설정한다.
패키지의 형태(RPM, DEB, IPK,TAR)는 build/conf/local.conf 에서 PACKAGE_CLASSES 에 설정한다.

이미지 레시피

이미지 빌드 레시피는 루트파일시스템을 빌드하기위한 레시피로  images디렉토리에 존재한다. find 명령어로 images 디렉토리를 검색하면 빌드가능한 이미지 레시피를 확인할 수 있다.

의존성

특정 레시피를 빌드하기 위해 필요한 것을 말한다.  DEPENDS는 빌드시 필요한 설정을 하고 RDEPENDS는 런타임에 필요한 설정을 한다. 설정값은 PROVIDES이름이다.
ffmpeg_3.1.3.bb의 의존성: DEPENDS = "alsa-lib zlib libogg yasm-native"

PROVIDES는 이름_버젼.bb 에서 레시피 이름이거나 레시피 내부에서 PROVIDES로 직접 설정한 이름이 이다.
예를 들어 ffmpeg의 DEPENDS에 등록된 alsa-lib는 meta/recipes-multimedia/alsa/alsa-lib_1.1.2.bb 에 의존한다.
bitbake는 DEPENDS와 PROVIDES를 분석하여 빌드 순서를 정하게 된다.

PREFERRED_PROVIDER는 PREFERRED_PROVIDER_xxx 형식의 변수로 여러개의 PROVIDE

각종 변수



PR : Package Revision
PN: Package Name
PV: Package Version
P   : Package : "${PN}-${PV}"
PF : Package full name : "${PN}-${PV}-${PR}"
S : Unpacked source code directory - 압축해제, 패치, 컴파일이 진행되는 디렉토리
D: Destination directory: 패키지 설치 디렉토리


각 레시피의 태스크

아래의 명령으로 각 레시피를 통해 수행 가능한 태스크를 확인 할 수 있다.
  > bitbake u-boot -c listtasks
  > bitbake linux-at91 -c listtasks  
  > bitbake core-image-full-cmdline -c listtasks
  > bitbake core-image-full-cmdline -c rootfs : 루트파일시스템만 빌드  




  1. http://www.at91.com/linux4sam/bin/view/Linux4SAM/Sama5d3xekMainPage 빌드 가이드를 따라하다 보면
    QtWayland 에러가 발생할 수도 있다. 관련버그는 최종 에서 해결되었으므로 아래 버젼으로 빌드를 진행해야 한다.
    솔루션: https://codereview.qt-project.org/#/c/187132/
    cd meta-qt5 &&  git checkout -b b5.8 remotes/origin/5.8

    빌드 에러메시지:
| rm -f libQt5WaylandCompositor.so.5.8.0 libQt5WaylandCompositor.so libQt5WaylandCompositor.so.5 libQt5WaylandCompositor.so.5.8
| linking ../../lib/libQt5WaylandCompositor.so.5.8.0
| /usr/src/debug/qtwayland/5.8.0+gitAUTOINC+0e2a950895-r0/git/src/shared/qwaylandxkb.cpp:297: error: undefined reference to 'xkb_keysym_to_utf32'
| /usr/src/debug/qtwayland/5.8.0+gitAUTOINC+0e2a950895-r0/git/src/shared/qwaylandxkb.cpp:337: error: undefined reference to 'xkb_state_mod_name_is_active'
| /usr/src/debug/qtwayland/5.8.0+gitAUTOINC+0e2a950895-r0/git/src/shared/qwaylandxkb.cpp:339: error: undefined reference to 'xkb_state_mod_name_is_active'
| /usr/src/debug/qtwayland/5.8.0+gitAUTOINC+0e2a950895-r0/git/src/shared/qwaylandxkb.cpp:341: error: undefined reference to 'xkb_state_mod_name_is_active'
| /usr/src/debug/qtwayland/5.8.0+gitAUTOINC+0e2a950895-r0/git/src/shared/qwaylandxkb.cpp:343: error: undefined reference to 'xkb_state_mod_name_is_active'



참고: