00 External tree konsepti
BR2_EXTERNAL, board/paket/konfigürasyon dosyalarını Buildroot kaynak ağacından tamamen bağımsız bir dizinde tutmanızı sağlar. Buildroot sürümünü güncellemek board özelleştirmelerini etkilemez.
Dizin yapısı
my-bsp/ ← BR2_EXTERNAL root
├── Config.in ← menü entrypoint (zorunlu)
├── external.mk ← paket include (zorunlu)
├── external.desc ← isim ve açıklama (zorunlu)
│
├── configs/
│ └── myboard_defconfig ← board defconfig
│
├── board/
│ └── myboard/
│ ├── genimage.cfg ← disk imaj tanımı
│ ├── linux.config ← kernel config (isteğe bağlı)
│ ├── linux-fragments/ ← kernel config fragment'ları
│ │ ├── base.config
│ │ └── myboard.config
│ ├── post-build.sh ← rootfs tamamlandıktan sonra
│ ├── post-image.sh ← imaj oluşturulduktan sonra
│ └── rootfs_overlay/ ← rootfs üzerine kopyalanır
│ ├── etc/
│ └── usr/
│
└── package/
└── mypackage/
├── Config.in ← Kconfig menü entry
└── mypackage.mk ← derleme tarifi
external.desc ve temel dosyalar
# external.desc — zorunlu
cat my-bsp/external.desc
# name: MY_BSP
# desc: Custom BSP for MyBoard
# Config.in — zorunlu (paketlerin Kconfig entry'leri dahil edilir)
cat my-bsp/Config.in
# source "$BR2_EXTERNAL_MY_BSP_PATH/package/mypackage/Config.in"
# external.mk — zorunlu (paket makefile'ları dahil edilir)
cat my-bsp/external.mk
# include $(sort $(wildcard $(BR2_EXTERNAL_MY_BSP_PATH)/package/*/*.mk))
Build ile bağlama
# Buildroot'u klonla
git clone https://git.buildroot.net/buildroot --branch 2024.02
cd buildroot
# External tree ile yapılandır
make BR2_EXTERNAL=/path/to/my-bsp myboard_defconfig
# veya birden fazla external tree
make BR2_EXTERNAL="/path/to/my-bsp:/path/to/other-ext" myboard_defconfig
# Konfigürasyon menüsü
make BR2_EXTERNAL=/path/to/my-bsp menuconfig
# Build
make -j$(nproc)
01 Board defconfig
Board defconfig, hedef board için tüm Buildroot seçeneklerini içeren tam konfigürasyon dosyasıdır. Toolchain, kernel, bootloader, rootfs formatı ve paket seçimleri burada yapılır.
Temel defconfig yapısı
cat my-bsp/configs/myboard_defconfig
# ─── Toolchain ───────────────────────────────────────
BR2_aarch64=y # ARM64 hedef
BR2_TOOLCHAIN_BUILDROOT_MUSL=y # musl libc (küçük)
# veya glibc:
# BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BR2_GCC_VERSION_13_X=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y # C++ desteği
# External toolchain:
# BR2_TOOLCHAIN_EXTERNAL=y
# BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/poky/sysroots/x86_64-pokysdk-linux/usr"
# BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
# ─── Kernel ──────────────────────────────────────────
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.6.30"
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/linux.config"
BR2_LINUX_KERNEL_IMAGE_TARGET_NAME="Image" # ARM64 kernel image
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="myboard"
# ─── U-Boot ──────────────────────────────────────────
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="myboard"
BR2_TARGET_UBOOT_CUSTOM_VERSION=y
BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2024.04"
# ─── Rootfs formatları ───────────────────────────────
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="256M"
BR2_TARGET_ROOTFS_SQUASHFS=y # Read-only
# ─── Post-build ve overlay ───────────────────────────
BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/rootfs_overlay"
BR2_ROOTFS_POST_BUILD_SCRIPT="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/post-build.sh"
BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/post-image.sh"
# ─── Paketler ────────────────────────────────────────
BR2_PACKAGE_BUSYBOX=y
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_MYPACKAGE=y
Defconfig kaydetme ve güncelleme
# Değişiklikleri defconfig'e kaydet
make savedefconfig BR2_DEFCONFIG=../my-bsp/configs/myboard_defconfig
# Mevcut defconfig'i yükle
make myboard_defconfig
# Farkları göster
make diffconfig
02 Custom Linux kernel config
Kernel konfigürasyonu tam config dosyası veya daha esnek olan config fragment sistemi ile yönetilebilir. Fragment'lar, temel defconfig üzerine küçük değişiklikler uygulamayı kolaylaştırır.
Config fragment yaklaşımı
# defconfig'de fragment listesi
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="\
$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/linux-fragments/base.config \
$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/linux-fragments/myboard.config"
# base.config — genel gömülü Linux ayarları
cat my-bsp/board/myboard/linux-fragments/base.config
# CONFIG_PROC_FS=y
# CONFIG_SYSFS=y
# CONFIG_DEVTMPFS=y
# CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_NET=y
# CONFIG_UNIX=y
# # Gereksiz olanları kapat:
# # CONFIG_SOUND is not set
# # CONFIG_USB_SUPPORT is not set
# myboard.config — board'a özgü sürücüler
cat my-bsp/board/myboard/linux-fragments/myboard.config
# # Board'a özgü sürücüler
# CONFIG_MXC_SPI=y
# CONFIG_I2C_IMX=y
# CONFIG_SERIAL_IMX=y
# CONFIG_MMC=y
# CONFIG_MMC_SDHCI=y
# CONFIG_MMC_SDHCI_ESDHC_IMX=y
Fragment merge mekanizması
# Buildroot, kernel defconfig'i şu şekilde merge eder:
# 1. arch/arm64/configs/imx8mp_evk_defconfig yükle
# 2. Her fragment dosyasını scripts/kconfig/merge_config.sh ile uygula
# Manuel test:
cd /path/to/linux-src
scripts/kconfig/merge_config.sh \
arch/arm64/configs/imx8mp_evk_defconfig \
/path/to/my-bsp/board/myboard/linux-fragments/base.config \
/path/to/my-bsp/board/myboard/linux-fragments/myboard.config
# Sonuç kernel .config dosyasını kontrol et
grep "CONFIG_MMC_SDHCI" .config
Kernel menuconfig ile etkileşimli düzenleme
# Buildroot üzerinden kernel menuconfig
make linux-menuconfig
# Değişiklikleri kaydet
make linux-update-defconfig
# veya direkt fragment'a ekle
# Kernel rebuild (sadece kernel)
make linux-rebuild
make linux-rebuild all # + imaj yeniden oluştur
03 Board support dosyaları
Post-build/post-image scriptleri ve rootfs overlay, board'a özgü özelleştirmelerin ana mekanizmalarıdır. Bu scriptler build sürecinin belirli aşamalarında otomatik çalışır.
Rootfs overlay
# Overlay yapısı — doğrudan rootfs üzerine kopyalanır
my-bsp/board/myboard/rootfs_overlay/
├── etc/
│ ├── hostname ← "myboard"
│ ├── network/
│ │ └── interfaces ← statik IP konfigürasyonu
│ ├── inittab ← özel init konfigürasyonu
│ └── myapp.conf ← uygulama konfigürasyonu
├── usr/
│ └── share/
│ └── myapp/
│ └── data/
└── lib/
└── firmware/
└── myboard.fw ← board firmware
# /etc/hostname içeriği:
echo "myboard" > my-bsp/board/myboard/rootfs_overlay/etc/hostname
post-build.sh — rootfs tamamlandıktan sonra
cat my-bsp/board/myboard/post-build.sh
#!/bin/bash
set -e
TARGET_DIR=$1 # Buildroot bunu otomatik geçirir
echo "=== post-build.sh: $TARGET_DIR ==="
# Sürüm bilgisini rootfs'e yaz
echo "MyBoard BSP v1.0 ($(date +%Y%m%d))" \
> "$TARGET_DIR/etc/myboard-version"
# Gereksiz dosyaları temizle (boyut küçültme)
rm -rf "$TARGET_DIR/usr/share/doc"
rm -rf "$TARGET_DIR/usr/share/man"
find "$TARGET_DIR" -name "*.a" -delete # static kütüphaneler
# Binary'leri strip et
find "$TARGET_DIR/usr/bin" -type f \
-exec $HOST_DIR/bin/aarch64-linux-strip --strip-unneeded {} \; 2>/dev/null || true
# Init script izinleri
chmod +x "$TARGET_DIR/etc/init.d/S99myapp" 2>/dev/null || true
post-image.sh — imaj oluşturulduktan sonra
cat my-bsp/board/myboard/post-image.sh
#!/bin/bash
set -e
BINARIES_DIR=$1
BOARD_DIR="$(dirname $0)"
echo "=== post-image.sh: $BINARIES_DIR ==="
# genimage ile SD kart imajı oluştur
GENIMAGE_CFG="$BOARD_DIR/genimage.cfg"
GENIMAGE_TMP="$BUILD_DIR/genimage.tmp"
rm -rf "$GENIMAGE_TMP"
genimage \
--rootpath "$TARGET_DIR" \
--tmppath "$GENIMAGE_TMP" \
--inputpath "$BINARIES_DIR" \
--outputpath "$BINARIES_DIR" \
--config "$GENIMAGE_CFG"
echo "SD kart imajı: $BINARIES_DIR/sdcard.img"
ls -lh "$BINARIES_DIR/sdcard.img"
04 Custom package ekleme
Buildroot paket sistemi, otomatik araçlar (autotools), CMake ve manuel derleme desteği sunar. Her paket bir Config.in (Kconfig menü) ve bir .mk (derleme tarifi) dosyasından oluşur.
Config.in — Kconfig menü entry
cat my-bsp/package/mypackage/Config.in
config BR2_PACKAGE_MYPACKAGE
bool "mypackage"
depends on BR2_PACKAGE_LIBSOMELIB
select BR2_PACKAGE_LIBJSON_C
help
MyPackage — Gömülü sistem yönetim uygulaması.
Bu paket cihaz durumunu izler ve MQTT üzerinden
rapor eder.
https://github.com/example/mypackage
Autotools paketi (.mk)
cat my-bsp/package/mypackage/mypackage.mk
MYPACKAGE_VERSION = 1.2.3
MYPACKAGE_SITE = https://github.com/example/mypackage/archive
MYPACKAGE_SOURCE = v$(MYPACKAGE_VERSION).tar.gz
MYPACKAGE_LICENSE = MIT
MYPACKAGE_LICENSE_FILES = LICENSE
# Bağımlılıklar (Config.in'deki select/depends ile örtüşmeli)
MYPACKAGE_DEPENDENCIES = libjson-c mosquitto
# Autotools configure seçenekleri
MYPACKAGE_CONF_OPTS = \
--enable-mqtt \
--disable-tests \
--with-json=$(STAGING_DIR)/usr
# Ek kurulum adımı
define MYPACKAGE_INSTALL_INIT_SYSV
$(INSTALL) -m 0755 $(MYPACKAGE_PKGDIR)/S99mypackage \
$(TARGET_DIR)/etc/init.d/S99mypackage
endef
MYPACKAGE_POST_INSTALL_TARGET_HOOKS += MYPACKAGE_INSTALL_INIT_SYSV
$(eval $(autotools-package))
CMake paketi (.mk)
MYAPP_VERSION = 2.0.0
MYAPP_SITE = https://github.com/example/myapp/archive
MYAPP_SOURCE = $(MYAPP_VERSION).tar.gz
MYAPP_LICENSE = Apache-2.0
MYAPP_CONF_OPTS = \
-DBUILD_TESTS=OFF \
-DENABLE_OPTIMIZATION=ON \
-DTARGET_PLATFORM=embedded
$(eval $(cmake-package))
Manuel paket (.mk)
MYBARE_VERSION = 1.0
MYBARE_SITE = $(BR2_EXTERNAL_MY_BSP_PATH)/src/mybare
MYBARE_SITE_METHOD = local
define MYBARE_BUILD_CMDS
$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D)
endef
define MYBARE_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/mybare \
$(TARGET_DIR)/usr/bin/mybare
$(INSTALL) -D -m 0644 $(@D)/mybare.conf \
$(TARGET_DIR)/etc/mybare.conf
endef
$(eval $(generic-package))
05 Bootloader entegrasyonu
U-Boot, Buildroot ile entegre edilebilir. Custom board için U-Boot defconfig, SPL (Secondary Program Loader) ve platform spesifik yapılandırma adımları.
U-Boot defconfig entegrasyonu
# Buildroot defconfig içinde
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
BR2_TARGET_UBOOT_CUSTOM_VERSION=y
BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2024.04"
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="imx8mp_evk" # configs/imx8mp_evk_defconfig
# Custom U-Boot konfigürasyonu için:
BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES=\
"$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/uboot-fragment.config"
# SPL desteği
BR2_TARGET_UBOOT_SPL=y
BR2_TARGET_UBOOT_SPL_NAME="spl/u-boot-spl.bin"
# Çıktı dosyaları
BR2_TARGET_UBOOT_FORMAT_BIN=y # u-boot.bin
BR2_TARGET_UBOOT_FORMAT_IMX=y # u-boot.imx (i.MX6/7/8)
uboot-fragment.config
cat my-bsp/board/myboard/uboot-fragment.config
# Önyükleyici konfigürasyon override'ları
CONFIG_SYS_TEXT_BASE=0x40200000
CONFIG_BOOTDELAY=3
CONFIG_BOOTCOMMAND="run myboard_boot"
# Ortam değişkeni özelleştirme
CONFIG_EXTRA_ENV_SETTINGS="myboard_boot=load mmc 0:1 ${kernel_addr_r} Image && booti\0"
# eMMC desteği
CONFIG_CMD_MMC=y
CONFIG_MMC_SDHCI=y
# TFTP boot (geliştirme)
CONFIG_CMD_NET=y
CONFIG_CMD_TFTP=y
U-Boot özelleştirme
# U-Boot menuconfig
make uboot-menuconfig
# Değişiklikleri kaydet
make uboot-update-defconfig
# Sadece U-Boot rebuild
make uboot-rebuild
# ATF (Arm Trusted Firmware) entegrasyonu (ARM64 için zorunlu)
BR2_TARGET_ARM_TRUSTED_FIRMWARE=y
BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION=y
BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION_VALUE="v2.10"
BR2_TARGET_ARM_TRUSTED_FIRMWARE_PLATFORM="imx8mp"
BR2_TARGET_ARM_TRUSTED_FIRMWARE_FIP=y
06 Device tree entegrasyonu
Buildroot, kernel ağaç içi DTS dosyalarını ve custom DTS dosyalarını derler. DTS overlay'leri ile base board DTS'ini değiştirmeden uzantı eklenebilir.
Kernel ağaç içi DTS
# Defconfig'de DTS seçimi
BR2_LINUX_KERNEL_DTS_SUPPORT=y
# Birden fazla DTS (boşlukla ayrılmış)
BR2_LINUX_KERNEL_INTREE_DTS_NAME="imx8mp-evk imx8mp-myboard"
# Kernel kaynak içindeki DTS yolu:
# arch/arm64/boot/dts/freescale/imx8mp-myboard.dts
External (custom) DTS
# Defconfig'de
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH=\
"$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/dts/imx8mp-myboard.dts"
# Custom DTS dosyası
cat my-bsp/board/myboard/dts/imx8mp-myboard.dts
# /dts-v1/;
# #include "imx8mp.dtsi"
#
# / {
# model = "MyBoard i.MX8M Plus";
# compatible = "mycompany,myboard", "fsl,imx8mp";
#
# chosen {
# bootargs = "console=ttymxc1,115200 rootwait";
# };
# };
#
# &uart2 { status = "okay"; };
# &ecspi1 { status = "okay"; };
DTS overlay
# Overlay ile base DTS'i değiştir
cat my-bsp/board/myboard/dts/myboard-spi-sensor.dts
# /dts-v1/;
# /plugin/;
#
# &spi0 {
# sensor@0 {
# compatible = "mycompany,mysensor";
# reg = <0>;
# spi-max-frequency = <1000000>;
# status = "okay";
# };
# };
# DTS overlay derleme
BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT=y
# Overlay derle + uygula:
# post-build.sh içinde:
dtc -I dts -O dtb \
-o $BINARIES_DIR/myboard-spi-sensor.dtbo \
$BOARD_DIR/dts/myboard-spi-sensor.dts
07 genimage ile disk imajı
genimage, birden fazla partition ve dosya sistemi içeren disk imajları (SD kart, eMMC) oluşturur. post-image.sh'den çağrılır.
genimage.cfg — SD kart düzeni
cat my-bsp/board/myboard/genimage.cfg
image boot.vfat {
vfat {
files = {
"Image", # Kernel (ARM64)
"imx8mp-myboard.dtb", # Device tree
"u-boot.imx" # Bootloader (bazı platformlar)
}
}
size = 64M
}
image rootfs.ext4 {
ext4 {
label = "rootfs"
}
size = 256M
# Buildroot rootfs.ext2 çıktısını kullanır
}
image sdcard.img {
hdimage {
partition-table-type = "mbr"
}
partition mbr {
# MBR signature — i.MX8 için
image = "u-boot-with-spl.imx"
offset = 33K
size = 1M
}
partition boot {
partition-type = 0x0C # FAT32
bootable = true
image = "boot.vfat"
offset = 8M
size = 64M
}
partition rootfs {
partition-type = 0x83 # Linux
image = "rootfs.ext4"
offset = 72M
}
}
eMMC için özel düzen
image emmc.img {
hdimage {
partition-table-type = "gpt"
}
partition boot-a {
partition-type-uuid = "linux-boot"
image = "boot.vfat"
offset = 1M
size = 128M
}
partition boot-b {
partition-type-uuid = "linux-boot"
image = "boot.vfat"
offset = 129M
size = 128M
}
partition rootfs-a {
partition-type-uuid = "linux-data"
image = "rootfs.ext4"
offset = 257M
size = 512M
}
partition rootfs-b {
partition-type-uuid = "linux-data"
image = "rootfs.ext4"
offset = 769M
size = 512M
}
partition data {
partition-type-uuid = "linux-data"
offset = 1281M
# boyut: kalan alan
}
}
SD karta yazma
# İmajı SD karta yaz
sudo dd if=output/images/sdcard.img \
of=/dev/sdX \
bs=4M status=progress conv=fsync
# veya bmaptool (çok daha hızlı — sadece yazılı bloklar)
sudo bmaptool copy --bmap output/images/sdcard.img.bmap \
output/images/sdcard.img /dev/sdX
08 Pratik: Raspberry Pi CM4 için tam custom Buildroot BSP
Raspberry Pi Compute Module 4 için kernel + bootloader + rootfs + imaj üretecek tam bir Buildroot BSP kurulumu, adım adım.
Adım 1: External tree iskeletini oluştur
mkdir -p rpi-cm4-bsp/{configs,board/rpi-cm4/{linux-fragments,rootfs_overlay/etc},package}
# Zorunlu dosyalar
cat > rpi-cm4-bsp/external.desc <<'EOF'
name: RPI_CM4_BSP
desc: Raspberry Pi Compute Module 4 BSP
EOF
cat > rpi-cm4-bsp/Config.in <<'EOF'
source "$BR2_EXTERNAL_RPI_CM4_BSP_PATH/package/rpi-cm4-app/Config.in"
EOF
cat > rpi-cm4-bsp/external.mk <<'EOF'
include $(sort $(wildcard $(BR2_EXTERNAL_RPI_CM4_BSP_PATH)/package/*/*.mk))
EOF