임베디드를 좋아하는 조금 특이한 개발자?

[Buildroot] Github로 관리하기 위한 개발 환경 구축 본문

Embedded/Buildroot

[Buildroot] Github로 관리하기 위한 개발 환경 구축

Gordon_ 2025. 7. 6. 01:10

- 개발 환경

개발 보드 : Raspberrypi 4

WSL2 (Ubuntu 22.04 LTS)

buildroot(2024.02)


1. 서론

    Buildroot를 이용하여 개발하다 보면 Buildroot 내에 이미 개발보드나 패키지들이 많이 정의되어 있어 추가적인 개발보드나 패키지를 추가하는 것은 프로젝트 관리만 힘들어질 뿐입니다. 그래서, 실질적으로 buildroot와 개발 환경을 독립시켜 개발하는 것이 좋은 선택지가 될 수 있습니다. 또한, 그렇게 프로젝트들이 개발되고 있습니다.(batocera.linux LVGL 보면 buildroot 밖에서 개발보드나 패키지를 개발하는 것을 확인할 수 있음)

  그렇기 때문에 공식 문서를 참고해 나가면서 개발 환경을 구성하도록 하겠습니다. 이와 관련된 내용은 "Chapter 9. Project-specific customization"에 더 자세히 명세되어 있습니다.

https://buildroot.org/downloads/manual/manual.html#outside-br-custom

 

The Buildroot user manual

Package imagemagick installs the following scripts: $(STAGING_DIR)/usr/bin/{Magick,Magick++,MagickCore,MagickWand,Wand}-config So it’s fixup would be: IMAGEMAGICK_CONFIG_SCRIPTS = \ Magick-config Magick++-config \ MagickCore-config MagickWand-config Wand

buildroot.org

 

- 예제 코드

https://github.com/MainForm/Buildroot_rpi4_template

 

GitHub - MainForm/Buildroot_rpi4_template

Contribute to MainForm/Buildroot_rpi4_template development by creating an account on GitHub.

github.com

 

2. 초기 프로젝트 구조 생성

참고 문서 : 9.1. Recommended directory structure

Buildroot에서 추천하는 프로젝트 구조

 

위 이미지는 Buildroot 문서에서 추천하는 프로젝트 구성입니다. 필요 없는 폴더의 경우 생성하지 않아도 되므로 초기 프로젝트 설정에서는 필요한 폴더 및 파일만으로 구성하도록 하겠습니다. 

  • board 폴더
    해당 폴더는 개발보드에 개별적으로 적용되어야 하는 설정들을 저장하는 폴더입니다.
    특히 나중에 자주 사용하게 될 overlay 폴더를 board 폴더 내에서 관리하게 됩니다.

  • configs 폴더
    각 개발 보드의 buildroot 설정을 저장하는 폴더입니다.
  • package 폴더
    Linux를 빌드하면서 안에 같이 설치할 Package를 관리하는 폴더입니다.

  • Config.in, external.mk 파일
    해당 프로젝트에서 Package의 구조를 설정하는 파일입니다.
    해당 파일은 프로젝트 구성에서 필수적인 파일입니다.

  • Makefile 파일
    configs 폴더에 있는 개발보드 설정 파일을 기반으로 초기 개발 환경(output 폴더)을 구성하게 됩니다.
    Buildroot 문서에서 Makefile에 대한 Template를 제공하고 있습니다.

  • external.desc 파일
    해당 프로젝트에 대한 이름 및 설명을 저장하기 위한 파일입니다.
    파일에 적혀 있는 프로젝트의 이름에 따라 이 프로젝트의 디렉토리 주소가 저장된 변수가 생성됩니다.

2.1. 프로젝트 폴더 생성 및 git 초기화

# 프로젝트 폴더 생성 및 이동
mkdir Buildroot_rpi4_custom && cd Buildroot_rpi4_custom

# git 초기화
git init

# buildroot를 submodule로 등록
git submodule add https://github.com/buildroot/buildroot.git

# buildroot를 2024.02 tag로 checkout
cd buildroot
git checkout 2024.02
cd ..

# git ignore 파일 생성
touch .gitignore

 

 

- gitignore 파일 내용

# visual studio code 세팅 파일 무시
.vscode
.settings

# buildroot 빌드 관련 파일 제외
output
dl

 

  Buildroot의 경우 Git의 submodule로 구성하여 자유롭게 버전을 변경할 수 있도록 하였습니다. 그리고 Buildroot를 Submodule로 구성하였으므로 해당 Buildroot 내 파일은 수정하는 일이 없도록 해야 합니다.

 

2.2. 프로젝트 구조 구성

# 외부 개발 환경 설정을 위한 파일 생성
touch Config.in
touch external.desc
touch external.mk

# 개발보드의 Buildroot config 설정 저장
# 지금 제가 사용하고 있는 개발보드는 "라즈베리파이4"입니다.
# 그러므로 각자 개발하고자 하는 보드에 따라 ./buildroot/configs 폴더에서 자신의 보드에 맞는 설정을 복사합니다.
mkdir configs
TARGET_BR_CONFIG=raspberrypi4_64_defconfig
cp ./buildroot/configs/${TARGET_BR_CONFIG} ./configs/${TARGET_BR_CONFIG}

 

  프로젝트 설정을 위한 파일 3개(Config.in, external.desc, external.mk)를 생성합니다. Config, external.mk는 Package에 대한 설정 파일입니다. 하지만 지금 저희는 Package가 없으므로 파일만 생성하고 내용은 따로 추가하지 않습니다.

- external.desc 내용

 
name: RASP4_CUSTOM
desc: test
 

 

 

2.3. 초기 개발 환경 설정을 위한 Makefile 추가

참고 문서 : 9.1.2. Custom top Makefile

touch Makefile

- Makefile 내용

# SPDX-License-Identifier: GPL-2.0

# Avoid surprises by disabling default rules
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:

THIS_EXTERNAL_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))

# Put downloads in this directory instead of in the Buildroot directory
ifeq ($(BR2_DL_DIR),)
BR2_DL_DIR = $(THIS_EXTERNAL_PATH)/dl
endif

OUTPUT_BASEDIR = $(THIS_EXTERNAL_PATH)/output
OUTPUT_DIR = $(OUTPUT_BASEDIR)/$(patsubst %_defconfig,%,$@)

MAKE_BUILDROOT = $(MAKE) -C $(THIS_EXTERNAL_PATH)/buildroot BR2_EXTERNAL=$(THIS_EXTERNAL_PATH)

%: $(THIS_EXTERNAL_PATH)/configs/%
	$(MAKE_BUILDROOT) O=$(OUTPUT_DIR) $@
	sed -i /^BR2_DL_DIR=.*/s%%BR2_DL_DIR=$(BR2_DL_DIR)% $(OUTPUT_DIR)/.config

 

2.4. 프로젝트 구조 결과

 

3. 작업 폴더(output 폴더) 생성

 이제 위에서 생성한 Makefile를 통해 작업 폴더를 생성하도록 하겠습니다.

# configs 폴더 내 개발 보드 Buildroot 설정 파일 확인
ls ./configs/

# Makefile로 output 폴더 생성
make raspberrypi4_64_defconfig

실행 결과
output 폴더 생성 확인

 

  여기서 반드시 확인해야 하는 내용이 있습니다. 프로젝트 폴더에 있는 Makefileoutput 폴더 안에 있는 Makefile의 용도는 전혀 다릅니다. 프로젝트 폴더에 있는 Makefile은 초기 개발 환경(output 폴더)를 생성하기 위한 Makefile입니다. output 폴더 안에 있는 Makefile은 Linux 이미지에 필요한 Buildroot 설정을 하기 위한 Makefile입니다. 

 

4. 라즈베리파이용 리눅스 빌드

# output 폴더로 이동
cd ./output/raspberrypi4_64/

# 리눅스 빌드
make

  

  make 후 Download dir를 설정하라는 내용이 나옵니다. 기본 경로($(TOPDIR)/dl)를 사용한다면 빈 내용으로 Enter를 입력합니다.

5. 결론

  이번 포스트 내용을 통해 Buildroot로 개발한 나의 프로젝트를 Github으로 관리할 수 있게 되었습니다. 특히 Buildroot와 Yocto Project의 경우 리눅스 운영체제를 빌드하는 "리눅스 빌드 시스템"은 각 보드마다 적용해야 할 설정이 다르며 특히 빌드 과정에서 생성되는 파일의 경우 용량이 매우 크기 때문에 Github로 관리하려면 프로젝트 구조가 매우 중요합니다. 이제 Github에 있는 buildroot 프로젝트를 clone만 하게 된다면 추가적인 설정 없이 간단한 make 명령만으로도 이전에 설정한 내용 그대로 Linux를 빌드할 수 있습니다.

  다음 프스트에서는 각 보드마다 설정해야하는 요소들이 어떤 것이 있는지 확인하고 어떻게 구조를 설정해야하는지를 확인하도록 하겠습니다.