git clone git://git.buildroot.net/buildroot -b 2017.02.01
cd buildroot
Buildroot는 GNU의 make를 기본 빌드 툴로서 사용한다
(Kconfig/Kbuild)
make list-defconfigs
make qemu_arm_versatile_defconfig
make
buildroot를 빌드하면 2개의 디렉토리가 생성된다.
dl/: Buildroot가 빌드한 업스트림 프로젝트의 아카이브
output/: 중간 단계 그리고 최종 컴파일된 자원
- build/: 각 컴포넌트를 위한 빌드 디렉토리
- host/: 실행 가능한 툴체인(output/host/usr/bin)을 포함하면서, 실행되는 다양한 툴
- images/: 가장 중요한 빌드의 결과물
- staging/: 툴체인의 sysroot에 대한 심볼릭 링크(staging area와 다름)
- target/: 루트 디렉토리를 위한 스테이징 영역(staging area); 아직 파일권한 및 퍼미션이 올바르게 설정되어 있지 않음
Custom BSPboard/<organization>/<device>: 리눅스, u-boot, 외의 컴포넌트를 위한 패치, 바이너리, 추가 빌드 단계 구성 파일
configs/<device>_defconfig: 보드용 기본 구성
packages/<organization>/<package_name>: 보드용 추가 패키지
menuconfig를 이용해서 U-boot, Kernal(리눅스) 설정을 지정 후,
genimage를 이용해 이미지를 빌드한다
board/melp/nova/genimage.cfg
image boot.vfat{
vfat{
files={
"MLO",
"u-boot.img",
"zImage",
"uEnv.txt",
"nova.dtb",
}
size=16M
}
image sdcard.img{
hdimage{
}
partition u-boot{
partition-type=0xC
bootable="true"
image="boot.vfat"
}
partition rootfs{
partition-type=0x83
image="rootfs.ext4"
size=512M
}
}
}
/board/melp/nova/post-image.shmenuconfig에서 Custom scripts to run before creating filesystem images로 설정
BOARD_DIR="$(dirname $0)"
cp ${BOARD_DIR}/uEnv.txt $BINARIES_DIR/uEnv.txt
GENIMAGE_CFG="${BOARD_DIR}/genimage.cfg"
GENIMAGE_TMP="${BOARD_DIR}/genimage.tmp"
rm -rf "${GENIMAGE_TMP}"
genimage \
--rootpath "${TARGET_DIR}" \
--tmppath "${GENIMAGE_TMP}" \
--inputpath "${BINARIES_DIR}" \
--outputpath "${BINARIES_DIR}" \
--config "${GENIMAGE_CFG}"
빌드
빌드 결과 이미지는 output/images에 저장됨
boot.vfat
MLO
nova.dtb
rootfs.ext2
rootfs.ext4
rootfs.tar
sdcard.img
u-boot.img
u-boot-spl.bin
uEnv.txt
zImage
sudo umount /dev/mmcblk0*
sudo dd if=output/image/sdcard.img of=/dev/mmcblk0 bs=1M
코드 추가- 오버레이
마지막 빌드 프로세스 단계에서 Buildroot 루트 파일 시스템의 최상위에 복사되는 간단한 디렉토리 구조
실행 파일, 라이브러리, 외에 코드를 추가할 수 있다.
(코드는 Buildroot가 사용한 같은 툴체인으로 컴파일 되어야 함)
PATH=<buildroot>/output/host/usr/bin:$PATH
arm0linux-gcc temp.c -o temp
PARH를 output/host/usr/bin을 추가해서 툴체인을 사용할 수 있다.
mkdir -p board/melp/nova/overlay/usr/bin
cp temp board/melp/nova/overlay/usr/bin
오버레이 디렉토리는 menuconfig에서
System configuration -> Root filesystem overlay directories 옵션을 통해서 지정
- 패키지 추가package/
Config.in
<package>.mk
package/temp/Config.in
config BR2_PACKAGE_TEMPPACKAGE
bool "temp"
help
A friendly program that prints Hello World!
package/Config.in
menu "My programs"
source "package/temp/Config.in"
endmenu
package/temp/temp.mk
TEMP_VERSION:=1.0.0
TEMP_SITE:=<package path>
TEMP_SITE_METHOD:=local
define TEMP_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD" -C $(@D) all
endef
$(eval $(generic-package))
라이선스