00 Yocto layer sistemi
Yocto'da her şey layer'dan oluşur. Layer, BitBake'in arayacağı recipe, class ve konfigürasyon dosyalarını barındıran bir dizin hiyerarşisidir.
Layer kavramı
Bir Yocto build'i birden fazla layer'ın üst üste bindirilmesiyle oluşur. Her layer bağımsız bir Git deposu olabilir ve farklı ekipler tarafından bakımı yapılır. Üst layer'daki dosyalar, alt layer'dakileri geçersiz kılar — bu mekanizma layer önceliği (BBFILE_PRIORITY) ile kontrol edilir.
meta/ (OE-Core — temel recipe'ler, priority 5)
meta-poky/ (Poky distro, priority 5)
meta-yocto-bsp/ (referans BSP, priority 5)
meta-openembedded/meta-oe/ (ek recipe'ler, priority 6)
meta-myproduct/ (projeye özgü layer, priority 10)
↑
en yüksek öncelik — tüm alt layer'ları geçersiz kılar
Layer türleri
| Layer Türü | İsimlendirme | İçerik | Örnek |
|---|---|---|---|
| BSP Layer | meta-<machine> | Donanım tanımı, kernel konfigürasyonu, bootloader | meta-raspberrypi, meta-ti |
| Distro Layer | meta-<distro> | Distro politikası, feature set, paket tercihleri | meta-poky, meta-clang |
| Software Layer | meta-<konu> | Uygulama recipe'leri, kütüphaneler | meta-oe, meta-qt5 |
| Product Layer | meta-<ürün> | Ürüne özgü konfigürasyon, tüm parçaların birleşimi | meta-myproduct |
BBLAYERS.conf
Build dizinindeki conf/bblayers.conf, aktif layer listesini tanımlar. BitBake bu dosyayı okuyarak hangi dizinleri tarayacağını öğrenir.
# POKY_BBLAYERS_CONF_VERSION artırılır her layer formatı değişikliğinde
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/home/user/poky/meta \
/home/user/poky/meta-poky \
/home/user/poky/meta-yocto-bsp \
/home/user/meta-openembedded/meta-oe \
/home/user/meta-myproduct \
"
Layer önceliği — BBFILE_PRIORITY
Birden fazla layer aynı recipe adını barındırıyorsa (örn. busybox_1.36.bb), BitBake en yüksek BBFILE_PRIORITY değerine sahip layer'daki dosyayı kullanır.
Bu bölümde
- Layer = recipe + class + conf dosyalarını barındıran dizin hiyerarşisi
- BSP · Distro · Software · Product olmak üzere 4 temel layer türü
- BBLAYERS.conf aktif layer listesini tanımlar
- BBFILE_PRIORITY yüksek olan layer'daki dosya kazanır
01 Layer oluşturma
bitbake-layers create-layer komutu, doğru dizin yapısı ve minimum layer.conf içeren bir layer iskeletini otomatik oluşturur.
bitbake-layers create-layer
# Build ortamını kaynak yap (henüz yapmadıysan)
source /home/user/poky/oe-init-build-env build/
# Layer'ı istediğin dizinde oluştur
cd /home/user
bitbake-layers create-layer meta-myproduct
# Oluşturulan yapı:
# meta-myproduct/
# ├── conf/
# │ └── layer.conf
# ├── recipes-example/
# │ └── example/
# │ └── example_0.1.bb
# ├── COPYING.MIT
# └── README
# Layer'ı aktif build'e ekle
bitbake-layers add-layer /home/user/meta-myproduct
# Eklenen layer'ları doğrula
bitbake-layers show-layers
Standart dizin yapısı
| Yol | Açıklama |
|---|---|
conf/layer.conf | Layer meta-verileri — BBPATH, BBFILES, öncelik, uyumluluk |
conf/machine/ | Machine konfigürasyon dosyaları (.conf) |
conf/distro/ | Distro konfigürasyon dosyaları (.conf) |
recipes-core/ | Temel sistem recipe'leri (init, bootscript vb.) |
recipes-kernel/ | Kernel recipe'leri ve bbappend'ler |
recipes-apps/ | Uygulama recipe'leri |
recipes-bsp/ | Bootloader, firmware recipe'leri |
classes/ | Özel .bbclass dosyaları |
files/ | Statik dosyalar (patch, config, overlay) |
Recipe dizinleri için recipes- ön eki bir gelenek, zorunluluk değil. Ancak bu geleneğe uymak bitbake-layers show-recipes çıktısını ve kod incelemesini kolaylaştırır.
Bu bölümde
bitbake-layers create-layer— iskelet oluştururbitbake-layers add-layer— bblayers.conf'a ekler- conf/, recipes-*, classes/ standart dizin yapısı
02 layer.conf detayları
layer.conf, BitBake'e bu layer'ın nerede olduğunu, hangi recipe'leri barındırdığını ve hangi Yocto sürümleriyle uyumlu olduğunu bildirir.
# BBPATH: Bu layer dizinini global arama yoluna ekle
BBPATH .= ":${LAYERDIR}"
# BBFILES: Bu layer içindeki tüm recipe ve bbappend dosyalarını bul
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
# BBFILE_COLLECTIONS: Bu layer'a benzersiz bir isim ver
BBFILE_COLLECTIONS += "myproduct"
# BBFILE_PATTERN: Hangi dosyaların bu koleksiyona ait olduğu
BBFILE_PATTERN_myproduct = "^${LAYERDIR}/"
# BBFILE_PRIORITY: Çakışma çözümünde bu layer'ın önceliği (1–100)
BBFILE_PRIORITY_myproduct = "10"
# LAYERDEPENDS: Bu layer'ın çalışması için gereken layer'lar
LAYERDEPENDS_myproduct = "core openembedded-layer"
# LAYERSERIES_COMPAT: Desteklenen Yocto sürüm kod adları
LAYERSERIES_COMPAT_myproduct = "scarthgap styhead"
# Opsiyonel: layer versiyonu
LAYERVERSION_myproduct = "1"
Değişkenlerin anlamı
| Değişken | Açıklama | Örnek Değer |
|---|---|---|
BBPATH | BitBake'in conf ve class dosyalarını aradığı yollar | "${TOPDIR}:${LAYERDIR}" |
BBFILES | Recipe ve bbappend dosyalarının glob desenleri | "${LAYERDIR}/recipes-*/*/*.bb" |
BBFILE_COLLECTIONS | Bu layer'ın benzersiz koleksiyon adı | "myproduct" |
BBFILE_PRIORITY | Çakışma önceliği — yüksek değer kazanır | "10" |
LAYERDEPENDS | Gerekli bağımlı layer'ların koleksiyon adları | "core" |
LAYERSERIES_COMPAT | Uyumlu Yocto release kod adları | "scarthgap" |
LAYERSERIES_COMPAT'ı güncel tutun. Yeni bir Yocto sürümüne geçtiğinizde bu değeri güncellemezseniz bitbake-layers check-layer uyarı verir ve bazı build araçları layer'ı reddeder.
Bu bölümde
- BBPATH/BBFILES — layer içeriğini BitBake'e tanıtır
- BBFILE_COLLECTIONS + BBFILE_PRIORITY — çakışma çözümü
- LAYERDEPENDS — bağımlı layer kontrolü
- LAYERSERIES_COMPAT — sürüm uyumluluk bildirimi
03 bbappend dosyası
.bbappend dosyası, mevcut bir recipe'yi kaynak kodunu değiştirmeden genişletmenizi sağlar. Upstream recipe'yi fork etmek yerine, sadece ihtiyaç duyduğunuz kısmı geçersiz kılar.
bbappend temel sözdizimi
# % joker karakteri — tüm busybox sürümlerine uygulanır
# Belirli sürüme bağlamak için: busybox_1.36.1.bbappend
# FILESEXTRAPATHS: SRC_URI file:// için ek arama dizinleri
# prepend garanti eder ki kendi dosyalarımız önce aranır
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
# Ek kaynak dosyası — kendi busybox.config'imizi ekle
SRC_URI += "file://busybox.config \
file://0001-fix-memory-leak.patch"
# do_configure görevine ek adım — busybox konfigürasyonunu kopyala
do_configure:append() {
cp ${WORKDIR}/busybox.config ${S}/.config
}
# do_install görevine ek adım
do_install:append() {
# Özel init scripti kur
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/myinit ${D}${sysconfdir}/init.d/myinit
}
FILESEXTRAPATHS kullanımı
meta-myproduct/
└── recipes-core/
└── busybox/
├── busybox_%.bbappend ← bbappend dosyası
└── busybox/ ← ${PN} adlı alt dizin
├── busybox.config ← SRC_URI file:// ile referans
└── 0001-fix-memory-leak.patch
# ${THISDIR}: .bbappend dosyasının bulunduğu dizin
# ${PN}: paket adı (busybox)
# Sonuç: .../recipes-core/busybox/busybox/ dizini arama yoluna eklenir
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
# Birden fazla dizin eklemek için
FILESEXTRAPATHS:prepend := "${THISDIR}/files:${THISDIR}/${PN}:"
Task override sözdizimi
| Sözdizim | Davranış |
|---|---|
do_install:append() | Orijinal do_install'dan SONRA çalışır |
do_install:prepend() | Orijinal do_install'dan ÖNCE çalışır |
do_install() | Orijinal do_install'ı TAMAMEN GEÇERSİZ KILAR — dikkatli kullan |
Bu bölümde
%joker — tüm sürümlere; belirli sürüm için tam versiyon yaz- FILESEXTRAPATHS:prepend — kendi dosya dizinini arama yoluna ekle
- do_task:append / do_task:prepend — görevi genişlet, geçersiz kılma
04 Machine konfigürasyonu
Machine konfigürasyonu, hedef donanımı tanımlar: CPU mimarisi, desteklenen özellikler, kernel ve bootloader seçimi, image formatı.
#@TYPE: Machine
#@NAME: myproduct custom board
#@DESCRIPTION: NXP i.MX8M tabanlı custom board konfigürasyonu
# Temel mimari bilgileri
require conf/machine/include/arm/arch-armv8a.inc
DEFAULTTUNE = "cortexa53"
# Donanım özellikleri — IMAGE_INSTALL ve paket seçimini etkiler
MACHINE_FEATURES = "ext2 vfat usbhost wifi bluetooth screen alsa"
# Ek özellikler — isteğe bağlı
MACHINE_FEATURES:append = " optee"
# Kernel seçimi
PREFERRED_PROVIDER_virtual/kernel = "linux-imx"
PREFERRED_VERSION_linux-imx = "6.1%"
KERNEL_DEVICETREE = "freescale/imx8mm-myboard.dtb"
KERNEL_IMAGETYPE = "Image"
# U-Boot seçimi
PREFERRED_PROVIDER_virtual/bootloader = "u-boot-imx"
UBOOT_MACHINE = "myboard_defconfig"
# Image formatları — tmp/deploy/images/ içine üretilecek dosyalar
IMAGE_FSTYPES = "ext4 wic wic.bmap"
# wic disk layout dosyası
WKS_FILE = "imx-uboot-bootpart.wks"
# Seri konsol
SERIAL_CONSOLES = "115200;ttymxc0"
# Bootloader ve firmware arama yolu
EXTRA_IMAGEDEPENDS += "imx-boot"
MACHINE_FEATURES referansı
| Feature | Etkisi |
|---|---|
usbhost | libusb, usbutils kurulumu etkinleştirilir |
wifi | wireless-tools, iw, wpa_supplicant bağımlılıkları eklenir |
bluetooth | bluez5 ve kernel bluetooth modülleri eklenir |
alsa | alsa-lib, alsa-utils bağımlılıkları eklenir |
screen | Grafik yığını (DRM/KMS) desteği eklenir |
optee | OP-TEE TEE çerçevesi etkinleştirilir |
pci | PCI araçları ve modülleri eklenir |
Bu bölümde
- arch-armv8a.inc ile mimari ayarları include et
- MACHINE_FEATURES donanım özelliklerini tanımlar
- PREFERRED_PROVIDER ile kernel/bootloader seç
- IMAGE_FSTYPES ile üretilecek image formatlarını belirle
05 Distro konfigürasyonu
Distro konfigürasyonu, dağıtımın özelliklerini ve politikalarını tanımlar: hangi özelliklerin etkin olduğu, hangi C kütüphanesinin kullanıldığı, paketleme formatı ve sürüm tercihleri.
#@TYPE: Distribution
#@NAME: mydistro
#@DESCRIPTION: Ürüne özgü minimal embedded Linux dağıtımı
DISTRO = "mydistro"
DISTRO_NAME = "MyProduct Distribution"
DISTRO_VERSION = "1.0.0"
DISTRO_CODENAME = "alpha"
# C kütüphanesi seçimi (glibc, musl, uclibc-ng)
TCLIBC = "glibc"
# Paketleme formatı — deb, rpm veya ipk
PACKAGE_CLASSES = "package_ipk"
# Distro özellikleri
DISTRO_FEATURES = "argp ext2 ipv4 ipv6 largefile usbgadget \
usbhost wifi bluetooth nfs zeroconf \
pam systemd"
# systemd kullan (sysvinit yerine)
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
# Önerilmeyen özellikleri kaldır
DISTRO_FEATURES:remove = "x11 wayland opengl"
# Sürüm tercihleri
PREFERRED_VERSION_python3 = "3.12%"
PREFERRED_VERSION_openssl = "3.2%"
# Debug bilgisi — üretim build'inde kaldır
# EXTRA_IMAGE_FEATURES += "debug-tweaks"
# Ortak derleme bayrakları
DISTRO_EXTRA_RDEPENDS += "packagegroup-base"
DISTRO_EXTRA_RRECOMMENDS += "kernel-modules"
DISTRO_FEATURES referansı
| Feature | Etkisi |
|---|---|
systemd | systemd init sistemi kullanılır |
ipv6 | IPv6 yığını etkinleştirilir |
nfs | NFS istemci desteği eklenir |
pam | PAM kimlik doğrulama kütüphanesi eklenir |
seccomp | seccomp sistem çağrısı filtresi etkinleştirilir |
selinux | SELinux MAC desteği eklenir |
x11 | X11 grafik yığını eklenir |
opengl | OpenGL/EGL desteği eklenir |
local.conf içinde DISTRO = "mydistro" satırını ekleyerek distronuzu etkinleştirin. Yoksa default olarak Poky kullanılır.
Bu bölümde
- DISTRO_FEATURES hangi yazılım özelliklerinin derleneceğini belirler
- PACKAGE_CLASSES ile paket formatı seçilir (ipk, deb, rpm)
- systemd için VIRTUAL-RUNTIME_init_manager ayarı gerekli
- PREFERRED_VERSION ile sürüm sabitlemesi yapılır
06 Layer bağımlılıkları
LAYERDEPENDS, bir layer'ın düzgün çalışması için hangi diğer layer'ların gerekli olduğunu bildirir. Eksik bağımlılıklar build başlamadan tespit edilir.
# Tek bağımlılık
LAYERDEPENDS_myproduct = "core"
# Birden fazla bağımlılık
LAYERDEPENDS_myproduct = "core openembedded-layer networking-layer"
# Sürüm kısıtlamalı bağımlılık
LAYERDEPENDS_myproduct = "core:2 openembedded-layer:1"
bitbake-layers show-layers
bitbake-layers show-layers
# Örnek çıktı:
# layer path priority
# ==========================================================================
# meta /home/user/poky/meta 5
# meta-poky /home/user/poky/meta-poky 5
# meta-yocto-bsp /home/user/poky/meta-yocto-bsp 5
# openembedded-layer /home/user/meta-openembedded/meta-oe 6
# myproduct /home/user/meta-myproduct 10
# Recipe'leri ve hangi layer'dan geldiğini göster
bitbake-layers show-recipes "busybox"
# Belirli bir recipe için tüm bbappend'leri listele
bitbake-layers show-appends busybox
Uyumluluk matrisi
| Yocto Sürümü | Kod Adı | Durum | LAYERSERIES_COMPAT değeri |
|---|---|---|---|
| 4.0 | kirkstone | LTS | "kirkstone" |
| 4.2 | mickledore | EOL | "mickledore" |
| 5.0 | scarthgap | LTS | "scarthgap" |
| 5.1 | styhead | Stable | "styhead" |
| 5.2 | walnascar | Dev | "walnascar" |
Bu bölümde
- LAYERDEPENDS eksik layer'ları erken tespit eder
- bitbake-layers show-layers — aktif layer listesi ve öncelikler
- bitbake-layers show-appends — bir recipe'ye uygulanan tüm bbappend'ler
- LAYERSERIES_COMPAT desteklenen Yocto sürümlerini bildirir
07 Layer test
Yocto, layer'ların doğruluğunu otomatik test etmek için bitbake-layers check-layer ve yocto-check-layer araçlarını sağlar.
# Layer yapısını ve layer.conf'u kontrol et
bitbake-layers check-layer /home/user/meta-myproduct
# Ağ erişimi olmadan kontrol (offline build ortamı)
bitbake-layers check-layer --no-network /home/user/meta-myproduct
# Tüm aktif layer'ları kontrol et
bitbake-layers check-layer --all
# yocto-check-layer: layer'ı gerçekten build ederek test eder
# Poky source tree içinde bulunur
cd /home/user/poky
# Test için geçici build dizini
scripts/yocto-check-layer \
--machines mymachine \
--no-auto-layer \
/home/user/meta-myproduct
# Belirli recipe'leri test et
scripts/yocto-check-layer \
--recipes "myapp mylib" \
/home/user/meta-myproduct
check-layer neyi kontrol eder
Bu bölümde
bitbake-layers check-layer— statik layer analizi--no-network— offline ortamda kullanımyocto-check-layer— gerçek build ile kapsamlı test
08 Pratik: meta-myproduct layer
Sıfırdan bir ürün layer'ı oluştur: custom machine + distro konfigürasyonu + uygulama recipe'si içeren eksiksiz meta-myproduct yapısı.
Tam dizin yapısı
meta-myproduct/
├── conf/
│ ├── layer.conf
│ ├── machine/
│ │ └── mymachine.conf
│ └── distro/
│ └── mydistro.conf
├── recipes-core/
│ └── images/
│ └── myproduct-image.bb
├── recipes-apps/
│ └── myapp/
│ ├── myapp_1.0.0.bb
│ └── myapp/
│ ├── myapp.service
│ └── myapp.conf
├── recipes-kernel/
│ └── linux-imx/
│ ├── linux-imx_%.bbappend
│ └── linux-imx/
│ └── myboard.cfg
└── classes/
└── myproduct-common.bbclass
myproduct-image.bb — custom image recipe
SUMMARY = "MyProduct minimal image"
DESCRIPTION = "Ürüne özgü minimal embedded Linux image"
# core-image-minimal'dan miras al
require recipes-core/images/core-image-minimal.bb
# Ek paketleri IMAGE_INSTALL'a ekle
IMAGE_INSTALL:append = " \
myapp \
openssh \
python3 \
python3-pip \
htop \
strace \
tcpdump \
"
# Image boyut sınırı (MB cinsinden)
IMAGE_ROOTFS_SIZE = "65536"
# Ekstra image özellik
EXTRA_IMAGE_FEATURES += "ssh-server-openssh"
myapp_1.0.0.bb — uygulama recipe'si
SUMMARY = "MyProduct ana uygulama daemon'ı"
LICENSE = "CLOSED"
SRC_URI = "git://git.mycompany.com/myapp.git;protocol=https;branch=main"
SRCREV = "${AUTOREV}"
PV = "1.0.0+git${SRCPV}"
S = "${WORKDIR}/git"
# systemd servis dosyaları
SRC_URI += "file://myapp.service \
file://myapp.conf"
# Bağımlılıklar
DEPENDS = "libgpiod openssl"
RDEPENDS:${PN} = "libgpiod openssl bash"
# CMake build sistemi
inherit cmake systemd
# systemd servis dosyasını belirt
SYSTEMD_SERVICE:${PN} = "myapp.service"
SYSTEMD_AUTO_ENABLE = "enable"
do_install:append() {
install -d ${D}${sysconfdir}/myapp
install -m 0644 ${WORKDIR}/myapp.conf ${D}${sysconfdir}/myapp/myapp.conf
}
Build ve test
# local.conf'ta MACHINE ve DISTRO ayarla
echo 'MACHINE = "mymachine"' >> conf/local.conf
echo 'DISTRO = "mydistro"' >> conf/local.conf
# Layer'ı ekle ve kontrol et
bitbake-layers add-layer /home/user/meta-myproduct
bitbake-layers check-layer --no-network /home/user/meta-myproduct
# Sadece myapp recipe'sini derle
bitbake myapp
# Tam image üret
bitbake myproduct-image
# Çıktıları kontrol et
ls tmp/deploy/images/mymachine/
Bu bölümde
- meta-myproduct: conf + recipes-core + recipes-apps + recipes-kernel + classes
- myproduct-image.bb: core-image-minimal'dan türeyen custom image
- myapp_1.0.0.bb: CMake + systemd entegrasyonlu uygulama recipe'si
- MACHINE + DISTRO değişkenleriyle layer aktive edilir