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
| Özellik | Standard SDK | eSDK |
|---|---|---|
| Oluşturma komutu | bitbake -c populate_sdk <image> | bitbake -c populate_sdk_ext <image> |
| Boyut | 1–3 GB (sysroot dahil) | Full: 5–20 GB; Minimal: 300–800 MB |
| Kurulum | Self-extracting .sh script | Self-extracting .sh script |
| Araçlar | gcc, ld, ar, make, cmake cross files | gcc + devtool + bitbake + layer'lar |
| Recipe ekleme | Desteklenmez | devtool add ile |
| Cihaza deploy | Manuel kopyalama | devtool deploy-target |
| Güncellenebilirlik | Hayır — yeniden üretmek gerekir | Evet — devtool sdk-update |
| Kullanım amacı | CI/CD, basit uygulama geliştirme | Aktif ürün geliştirme, recipe yazma |
Ne zaman hangisi?
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.
# 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-linux | Environment setup script — source ile aktive edilir |
site-config-cortexa53-poky-linux | autotools config.site dosyası |
# 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.
# 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şken | Değer |
|---|---|
CC | aarch64-poky-linux-gcc [flags] |
CXX | aarch64-poky-linux-g++ [flags] |
LD | aarch64-poky-linux-ld |
AR | aarch64-poky-linux-ar |
STRIP | aarch64-poky-linux-strip |
CFLAGS | Arch-specific ve hardening bayrakları |
LDFLAGS | Sysroot ve rpath ayarları |
PKG_CONFIG_PATH | Hedef sysroot'taki .pc dosyaları |
PKG_CONFIG_SYSROOT_DIR | Hedef sysroot kök dizini |
CMAKE_PREFIX_PATH | CMake find_package için sysroot |
CMake cross file
# 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).
# 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
# 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
# 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.
# 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ı
/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
# 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-updateile 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.
# 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
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
}
#!/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
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ı
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ı
# 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
# 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
# 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
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ı
[
{
"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"
}
}
]
{
"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ü
# 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ü