yoncho`s blog
2. Bitbake | build tool 본문
Bitbake는 파이썬 및 셸 스크립트 혼합 코드를 분석하는 Task Scheduler, Cross Compile을 위한 패키지(w/빌드툴)이라고 yocto 문서에 적혀있다.
Bitbake는 Poky 내장 빌드 도구가 아닌 단독으로 많은 일을 수행할 수 있는 Tool이다. (그것도 매우 훈륭한 툴)
+ 블로그 기술 포스트 中 Apache Airflow와 비슷한 툴인것 같다.
#목차
1. bitbake source download
2. metadata 정의
3. bitbake basic - "Hello! bitbake world!" 출력 (all in one)
4. 정리
[1] bitbake source download
#bitbake 다운로드
wget http://git.openembedded.org/bitbake/snapshot/bitbake-1.46.0.tar.gz
#압축해제
tar -xzf bitbake-1.46.0.tar.gz
bitbake 버전은 dunfell로 진행하지만 추후에 kirkstone도 다룰 것이다.
다운받아 압축을 해제하면 아래와 같은 디렉터리 구조를 확인할 수 있다.
bitbake-1.46.0/
|--bin/
| |--bitbake
| |--bitbake-diffsings
| |--...
|--conf/
|--doc/
|--...
여기서 bin/ bitbake 실행파일이 우리가 배워야할 핵심이자 중요한 부분이다.
[2] metadata 정의
bitbake에는 metadata가 두종류 있다.
I. 변수
II. 실행 가능한 Task/ Function
실행 가능한 Task/Function은 bitbake가 실행할 수 있는 셸/Python 함수를 가리킨다.
bitbake metadata는 다섯 종류의 파일에서 사용되는데 이 파일들을 metadata file이라 한다.
우리는 metadata file을 줄여 metadata라고 하겠다.
*bitbake metadata file 구성
I. 환경설정파일 (.conf) - metadata 中 변수만 접근
II. 레시피파일 (.bb) - metadata 모두 접근
III. 클래스파일 (.bbclass) - metadata 모두 접근
IV. 레시피확장파일 (.bbappend) - metadata 모두 접근
V. 인클루드파일 (.inc) - metadata 모두 접근
- 환경설정파일 : 변수(전역) 집합
- 레시피파일 : s/w 다운로드/빌드 방식/ 설치 경로 등 빌드 전반 내용을 기술, bitbake가 실행할 수 있는 함수 정의
- 클래스파일 : 빌드에 사용되는 기능들을 추상화해 레시피파일(*inherit사용)이 사용할 수 있게 도움
- 레시피확장파일 : 레시피파일 변수/ Task 재정의
- 인클루드파일 : 공식내용을 공유하는 클래스파일과 다르게 비공식내용을 공유할 때 사용
[3]. bitbake basic - "Hello! bitbake world!" 출력
위 그림은 bitbake가 메타데이터를 분석하는 과정이다.
bitbake는 여러 환경구성파일을 분석해 필요한 정보들을 기반으로 Task의 Scheduling을 관리 및 실행한다.
I. bitbake 문법
변수에 대한 타입이 없고, 모든 값은 문자열(String)으로 인식한다.
변수명은 대문자로 시작하며 ""(큰따옴표)/ ''(작은따옴표)로 값을 지정한다.
BITBAKE_VAR = "value"
II. bitbake 환경변수 등록
대부분의 외부 패키지를 사용할 때 필요한 과정으로 bitbake 또한 환경변수를 등록해줘야한다.
bin/ 까지 해준 이유는 앞서 말했다시피 bitbake 실행파일이 bin/ 에 있기 때문이다.
#환경변수 추가
export PATH=/home/yoncho/bitbake-1.46.0/bin:$PATH
#환경변수 적용
source ~/.bashrc
정상적으로 환경변수가 추가되면 아래와 같이 버전표시가 되어야한다.
bitbake --version
#결과
Bitbake Build Tool Core version 1.46.0
III. "Hello! bitbake world!"출력을 위한 _번째 단계 : 작업 디렉터리 생성
mkdir bitbake_test/
IV. "Hello! bitbake world!"출력을 위한 첫 번째 단계 : BBPATH 설정하기
bitbake 실행 파일이 metadata를 인식할 수 있게 해주려면 bibake metadata 경로를 알려줘야한다. bitbake가 인식하는 metadata경로는 BBPATH이다.
export BBPATH=/home/yoncho/bitbake_test/
bitbake는 실행 시 BBPATH 경로 아래 conf/ 디렉터리에서 .conf 파일과 classes/ 디렉터리에서 .bbclass 파일을 찾는다.
V. "Hello! bitbake world!"출력을 위한 두 번째 단계 : bitbake.conf 파일 만들기
** bitbake는 bitbake.conf 파일로 기본적인 환경 설정을 진행한다. bitbake는 한번에 결과물이 만들어지는게 아니라
중간중간 산출물을 만들어낸다. 각 단계별 산출물 저장 경로를 bitbake에게 알려주는 역할을 하며 추가로 빌드 과정에서 필요한 변수를 설정한다.**
작업 디렉터리에 conf/ 디렉터리를 생성한다.
mkdir bitbake_test/conf/
해당 경로는 bitbake가 conf파일들을 읽는 경로이다. (자동으로 인식)
bitbake.conf 파일 작업
PN = "${bb.parse.vars-from_file(d.getVar('FILE', False), d)[0]}"
TMPDIR = "${TOPDIR}/tmp"
CACHE = "${TMPDIR}/cache"
STAMP = "${TMPDIR}/${PN}/stamps"
T = "${TMPDIR}/${PN}/work"
B = "${TMPDIR}/${PN}"
PN : Package Name의 줄인 말이다. 레시피 파일의 이름이 저장된다. 아래 과정에서 보면 hello.bb 레시피 파일을 만들기 때문에 우리는 hello값을 할당하면 된다.
TMPDIR : 빌드 과정 중 나오는 산출물들을 저장하는 경로
CACHE : metadata를 분석 후 결과를 캐시에 저장한다. metadata변경이 없는 한 해당 캐시를 읽고 사용한다.
STAMP : bitbake는 Task 수행이 완료되면 stamp 파일을 생성한다. 이 파일은 bitbake가 Task실행이 필요한지 결정하는데 사용한다. 산출물을 확인해보면 stamps.<task name>이 있다.
T : bitbake 레시피 빌드 시, 임시적으로 생성되는 파일(태스크 실행 로그/ 태스크 스크립트 등)을 위한 임시 파일 저장경로이다.
B : bitbake 레시피 빌드 과정에서 함수 실행 디렉터리를 가리킨다. bitbake는 B 변수로 특정 레시피 빌드 과정이 진행되는 디렉터리를 지정할 수 있다. 여기에 임시파일/ 중간 산출물/ 결과물 등이 저장된다.
VI. "Hello! bitbake world!"출력을 위한 세 번째 단계 : bblayers.conf 파일 만들기
**bitbake 수행 시 제일 먼저 찾는 파일이 bblayers.conf 파일이다. BBPATH 변수에 저장된 경로 아래에서 conf/ 디렉터리를 찾고 그 아래 bblayers.conf 파일을 찾는다. bblayers.conf는 bitbake에게 빌드 수행을 위한 레이어(연관 metadata 저장 위치 - 실행 방식) 정보를 알려준다.**
bblayers.conf 이름만 봐도 bitbake의 layer들을 설정하는 파일인것 같다!
bblayers.conf는 bitbake_test/ 디렉터리 내 mylayer/라는 디렉터리를 생성하고 그 하위에 만들겠다.
먼저, mylayer/ 디렉터리를 생성한다.
mkdir bitbake_test/mylayer/
그리고 두번째 단계에서 생성한 bitbake_test/conf/ 디렉터리 내에 bblayers.conf 작업
BBLAYERS ?= " \
/home/yoncho/bitbake_test/mylayer \
"
**BBLAYERS : metadata 위치하는 레이어 디렉터리 정보를 저장한다.**
여기서 '\'는 개행문자로 인식된다.
VII. "Hello! bitbake world!"출력을 위한 네 번째 단계 : layer.conf 파일 만들기
**bitbake가 bblayers.conf를 통해 레이어 경로를 알아냈으면 그 다음 각 레이어 디렉터리 하위에 conf/ 디렉터리를 찾는다.
그리고 그 아래 layer.conf 파일을 찾는다. 여기서 layer.conf 파일은 해당 레이어 경로 및 레이어 내에 있는 레시피파일(.bb/.bbappend) 경로를 알려준다.**
layer.conf는 세번째 단계에서 만든 bitbake_test/mylayer/ 디렉터리 아래 conf/ 디렉터리를 생성하고 그 안에 작업해야한다.
먼저, conf/ 디렉터리를 생성한다.
mkdir bitbake_test/mylayer/conf/
그 다음에 layer.conf 작업
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/*.bb}"
BBFILE_COLLECTIONS += "mylayer"
BBFILE_PATTERN_mylayer := "^${LAYERDIR}/"
BBPATH : layer.conf파일 포함하는 레이어의 경로를 포함, 해당 경로 밑에서 클래스(.bbclass)파일과 conf/디렉터리 아래 환경설정(.conf)파일을 찾는다. LAYERDIR은 mylayer/의 절대 경로이다.
BBFILES : 레시피(확장) 파일 위치 경로를 저장한다.
BBFILES_COLLECTIONS : layer.conf 파일을 포함하고있는 레이어의 이름을 저장한다. 여기선 mylayer가 저장된다.
BBFILE_PATTERN_mylayer : BBFILE_PATTERN_<layer name>는 bitbake가 실행되면서 분석을 하는데 레이어별 분석을 위해 추후 <layer name>에 속한 레시피 결과만 보기위해 사용한다.
VIII. "Hello! bitbake world!"출력을 위한 다섯 번째 단계 : base.bbclass 파일 만들기
bitbake에서 base.bbclass는 기본적으로 존재해야한다.
base.bbclass는 bitbake_test/ 디렉터리 아래 classes/ 디렉터리를 생성하고 그 안에 작업해야한다.
먼저, classes/ 디렉터리를 생성한다.
mkdir bitbake_test/classes/
그 다음에 base.bbclass 작업
addtask do_build
IX. "Hello! bitbake world!"출력을 위한 여섯 번째 단계 : hello.bb 파일 만들기
**base.bbclass 내용을 보면 "addtask do_build"에서 addtask는 bitbake에 Task를 추가하는 명령어이고 뒤에 do_build는 hello.bb에 정의된 함수(Task)이름이다.**
hello.bb는 mylayer/ 디렉터리 아래 작업한다.
DESCRIPTION = "Example: Hello World"
PN = "hello"
PV = "1"
python do_build(){
bb.warn("Hello! bitbake world!")
}
PN : Package Name으로 레시피 파일 내 할당하지 않을 시 기본적으로 파일 이름을 PN으로 인식한다.
PV : Package Version으로 내용 업데이트로 별도 버저닝이 필요할 시 부여한다.
레시피 파일 이름 규칭은 아래와 같다.
<package_name>_<package_version>_<package_reversion>.bb
X. "Hello! bitbake world!"출력을 위한 일곱 번째 단계 : 실행하기
앞 단계들을 통해 간단한 bitbake sample 작업을 했다.
결과를 보기 위해 아래 명령어를 실행해보자.
bitbake hello -f
#결과
WARNING: Layer mylayer should set LAYERSERIES_COMPAT_mylayer in its conf/layer.conf file to list the core layer names it is compatible with.
WARNING: Layer mylayer should set LAYERSERIES_COMPAT_mylayer in its conf/layer.conf file to list the core layer names it is compatible with.
Parsing recipes: 100% |#############################################################################################| Time: 0:00:00
Parsing of 1 .bb files complete (0 cached, 1 parsed). 1 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |##########################################################################################| Time: 0:00:00
NOTE: No setscene tasks
NOTE: Executing Tasks
WARNING: None do_build: Hello! bitbake world!
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.
Summary: There were 3 WARNING messages shown.
참고 : bitbake 레시피 파일 실행 명령어
#bitbake 실행
bitbake <recipe file name>
bitbake <recipe file name> -C <task name>
#bitbake 강제 실행
bitbake <recipe file name> -f
bitbake <recipe file name> -C <task name> -f
XI. "Hello! bitbake world!"출력을 위한 여덟 번째 단계 : Bitbake Sample 전체 분석
bitbake_test/
|--conf/
| |--bitbake.conf
| |--bblayers.conf
|--classes/
| |--base.bbclass
|--mylayer/
|--conf/
| |--layer.conf
|--hello.bb
bitbake 실행 절차
(1) BBPATH경로 아래 conf/ 디렉터리에서 bblayer.conf 환경 설정파일을 찾는다.
(2) bblayer.conf로 부터 어떤 layer들이 존재하는지 파악한 뒤 각 layer별 디렉터리 아래에서 conf/디렉터리 내 layer.conf 파일을 찾는다.
(3) layer별 layer.conf를 통해 BBFILES 변수를 통해 레시피(.bb) 경로를 파악한다. 여기서 LAYERDIR은 레이어의 최상위 경로를 의미한다.
(4) BBPATH 경로 아래 conf/ 디렉터리에서 bitbake.conf 환경 설정파일을 찾고 그 안에서 여러 변수들을 확인한다.
(5) BBPATH 경로 아래 classes/ 디렉터리에서 클래프파일(.bbclass)을 찾고 분서 및 배치한다. 참고로 base.bbclass는 필수로 존재해야한다.
(6) 분석한 메타데이터 기반으로 레시피 파일을 분석 후 Task간의 체인(Flow) 정보로 Task를 순차적으로 실행한다.
XII. addtask 지시어로 Task 체인 정의
bitbake addtask지시어는 Task를 추가하는 지시어 before, after 지시어로 Task간 실행 순서를 지정할 수 있다.
DESCRIPTION = "Example: Bitbake addtask + cmd"
PN = "hello"
PV = "1"
python do_end_build(){
bb.warn("end!")
}
addtask do_end_build
python do_start_build(){
bb.warn("start")
}
addtask start_build before do_end_build
python do_mid_build(){
bb.warn("mid")
}
addtask mid_build after do_start_build before do_end_build
#Task 순서
do_start_build >> do_mid_build >> do_end_build
#결과
WARNING: None do_start_build: start
WARNING: None do_mid_build: mid
WARNING: None do_end_build: end!
[4] 정리
bitbake는 python과 script로 만들어진 Task Scheduler로 metadata에 정의된 Task를 실행한다.
bitbake가 metadata를 분석하는 순서는 아래와 같으며
bitbake는 작업 순서가 정리되어있는 설명서를 보고 조립하는 사람이라 생각하면 편하다.
여기서 설명서는 metadata인 것이다.
bitbake는 강력한 툴이다.
metadata를 분석하고 Task를 scheduling 한다..!
'기술, 나의 공부를 공유합니다. > [Vehicle] Yocto' 카테고리의 다른 글
5. Custom Layer | 레이어 생성을 위해 필요한 과정 (1) | 2024.06.23 |
---|---|
4. Premirrors & Shared State Cache | for 빌드 속도 개선 (0) | 2024.06.20 |
3. Poky | bitbake + oe-core (0) | 2024.06.17 |
1. Yocto | ? (0) | 2024.06.16 |
0. Yocto | start (0) | 2024.06.16 |