Yocto İleri Düzey
TEKNİK REHBER YOCTO İLERİ LAYER 2026

Layer Yazma
bitbake-layers & conf

Sıfırdan Yocto layer oluştur — layer.conf, bbappend, machine ve distro konfigürasyonu ile eksiksiz meta-layer mimarisi.

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 Layermeta-<machine>Donanım tanımı, kernel konfigürasyonu, bootloadermeta-raspberrypi, meta-ti
Distro Layermeta-<distro>Distro politikası, feature set, paket tercihlerimeta-poky, meta-clang
Software Layermeta-<konu>Uygulama recipe'leri, kütüphanelermeta-oe, meta-qt5
Product Layermeta-<ürün>Ürüne özgü konfigürasyon, tüm parçaların birleşimimeta-myproduct

BBLAYERS.conf

Build dizinindeki conf/bblayers.conf, aktif layer listesini tanımlar. BitBake bu dosyayı okuyarak hangi dizinleri tarayacağını öğrenir.

conf/bblayers.conf
# 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.

1–5OE-Core ve Poky core layer'ları — temel altyapı
6–8meta-openembedded gibi ek yazılım layer'ları
9–10BSP layer'ları — board-specific geçersiz kılmalar
11+Product layer'ları — tüm diğerlerinin üzerinde

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

bash — Poky build ortamı aktif olmalı
# 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ı

YolAçıklama
conf/layer.confLayer 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)
İPUCU

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şturur
  • bitbake-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.

meta-myproduct/conf/layer.conf
# 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şkenAçıklamaÖrnek Değer
BBPATHBitBake'in conf ve class dosyalarını aradığı yollar"${TOPDIR}:${LAYERDIR}"
BBFILESRecipe ve bbappend dosyalarının glob desenleri"${LAYERDIR}/recipes-*/*/*.bb"
BBFILE_COLLECTIONSBu layer'ın benzersiz koleksiyon adı"myproduct"
BBFILE_PRIORITYÇakışma önceliği — yüksek değer kazanır"10"
LAYERDEPENDSGerekli bağımlı layer'ların koleksiyon adları"core"
LAYERSERIES_COMPATUyumlu Yocto release kod adları"scarthgap"
DİKKAT

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

meta-myproduct/recipes-core/busybox/busybox_%.bbappend
# % 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ı

Dizin yapısı
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
bbappend — THISDIR ve PN açıklaması
# ${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özdizimDavranış
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ı.

meta-myproduct/conf/machine/mymachine.conf
#@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ı

FeatureEtkisi
usbhostlibusb, usbutils kurulumu etkinleştirilir
wifiwireless-tools, iw, wpa_supplicant bağımlılıkları eklenir
bluetoothbluez5 ve kernel bluetooth modülleri eklenir
alsaalsa-lib, alsa-utils bağımlılıkları eklenir
screenGrafik yığını (DRM/KMS) desteği eklenir
opteeOP-TEE TEE çerçevesi etkinleştirilir
pciPCI 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.

meta-myproduct/conf/distro/mydistro.conf
#@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ı

FeatureEtkisi
systemdsystemd init sistemi kullanılır
ipv6IPv6 yığını etkinleştirilir
nfsNFS istemci desteği eklenir
pamPAM kimlik doğrulama kütüphanesi eklenir
seccompseccomp sistem çağrısı filtresi etkinleştirilir
selinuxSELinux MAC desteği eklenir
x11X11 grafik yığını eklenir
openglOpenGL/EGL desteği eklenir
İPUCU

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.

layer.conf — bağımlılık bildirimi
# 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

bash
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ıDurumLAYERSERIES_COMPAT değeri
4.0kirkstoneLTS"kirkstone"
4.2mickledoreEOL"mickledore"
5.0scarthgapLTS"scarthgap"
5.1styheadStable"styhead"
5.2walnascarDev"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.

bash — temel layer kontrolü
# 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
bash — yocto-check-layer (kapsamlı test)
# 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

layer.conf varlığıconf/layer.conf dosyasının bulunması zorunludur
LAYERSERIES_COMPATAktif Yocto sürümüyle uyumluluk kontrolü
LAYERDEPENDSTüm bağımlı layer'ların BBLAYERS'a eklenmiş olması
Recipe sözdizimiTüm .bb ve .bbappend dosyalarının parse edilebilir olması
BBFILES desenleriGlob desenlerin gerçek dosyalarla eşleşmesi

Bu bölümde

  • bitbake-layers check-layer — statik layer analizi
  • --no-network — offline ortamda kullanım
  • yocto-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 — tam yapı
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

meta-myproduct/recipes-core/images/myproduct-image.bb
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

meta-myproduct/recipes-apps/myapp/myapp_1.0.0.bb
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

bash — build ve doğrulama
# 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