Yocto İleri Düzey
TEKNİK REHBER YOCTO İLERİ SDK & eSDK 2026

SDK & eSDK
Cross-Development

Yocto'nun cross-geliştirme ortamları — Standard SDK ile hazır toolchain, eSDK ile devtool entegrasyonlu interaktif geliştirme, Docker ve CI entegrasyonu.

00 Yocto SDK türleri

Yocto, iki tür SDK üretir: self-contained cross-toolchain sunan Standard SDK ve devtool entegrasyonlu, genişletilebilir Extensible SDK (eSDK).

Karşılaştırma

ÖzellikStandard SDKeSDK
Oluşturma komutubitbake -c populate_sdk <image>bitbake -c populate_sdk_ext <image>
Boyut1–3 GB (sysroot dahil)Full: 5–20 GB; Minimal: 300–800 MB
KurulumSelf-extracting .sh scriptSelf-extracting .sh script
Araçlargcc, ld, ar, make, cmake cross filesgcc + devtool + bitbake + layer'lar
Recipe eklemeDesteklenmezdevtool add ile
Cihaza deployManuel kopyalamadevtool deploy-target
GüncellenebilirlikHayır — yeniden üretmek gerekirEvet — devtool sdk-update
Kullanım amacıCI/CD, basit uygulama geliştirmeAktif ürün geliştirme, recipe yazma

Ne zaman hangisi?

Standard SDK kullanCI/CD pipeline'ında uygulama derleme, belirli sysroot'a bağımlı sabit build, CMake cross file ile entegrasyon
eSDK kullanAktif recipe geliştirme, yeni paket ekleme, cihaza interaktif deploy, offline geliştirme ortamı kurma

Bu bölümde

  • Standard SDK: cross-toolchain + sysroot — sabit, boyutu küçük
  • eSDK: Standard SDK + devtool + BitBake — esnek, büyük
  • CI için Standard SDK; aktif geliştirme için eSDK

01 Standard SDK oluşturma

populate_sdk task'ı, image'ın sysroot'unu ve cross-toolchain'ini self-extracting bir .sh installer olarak paketler.

bash — SDK üretme
# Image için SDK üret
bitbake -c populate_sdk myproduct-image

# Çıktı dosyası
ls -lh tmp/deploy/sdk/
# poky-glibc-x86_64-myproduct-image-cortexa53-mymachine-toolchain-5.0.sh
# Dosya adı: poky-glibc-<host arch>-<image>-<target tune>-<machine>-toolchain-<version>.sh

# Küçük bir package için SDK (daha hızlı)
bitbake -c populate_sdk core-image-minimal

SDK içeriği

Dizin (kurulum sonrası)İçerik
sysroots/x86_64-pokysdk-linux/Host araçları: gcc, ld, cmake, pkg-config (cross versiyonlar)
sysroots/cortexa53-poky-linux/Hedef sysroot: header'lar, kütüphaneler, .pc dosyaları
environment-setup-cortexa53-poky-linuxEnvironment setup script — source ile aktive edilir
site-config-cortexa53-poky-linuxautotools config.site dosyası
local.conf — SDK konfigürasyonu
# SDK içine eklenecek ek paketler (hedef sysroot'a)
TOOLCHAIN_TARGET_TASK:append = " openssl-dev libgpiod-dev mosquitto-dev"

# SDK içine eklenecek host araçları
TOOLCHAIN_HOST_TASK:append = " nativesdk-cmake nativesdk-ninja"

# Hedef ve host mimarisi
SDK_TARGET_ARCH = "aarch64"      # ARM 64-bit hedef
SDK_HOST_ARCH = "x86_64"         # x86-64 geliştirici makinesi

Bu bölümde

  • bitbake -c populate_sdk <image> — .sh installer üretir
  • SDK içinde host araçlar (cross-gcc) + hedef sysroot (header/lib)
  • TOOLCHAIN_TARGET_TASK ile sysroot'a ek paket eklenir

02 Standard SDK kullanımı

SDK kurulumdan sonra environment-setup-* scripti source ile aktive edilir. Bu, tüm cross-compile araçlarını ve ortam değişkenlerini ayarlar.

bash — SDK kurulum ve aktifleştirme
# SDK'yı kur (varsayılan: /opt/poky/5.0/)
chmod +x poky-glibc-x86_64-myproduct-image-cortexa53-mymachine-toolchain-5.0.sh
./poky-glibc-x86_64-myproduct-image-cortexa53-mymachine-toolchain-5.0.sh

# Kurulum dizinini belirt
./poky-...-toolchain-5.0.sh -d /opt/myproduct-sdk

# SDK ortamını aktive et
source /opt/myproduct-sdk/environment-setup-cortexa53-poky-linux

# Ortam değişkenlerini kontrol et
echo $CC
# aarch64-poky-linux-gcc  -mcpu=cortex-a53 -march=armv8-a+crc \
#   -fstack-protector-strong  -O2 ...

$CC --version
# aarch64-poky-linux-gcc (GCC) 13.2.0

Ayarlanan ortam değişkenleri

DeğişkenDeğer
CCaarch64-poky-linux-gcc [flags]
CXXaarch64-poky-linux-g++ [flags]
LDaarch64-poky-linux-ld
ARaarch64-poky-linux-ar
STRIPaarch64-poky-linux-strip
CFLAGSArch-specific ve hardening bayrakları
LDFLAGSSysroot ve rpath ayarları
PKG_CONFIG_PATHHedef sysroot'taki .pc dosyaları
PKG_CONFIG_SYSROOT_DIRHedef sysroot kök dizini
CMAKE_PREFIX_PATHCMake find_package için sysroot

CMake cross file

bash — CMake ile SDK kullanımı
# SDK aktif edildiğinde cmake cross file otomatik ayarlanır
source /opt/myproduct-sdk/environment-setup-cortexa53-poky-linux

# SDK, cmake için toolchain file üretir
echo $OECORE_NATIVE_SYSROOT
# /opt/myproduct-sdk/sysroots/x86_64-pokysdk-linux

# CMake projesini cross-compile et
mkdir build && cd build
cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake \
    -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)

# Üretilen binary kontrolü
file myapp
# myapp: ELF 64-bit LSB executable, ARM aarch64

Bu bölümde

  • source environment-setup-* — tüm ortam değişkenlerini ayarlar
  • $CC, $CXX, $PKG_CONFIG_PATH otomatik cross-compile için ayarlanır
  • OEToolchainConfig.cmake ile CMake cross-compile sorunsuz çalışır

03 eSDK oluşturma

eSDK (Extensible SDK), Standard SDK'ya ek olarak BitBake, devtool ve layer yapısını da içerir. İki mod desteklenir: full (tüm build altyapısı) ve minimal (devtool komutları ile lazy yükleme).

bash — eSDK üretme
# eSDK üret
bitbake -c populate_sdk_ext myproduct-image

# Çıktı
ls tmp/deploy/sdk/
# poky-glibc-x86_64-myproduct-image-cortexa53-mymachine-toolchain-ext-5.0.sh
#                                                                        ^^^
# "ext" suffix — Extensible SDK

SDK_EXT_TYPE — full vs minimal

local.conf — eSDK türü
# Full eSDK: tüm sstate-cache ve layer'lar dahil — büyük, tam offline
SDK_EXT_TYPE = "full"

# Minimal eSDK: sadece devtool altyapısı, paketler gerektiğinde indirilir
SDK_EXT_TYPE = "minimal"

# Minimal eSDK için mirror server (paketler buradan indirilir)
SDK_UPDATE_URL = "http://esdk-server.mycompany.com/esdk/"

# eSDK içine dahil edilecek recipe'ler
SDK_LAYERS += "meta-myproduct"

# eSDK kurulum boyutunu kontrol et
# full: ~5-20 GB (image'a bağlı)
# minimal: ~300-800 MB

eSDK kurulumu

bash — eSDK kurulum
# eSDK'yı kur
./poky-...-toolchain-ext-5.0.sh -d /opt/myproduct-esdk

# eSDK ortamını aktive et
source /opt/myproduct-esdk/environment-setup-cortexa53-poky-linux

# devtool artık kullanılabilir
devtool --version
devtool status

Bu bölümde

  • bitbake -c populate_sdk_ext — eSDK üretir
  • SDK_EXT_TYPE=full: offline tam build; minimal: küçük, lazy yükleme
  • Kurulum ve kaynak yükleme Standard SDK ile aynı

04 eSDK içinde devtool

eSDK içindeki devtool, Yocto build sunucusuna bağlı olmadan çalışır. Geliştiriciler offline olarak recipe ekleyip düzenleyebilir.

bash — eSDK içinde devtool add
# eSDK aktive
source /opt/myproduct-esdk/environment-setup-cortexa53-poky-linux

# Offline: yerel tarball'dan recipe ekle
devtool add mylib /home/dev/mylib-1.0.tar.gz

# Online: upstream'den
devtool add libfoo https://github.com/example/libfoo.git

# Derle
devtool build mylib

# Cihaza deploy et
devtool deploy-target mylib root@192.168.1.100

# eSDK workspace'ini göster
devtool status

eSDK layer yapısı

eSDK dizin yapısı
/opt/myproduct-esdk/
├── environment-setup-cortexa53-poky-linux
├── sysroots/
│   ├── x86_64-pokysdk-linux/     ← host araçları (devtool, bitbake, cmake...)
│   └── cortexa53-poky-linux/     ← hedef sysroot
├── layers/                       ← Gömülü layer'lar (full modda)
│   ├── meta/
│   ├── meta-poky/
│   └── meta-myproduct/
└── workspace/                    ← devtool add/modify sonrası çalışma alanı

eSDK güncelleme

bash — eSDK güncelleme
# SDK_UPDATE_URL ayarlanmışsa SDK'yı güncelle
devtool sdk-update

# Belirli bir URL'den güncelle
devtool sdk-update http://esdk-server.mycompany.com/esdk/

# Belirli sürüme güncelle
devtool sdk-update --version 1.5.0 http://esdk-server.mycompany.com/esdk/

Bu bölümde

  • eSDK içindeki devtool Yocto build sunucusu gerektirmez
  • Full modda layer'lar eSDK'ya gömülür — tam offline geliştirme
  • devtool sdk-update ile yeni SDK sürümüne geçilebilir

05 SDK özelleştirme

Hem Standard SDK hem de eSDK, TOOLCHAIN_TARGET_TASK, SDK_EXTRA_DEMO_PACKAGES ve özel environment script'leriyle özelleştirilebilir.

local.conf — SDK özelleştirme
# Hedef sysroot'a eklenecek -dev paketleri
TOOLCHAIN_TARGET_TASK:append = " \
    openssl-dev \
    libgpiod-dev \
    mosquitto-dev \
    libcurl-dev \
    protobuf-dev \
    grpc-dev \
    "

# Host araçları (native SDK araçları)
TOOLCHAIN_HOST_TASK:append = " \
    nativesdk-cmake \
    nativesdk-ninja \
    nativesdk-protobuf \
    nativesdk-python3 \
    "

# eSDK içine eklenecek demo paketler
SDK_EXTRA_DEMO_PACKAGES = "myapp mylib"

# eSDK içine eklenecek layer'lar (full modda)
SDK_LAYERS += "meta-myproduct meta-openembedded/meta-oe"

Özel environment script

meta-myproduct/recipes-sdk/environment-setup-hook.bb
SUMMARY = "MyProduct SDK environment hook"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

# SDK environment setup dosyasına eklenecek script
SDK_POST_INSTALL_COMMAND = "$target_sdk_dir/environment-setup-hook.sh"

inherit sdk-provides-dummy-target nativesdk

SRC_URI = "file://environment-setup-hook.sh"

do_install() {
    install -d ${D}${SDKPATHNATIVE}/
    install -m 0755 ${WORKDIR}/environment-setup-hook.sh \
        ${D}${SDKPATHNATIVE}/environment-setup-hook.sh
}
environment-setup-hook.sh
#!/bin/bash
# Bu script SDK aktive edildiğinde source edilir

# Proje-özgü kısayollar
export MYPRODUCT_SDK_DIR="${OECORE_NATIVE_SYSROOT}"
export MYPRODUCT_SYSROOT="${SDKTARGETSYSROOT}"

# Cmake kısayol fonksiyonu
myproduct_cmake() {
    cmake -DCMAKE_TOOLCHAIN_FILE="${OECORE_NATIVE_SYSROOT}/usr/share/cmake/OEToolchainConfig.cmake" \
          -DCMAKE_INSTALL_PREFIX=/usr \
          "$@"
}
export -f myproduct_cmake

echo "MyProduct SDK aktive — hedef: cortexa53"

Bu bölümde

  • TOOLCHAIN_TARGET_TASK ile sysroot'a -dev paketleri eklenir
  • TOOLCHAIN_HOST_TASK ile host araçlar (cmake, ninja, protoc) eklenir
  • environment-setup-hook ile SDK aktive olduğunda özel değişkenler ayarlanır

06 CI/CD'de SDK

Standard SDK, Docker container içinde reproducible CI build ortamı oluşturmak için idealdir — toolchain versiyonu sabittir, container'dan container'a aynı sonucu verir.

Docker ile SDK container

Dockerfile — SDK tabanlı build container
FROM ubuntu:22.04

# Bağımlılıkları kur
RUN apt-get update && apt-get install -y \
    cmake ninja-build pkg-config git \
    libssl-dev python3 python3-pip \
    && rm -rf /var/lib/apt/lists/*

# SDK'yı container'a kopyala ve kur
COPY poky-...-toolchain-5.0.sh /tmp/sdk.sh
RUN chmod +x /tmp/sdk.sh && \
    /tmp/sdk.sh -d /opt/myproduct-sdk -y && \
    rm /tmp/sdk.sh

# SDK environment script'ini entegre et
RUN echo 'source /opt/myproduct-sdk/environment-setup-cortexa53-poky-linux' \
    >> /etc/bash.bashrc

# Build zamanında aktive
SHELL ["/bin/bash", "-c"]
ENV BASH_ENV=/opt/myproduct-sdk/environment-setup-cortexa53-poky-linux

WORKDIR /workspace
CMD ["/bin/bash"]

GitHub Actions ile SDK kullanımı

.github/workflows/build.yml
name: Build MyApp

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-22.04
    container:
      image: mycompany/myproduct-sdk:5.0
      credentials:
        username: ${{ secrets.REGISTRY_USER }}
        password: ${{ secrets.REGISTRY_TOKEN }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Configure
        run: |
          source /opt/myproduct-sdk/environment-setup-cortexa53-poky-linux
          cmake -B build \
            -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake \
            -DCMAKE_BUILD_TYPE=Release

      - name: Build
        run: |
          source /opt/myproduct-sdk/environment-setup-cortexa53-poky-linux
          cmake --build build --parallel

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: myapp-aarch64
          path: build/myapp

Sysroot paylaşımı

bash — sysroot tarball paylaşımı
# Sysroot'u sıkıştır ve paylaş (SDK kurulmadan)
tar -czf sysroot-cortexa53.tar.gz \
    -C /opt/myproduct-sdk/sysroots cortexa53-poky-linux/

# Başka bir makinede aç
tar -xzf sysroot-cortexa53.tar.gz -C /opt/sysroot/

# CMake ile kullan
cmake .. \
    -DCMAKE_SYSROOT=/opt/sysroot/cortexa53-poky-linux \
    -DCMAKE_C_COMPILER=aarch64-poky-linux-gcc \
    -DCMAKE_CXX_COMPILER=aarch64-poky-linux-g++

Bu bölümde

  • SDK'yı Dockerfile'a gömerek reproducible CI container oluştur
  • GitHub Actions / GitLab CI'da SDK container — her build aynı toolchain
  • Sysroot tarball olarak da paylaşılabilir — tam SDK kurulumu gerekmez

07 Pratik: eSDK ile offline geliştirme ortamı

Docker + eSDK + VSCode CMake yapılandırması ile ağ bağlantısı olmayan bir ortamda eksiksiz embedded geliştirme ortamı kurulumu.

1. Full eSDK üret ve transfer et

bash — eSDK üretim (build sunucusunda)
# Build sunucusunda (internet erişimi var)
source /home/user/poky/oe-init-build-env build/

# Full eSDK ayarla ve üret
echo 'SDK_EXT_TYPE = "full"' >> conf/local.conf
echo 'SDK_LAYERS += "meta-myproduct"' >> conf/local.conf
echo 'TOOLCHAIN_TARGET_TASK:append = " openssl-dev libgpiod-dev"' >> conf/local.conf

bitbake -c populate_sdk_ext myproduct-image

# eSDK dosyasını geliştirici makinesine transfer et
scp tmp/deploy/sdk/poky-...-toolchain-ext-5.0.sh \
    dev@devmachine:/tmp/

2. Geliştirici makinesinde eSDK kur

bash — kurulum (geliştirici makinesi)
# eSDK'yı kur (internet gerekmez — full mod)
chmod +x /tmp/poky-...-toolchain-ext-5.0.sh
/tmp/poky-...-toolchain-ext-5.0.sh -d /opt/myproduct-esdk

# eSDK'yı aktive et
source /opt/myproduct-esdk/environment-setup-cortexa53-poky-linux

# devtool kontrolü
devtool status
# Workspace boş — hazır

3. Docker container ile izole ortam

Dockerfile — eSDK geliştirme container'ı
FROM ubuntu:22.04

RUN apt-get update && apt-get install -y \
    git cmake ninja-build pkg-config \
    python3 gawk wget diffstat \
    && rm -rf /var/lib/apt/lists/*

# eSDK installer kopyala ve kur
COPY poky-...-toolchain-ext-5.0.sh /tmp/esdk.sh
RUN chmod +x /tmp/esdk.sh && \
    /tmp/esdk.sh -d /opt/myproduct-esdk -y && \
    rm /tmp/esdk.sh

# Geliştirici kullanıcısı
RUN useradd -m -s /bin/bash dev
USER dev
WORKDIR /home/dev

# Shell'de eSDK otomatik aktive
RUN echo 'source /opt/myproduct-esdk/environment-setup-cortexa53-poky-linux' \
    >> /home/dev/.bashrc

CMD ["/bin/bash", "-l"]

4. VSCode CMake yapılandırması

.vscode/cmake-kits.json
[
  {
    "name": "MyProduct eSDK — ARM Cortex-A53",
    "toolchainFile": "/opt/myproduct-esdk/sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake",
    "environmentVariables": {
      "PKG_CONFIG_SYSROOT_DIR": "/opt/myproduct-esdk/sysroots/cortexa53-poky-linux",
      "PKG_CONFIG_PATH": "/opt/myproduct-esdk/sysroots/cortexa53-poky-linux/usr/lib/pkgconfig:/opt/myproduct-esdk/sysroots/cortexa53-poky-linux/usr/share/pkgconfig",
      "CC": "aarch64-poky-linux-gcc",
      "CXX": "aarch64-poky-linux-g++"
    },
    "cmakeSettings": {
      "CMAKE_BUILD_TYPE": "Debug",
      "CMAKE_INSTALL_PREFIX": "/usr"
    }
  }
]
.vscode/settings.json — CMake ayarları
{
  "cmake.defaultKit": "MyProduct eSDK — ARM Cortex-A53",
  "cmake.buildDirectory": "${workspaceFolder}/build-arm",
  "cmake.installPrefix": "/usr",
  "cmake.generator": "Ninja",
  "cmake.configureArgs": [
    "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
  ],
  "clangd.arguments": [
    "--compile-commands-dir=${workspaceFolder}/build-arm"
  ]
}

5. devtool ile offline geliştirme döngüsü

bash — offline devtool döngüsü
# eSDK aktive
source /opt/myproduct-esdk/environment-setup-cortexa53-poky-linux

# Yerel kaynak dizininden recipe ekle (offline)
devtool add mylib /home/dev/mylib-src

# Derle
devtool build mylib

# Cihaza deploy et (lokal ağ üzerinden)
devtool deploy-target mylib root@192.168.1.100

# Cihazda test
ssh root@192.168.1.100 "/usr/bin/mylib-test"

# Değişiklikler tamamlandığında workspace'i kaydet
devtool finish mylib /home/dev/meta-myproduct

Bu bölümde

  • Full eSDK build sunucusunda üretilir, geliştirici makinesine bir kez transfer edilir
  • Docker container ile izole ve tekrarlanabilir geliştirme ortamı
  • VSCode cmake-kits.json ile IDE cross-compile entegrasyonu
  • devtool add/build/deploy/finish — internet olmadan tam geliştirme döngüsü