BuildRoot 사용법 요약
Buildroot는 uClibc 개발자들이 uClibc를 테스트하기 위해 작은 임베디드 리눅스 시스템을 빌드할 수 있도록 만든 도구 cross compile을 사용하여 임베디드 시스템을 위한 리눅스 시스템을 빌드하는 과정을 단순화하고 자동화하는 도구이다. Buildroot는 cross compile toolchain, root file system, linux kernel image, bootloader를 생성할 수 있다.
또한 옵션을 통해 독립적으로 사용가능하여 이미 존재하는 툴체인을 사용하고 buildroot를 통해 root file system만 빌드할 수 있다.
buildroot 는 특히 임베디드 분야에서 유용하다. 임베디드 시스템은 일반적인 x86 processor가 아닌 PowerPC, MIPS, ARM 과 같은 프로세서를 주로 사용하는데 buildroot 는 다양한 프로세서와 그 변형을 지원하고 여러 상용 보드를 위한 기본 구성도 제공한다.
buildroot는 kernel, bootloader 뿐만아니라, 1000여개가 넘는 각종 application을 자동으로 빌드하여 사용자가 원하는 root file system을 자동으로 생성시켜주는 tool로써 yocto project와 더불어 최근 가장 널리 사용되는 build system 중 하나이다.
임베디드 리눅스 시스템을 개발할 때 선택 사항
1. 미리 빌드된 바이너리 배포판을 사용(Debian, Redhat..)
-> 빠르게 설정가능하지만 유연성이 떨어짐
2. 모든 시스템 구성요소를 수동으로 빌드
-> 유연하지만 비효율적: 복잡한 cross compile 문제를 다뤄야하고 패키지 간의 의존성을 이해해야함
3. 전체 시스템을 소스에서 자동으로 빌드하는 빌드 시스템 사용
-> 자동화되어있고 유연하며 대부분의 cross compile 문제를 해결
-> 예시: Buildroot, OpenWRT, PTXdist, OpenBricks, OpenEmbedded, Yocto 등
Buildroot 특징
1. kconfig(구성 인터페이스 및 언어), make(빌드 로직) 같은 잘 알려진 기술 기반
2. 필요한 것만 빌드하기 때문에 빠름(busybox만 포함된 기본 시스템은 외부 툴체인을 사용해 빌드하는데 3분도 채 걸리지 않음)
3. 작은 규모의 중간 임베디드 시스템에 적합: runtime package 관리 시스템(dpkg, rpm) 이 없으며 종종 전체 재빌드가 필요함.
Buildroot 설치 및 설정 예시
$ wget http://buildroot.org/downloads/buildroot-2012.05.tar.bz2
$ tar xjf buildroot-2012.05.tar.bz2
$ cd buildroot-2012.05
$ make [menu|x|n|g]config
Target Architecture
buildroot는 target architecture를 설정할 수 있다.
- 타겟 아키텍처: ARM, x86, PowerPC, MIPS 등. Buildroot는 uClibc 지원 덕분에 MMU가 없는 Blackfin이나 곧 지원될 Microblaze 같은 아키텍처도 지원한다.
- 타겟 아키텍처의 변형: 예를 들어 ARM926 또는 Cortex-A8. 이를 통해 gcc에 적절한 -mcpu, -march, -mtune 인수를 자동으로 추가할 수 있다.
- 타겟 아키텍처의 ABI
Build Option
- 다운로드 디렉토리:
- 빌드에서 사용되는 tarball을 저장하는 디렉토리.
- 기본값은 $(TOPDIR)/dl이며, BUILDROOT_DL_DIR 환경 변수를 사용해 재정의할 수 있다.
- 호스트 디렉토리:
- 툴체인과 그에 필요한 유틸리티가 설치되는 디렉토리.
- 기본값은 $(O)/host
- 병렬 작업 수:
- Buildroot는 여러 컴포넌트를 순차적으로 빌드하지만, make -j 옵션을 사용하여 각 컴포넌트를 병렬로 컴파일한다.
- 그 외 옵션: 디버깅 심볼 포함 빌드, 타겟에 개발 문서 설치, 타겟에 개발 파일 설치 등.
ToolChain
Toolchain 설정을 변경할 수 있다. uClibc, glibc 등에 대한 선택도 가능하다.
Buildroot는 세 가지 툴체인 백엔드를 제공한다.
- 내부 Buildroot 툴체인 백엔드:
- Buildroot가 uClibc 툴체인을 직접 빌드하고 이를 사용하여 모든 패키지를 크로스 컴파일한다.
- 외부 툴체인 백엔드:
- 기존에 빌드된 uClibc, glibc 또는 eglibc 툴체인을 사용할 수 있다. 외부 툴체인을 사용하면 툴체인 빌드 시간이 줄어든다.
- Crosstool-NG 백엔드: Buildroot가 Crosstool-NG를 사용하여 크로스 컴파일 툴체인을 빌드한다.
System Configuration
- /dev 관리 솔루션:
- static, where device nodes are created statically at build time
- according to a device table
- devtmpfs
- devtmpfs + BusyBox’ mdev
- devtmpfs + udev
- serial port for the console
- 빌드 후 스크립트 위치: 모든 패키지가 빌드된 후, 파일 시스템 이미지가 생성되기 전에 실행
- Some various other parameters (hostname, etc.)
Packages
Buildroot는 임베디드 시스템에서 일반적으로 사용되는 750개 이상의 오픈 소스 컴포넌트를 선택할 수 있다
- 오디오 및 멀티미디어: gstreamer, mplayer, pulseaudio, 다양한 코덱 라이브러리, alsa 등
- 그래픽스: 전체 X.org 스택, Gtk, Qt, EFL, DirectFB, SDL 등
- 시스템 도구, 파일 시스템 유틸리티, 하드웨어 유틸리티 및 라이브러리
- 네트워킹 애플리케이션: dropbear, avahi, bluez, samba, pppd, connman 등
- 개발 및 디버깅 도구: oprofile, lttng 등
- 스크립트 언어: Python, PHP, Ruby, Perl
File System Image
Buildroot는 다양한 형식의 파일 시스템 이미지를 생성할 수 있다
- tar, cpio, ext2, jffs2, ubi/ubifs, cramfs, cloop, iso9660, squashfs, initramfs
Kernel 및 Bootloader
Buildroot는 Linux 커널 빌드 프로세스를 자동화한다. defconfig 또는 지정된 구성 파일을 사용하여 커널을 빌드하며, 커널 모듈을 루트 파일 시스템에 설치한다.
또한 Xenomai 또는 RTAI와 같은 실시간 확장을 위한 커널 패치를 적용할 수 있다.
Buildroot 를 이용한 빌드 방법
Buildroot을 사용하려면 먼저 설정 파일 .config를 정의하고 저장한 뒤 make 명령어를 통해 빌드한다.
그럼 output/images/ 디렉터리에 최종 빌드 아티팩트들이 저장된다. 여기에는 루트 파일 시스템, 부트로더, 커널 이미지 등이 포함된다.
빌드 출력물은 기본적으로 output/ 디렉터리에 저장된다. 이 디렉터리에는 다음과 같은 하위 디렉터리가 포함된다.
- build: 각 컴포넌트가 빌드되는 하위 디렉터리.
- host: 크로스 컴파일러를 포함한 호스트 유틸리티들이 설치되는 디렉터리.
- images: 최종 이미지 파일들이 저장되는 디렉터리.
- target: 타겟 루트 파일 시스템.
Package Build Logic
Buildroot은 각 패키지의 빌드 절차를 캡슐화하여 빌드한다. 빌드 메서드는 각 패키지의 레시피에 따라 다르다.
- AUTOTARGETS: autotools 기반 패키지.
- CMAKETARGETS: CMake 기반 패키지.
- GENTARGETS: 다른 빌드 시스템을 사용하는 패키지.
각 패키지의 소스 코드는 build/<pkg>-<version>/ 디렉터리에서 추출 및 빌드되며, 스탬프 파일이 각 빌드 단계를 추적한다.
Package 레시피 작성
새로운 패키지를 추가하기 위해선 package/foo/foo.mk 파일에 레시피를 작성해야 한다.
아래는 foo 패키지를 빌드하기 위한 것으로, AUTOTARGETS 인프라를 사용해 크로스 컴파일 문제를 자동으로 처리하는 예시이다.
FOO_VERSION = 1.3
FOO_SOURCE = foo-$(FOO_VERSION).tar.bz2
FOO_SITE = http://foo-project.org/downloads
FOO_DEPENDENCIES = zlib host-pkg-config
$(eval $(call AUTOTARGETS))
References
- https://bootlin.com/docs/
- https://www.linux4sam.org/bin/view/Linux4SAM/BuildRoot
- https://github.com/buildroot/buildroot
- https://buildroot.org/downloads/manual/manual.pdf
- https://www.buildroot.org/
- http://thomas.enix.org/pub/conf/rmll2012/buildroot.pdf
- https://slowbootkernelhacks.blogspot.com/2016/12/buildroot.html