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 : 루트파일시스템만 빌드
팁
- 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'
|
참고:
BitBake User Manual: https://www.yoctoproject.org/docs/1.6/bitbake-user-manual/bitbake-user-manual.html
Sama5d3xek guide: http://www.at91.com/linux4sam/bin/view/Linux4SAM/Sama5d3xekMainPage