메타데이터 사용
Configuration(.conf) : 환경설정 파일은 전역으로 영향을 미치는 파일로 classes와 레시피의 동작을 위한 정보를 제공한다.
Classes(.bbclass ) : classes는 전체 시스템에서 이용할 수 있고 쉬운 유지보수와 코드 중복을 피하기 위해 레시피에 의해 상속될 수 있다.
Recipes(.bb .bbappend) : 레시피와 클래스는 파이썬과 셸 스크립트 코드가 혼합되어 작성된다.
메타데이터 작업
비트 베이크의 환경 변수 옵션을 사용하면 각 변수의 값을 확인할 수 있다.
$: bitbake -e <recipe> | grep <variable>
기본 변수 설정
FOO = "bar"
변수 FOO값은 bar이다.
변수 확장
비트베이크는 변수참조를 지원한다. 문법은 거의 셸 스크립트와 같다.
A = "aval"
B = "pre${A}post"
B는 preavalpost의 결과를 갖는다. 한가지 명심해야될 점은 실제 사용될 시점에 변수 확장이 실행된다.
?=를 사용한 기본 값 설정
기본값을 제공할 필요가 있을 때 연산자 ?=이 사용될 수 있다.
A ?= "aval"
??를 사용한 기본값 설정
기본값을 제공하기 위한 또 다른 방법은 ??= 연산자를 사용하는 것이다. ??=을 가지면 파싱절차가 끝날때까지 적용되지 않는다.
즉시 변수 적용
변수를 바로 적용할 필요성이 있을 때 := 연산자를 사용한다.
앞뒤 추가
앞 뒤 추가 연산자 두가지를 제공한다. += 와 =+ 이다.
조건을 가진 메타데이터 집합
비트베이크는 조건을 가진 메타데이터 설정을 매우 쉬운 방법으로 제공한다. Overrides를 호출함으로써 메커니즘이 완성된다.
조건적 추가
비트베이크는 overrides에 있는 어떤 값을 기반으로 변수의 앞/뒤에 추가하는 것을 지원한다.
파일 포함
비트베이크는 파일을 포함하기 위한 두가지 방법을 제공한다.
Include를 사용하면 비트베이크는 그 위치에 있는 파일을 추가하는 것을 시도한다. 추가 라인에서 특정 경로가 상대 경로이면 비트메이크는 bbpath내에서 찾을 수 있는 첫번째 것을 포함시킨다. 참조된 파일을 찾을 수 없어도 파싱이 실패되지 않는다.
Required에서 required된 파일을 찾을 수 djqtedmaus PARSEERROR를 보여준다. 이외의 다른 모든 관점에서 required는 include를 사용하는 것과 같다.
파이썬 변수 설정
비트베이크는 다음 문법을 사용함으로써 변수 설정 시 쉽게 파이썬 코드를 사용할 수 있다.
VARIABLE = "${<python-command>}"
실행가능한 메타데이터 정의
메타데이터 레시피(.bb)와 클래스(.bbclass) 파일들은 다음과 같이 셸 스크립트를 이용하여 만들 수 있다.
Do_mytask(){
Echo "hello, world
}
변수가 실행가능한 셸코드가 되는 것을 제외하고는 변수를 설정하는 것과 동일하다. 셸 스크립트를 작설할 때 bash또는 zsh와 같이 셸에 특화된 코드를 사용하지 않도록 주의해야 한다. 확신이 안선다면 테스트 하기 위해서 dash 셸을 사용하는 것이 안전하다.
전역 네임스페이스에서 파이썬 함수 정의
변수나 또 다른 사요을 위한 값을 만들어 내기 위해 파이썬 함수를 사용할 필요가 있다. 보통 파이썬 함수를 작성할 떄 비트베이크 데이베이스에 접근할 필요가 있다. 모든 메타데이터 사이에 규약은 d변수가 비트베이크의 데이터베이스를 가리키는데 사용하는 것이다.
상속시스템
InHerit은 레시피에서 클래스를 사용하는 방법이다. 그것은 상속의 가장 기본적인 형식이다. Autoconf와 automake와 관련된 작업을 쉽게 추상화시킬수 있고 그것을 레시피에서 사용하기 위해 .bbclass에 넣을 수 있다. 가장 흔히 사용되는 autoconf 또는 automake 기반의 프로젝트들을 쉽게 작업을 하기 위해 기본적으로 제공하도록 비트베이크는 autotools.bbclass를 상속받도록 가리킨다.
소프트웨어 개발키트
소프트웨어 개발 키트는 개발과 디버깅을 하기 위한 파일과 툴의 모음이다. 툴은 검파일러, 링커, 디버거, 외부 라이브러리 헤더를 포함하고 특정 유틸리티나 애플리케이션들을 포함할 수 도 있다. 보통 이러한 프로그래밍 툴을 툴체인이라 부른다. 포키가 비트베이크를 이용해 태스크들을 실행할 때 타깃을 위한 바이너리를 컴파일하고 링크하기 위해 툴체인이 필요하다. 이 툴은 빌드 시스템 내부에서 사용되기 떄문에 내부 툴체인이라 불린다. 이 툴은 외부용으로 준비되지 않아 외부용으로 사용되면 안되지만, 특수한 경우에는 그 용도로 사용할 수도 있다.
포키 SDK 이용
포키 환경을 이용해 외부에서 사용할 수 있는 툴체인을 만들 수 있따. 포키는 포키가 설치된 환경과 독립적인 컴퓨터에 설치될 수 있는 SDK 패키지를 만들어낸다. 추가로 설치된 툴체인은 내부 툴체인과 호환 가능하다. sdk는 우리의 목적에 맞게 헤더와 라이브러리 파일들을 제공할 수도 있다.
이미지 기반 SDK 이용
이미지 기반의 SDK를 만들기 위해 다음 명령어를 실행한다.
$: bitbake core-image-full-cmdline -c populate_sdk
생성된 스크립트는 사용하기 전에 설치되어야 한다.
범용적 SDK : meta-toolchain
SDK를 만드는 다른 방법은 크로스 컴파일러, 디버그 툴, 기본 헤더와 라이브러리를 포함하는 범용적 SDK를 만드는 것이다. 이를 meta-toolchain이라 부르고, 보통 커널과 부트로더의 개발과 디버그를 위해 이용된다.
$: bitbake meta-toolchain
SDK 이용
커스텀 애플리케이션을 빌드하기 위해 SDK를 사용해본다. Hello-world.c를 예로들어 arm 아키텍처를 타깃으로 빌드할 수 있다.
$: source /opt/poky/1.6/environment-setup-armv5te-poky-linux-gnueabi
{CC} hello-world.c -o hello-world
생성된바이너리가 원하는 타깃 아키텍처에 맞게 생성됐는지 확인하려면 다음과 같이 file 유틸리티를 사용한다.
File hello-world
일반적으로 이용되는 또 다른 프로젝트는 리눅스 커널이다. 리눅스 커널은 링킹을 위해 ld 유틸리티를 이용하기 떄문에 gcc를 사용할 떄 디폴드 옵션으로 정의되는 ldflags 변수를 unset할 필요가 있다. 리눅스 커널 소스 코드를 빌드하려면 다음 명령어들을 이용한다.
$: source /opt/poky/1.6/environment-setup-armv5te-poky-linux-gnueabi
Unset ldflags
Make defconfig
Make uimage
타깃에서 애플리케이션 개발
타깃에서 개발하기 위한 첫 번째 방법은 외부 툴체인을 이용해 개발 이미지를 만드는 것이다. 이 이미지는 헤더 파일들과 라이브러리 링크들로 구성된다. 이 이미지는 커스텀 애플리케이션을 위한 빌드 환경을 제공하고 커스텀 툴체인이나 욕토 프로젝트 외부 툴체인과 함께 사용될 수도 있다. 개발 비드 대신 네이티브 빌드를 해야하는 경우, 포키 환경설정을 통해 sdk이미지를 만들수 있다. 이 이미지는 툴체인과 개발용 패키지를 포함하고 있다. 즉 이를 이용하여 실제 환경에서 커스텀 애플리케이션을 빌드, 실행, 테스트, 디버깅할 수 있다는 의미이다.
이클립스와 통합
이클립스는 커스텀 애플리케이션 개발과 디버깅에 매우 널리 쓰이고 있는 강력한 ide다. 이클립스를 포키 sdk를 이용하게 설정할 수 있다. 지원 가능한 이클립스 버전과 어떻게 설정하는지는 욕토 프로젝트 개발 매뉴얼에 나와 있다. 또한 욕토 프로젝트 dt와 범용적 툴체인에 기반을 둔 이미지도 포함되어 있다. 또한, 이클립스와 타깃을 이더넷으로 연결하여 생성된 바이너리를 배포할 수 도 있다. 바이너리 파일들과 필요한 아티팩트를 타깃 루트 파일 시스템에 복사하고 전송 이후 바로 사용할 수 있다.
'SW > Yocto' 카테고리의 다른 글
yocto GPL 규정 준수와 커스텀 임베디드 리눅스 부팅에 대해 알아볼까요? (0) | 2018.12.14 |
---|---|
yocto 프로젝트 디버깅과 외부 레이어에 대해 알아볼까요? (0) | 2018.12.12 |
yocto의 임시 빌드 폴더와 패키지 지원 고찰에 대해 알아볼까요? (0) | 2018.12.10 |
yocto hob와 비트베이크 툴에 대해 알아볼까요? (0) | 2018.12.09 |
yocto와 poky에 대해 알아볼까요? (0) | 2018.12.08 |