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

devtool
İnteraktif Geliştirme

Yocto'nun en verimli geliştirme döngüsü — add, modify, build, deploy ve finish ile upstream'den cihaza hızlı iterasyon.

00 devtool nedir?

devtool, eSDK'nın (Extensible SDK) merkezi aracıdır. Recipe oluşturma, düzenleme, build ve hedef cihaza deploy işlemlerini tek araç üzerinden hızlı bir döngüyle yönetmenizi sağlar.

Workspace kavramı

devtool, değişikliklerinizi workspace layer adlı geçici bir layer içinde tutar. Bu layer, BBLAYERS'a otomatik eklenir ve üzerinde çalıştığınız recipe'nin kaynak kodunu, otomatik üretilmiş recipe dosyasını ve yapılandırmaları barındırır.

  devtool add / modify
         ↓
  workspace/ (geçici layer)
  ├── appends/       ← recipe override'lar
  ├── conf/          ← layer.conf
  └── sources/       ← kaynak kod (düzenlenebilir)
         ↓
  bitbake <recipe>  → sstate-cache üzerinden normal build
         ↓
  devtool deploy-target → SSH ile cihaza kopyala
         ↓
  devtool finish → değişiklikleri gerçek layer'a taşı + workspace temizle
    

Kullanım senaryoları

Yeni paket ekleGitHub/tarball URL'sinden recipe otomatik oluştur — CMake/autotools tanınır
Mevcut recipe düzenleUpstream kaynak kodunu workspace'e kopyala, değiştir, patch üret
Sürüm yükseltUpstream'in yeni sürümüne geçerken patch'leri otomatik uyarla
Hızlı prototipCihaz üzerinde geliştir, değişiklikleri layer'a sonradan kaydet
bash — devtool erişim
# devtool, Poky source tree içinde gelir
# Build ortamını kaynak yap
source /home/user/poky/oe-init-build-env build/

# Tüm komutları listele
devtool --help

# Belirli bir komut yardımı
devtool add --help

# Workspace durumunu görüntüle
devtool status

Bu bölümde

  • devtool = eSDK'nın merkez aracı — add, modify, upgrade, build, deploy, finish
  • workspace layer'ı geçici bir çalışma ortamı sağlar
  • devtool finish ile tüm değişiklikler gerçek layer'a aktarılır

01 devtool add

devtool add, bir kaynak URL'sinden veya yerel dizinden yeni bir recipe otomatik olarak oluşturur. Build sistemi (CMake, autotools, Meson) tanınır ve recipe iskeleti üretilir.

bash — temel kullanım
# Tarball URL'sinden recipe oluştur
devtool add libmicrohttpd \
    https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.77.tar.gz

# Git deposundan recipe oluştur
devtool add myapp \
    https://github.com/example/myapp.git

# Yerel kaynak dizininden recipe oluştur
devtool add myapp /home/user/myapp-src

# Sürümü açıkça belirterek
devtool add --version 1.2.3 myapp \
    https://github.com/example/myapp.git

Otomatik algılama

Dosya / İzAlgılanan Build SistemiSeçilen Class
CMakeLists.txtCMakecmake
configure.acautoconf/automakeautotools
meson.buildMesonmeson
setup.py / pyproject.tomlPythonsetuptools3
Cargo.tomlRust/Cargocargo
MakefileMakeManuel görevler
bash — add sonrası workspace
# devtool add sonrası workspace yapısı
ls workspace/
# appends/libmicrohttpd.bbappend
# conf/layer.conf
# recipes/libmicrohttpd/libmicrohttpd_0.9.77.bb  ← otomatik üretildi
# sources/libmicrohttpd/  ← kaynak kodu burada

# Üretilen recipe'yi incele
cat workspace/recipes/libmicrohttpd/libmicrohttpd_0.9.77.bb

# Kaynak dizinine gir ve düzenle
cd workspace/sources/libmicrohttpd/

Bu bölümde

  • URL (tarball/git) veya yerel dizinden recipe otomatik oluşturulur
  • CMake, autotools, Meson, Python, Rust build sistemi otomatik tanınır
  • Üretilen recipe workspace/recipes/ içinde düzenlenebilir

02 devtool modify

devtool modify, mevcut bir recipe'nin kaynak kodunu workspace içine alır ve üzerinde değişiklik yapmanızı sağlar. Upstream recipe yerinde kalır; değişiklikler sadece workspace'te tutulur.

bash — modify kullanımı
# Mevcut bir recipe'yi workspace'e al
devtool modify busybox

# Kaynak kodu workspace/sources/busybox/ dizinine kopyalanır
# Workspace layer aktive edilir — normal bitbake bunu kullanır

# Kaynak dizinine git ve değişiklik yap
cd workspace/sources/busybox/
vim networking/wget.c

# Değişikliği commit et
git add networking/wget.c
git commit -m "wget: add custom timeout option"

# devtool status ile hangi recipe'lerin modify modunda olduğunu gör
devtool status

modify seçenekleri

bash — gelişmiş kullanım
# --no-extract: Sadece recipe override oluştur, kaynağı kopyalama
devtool modify --no-extract myapp

# Halihazırda indirilmiş kaynak ile modify
devtool modify --srcdir /home/user/existing-source myapp

# Workspace'teki değişiklikleri görüntüle
cd workspace/sources/myapp
git log --oneline origin/HEAD..HEAD

# Tüm değişiklikleri diff olarak göster
git diff origin/HEAD HEAD
NOT

devtool modify ile workspace'e alınan recipe için bitbake myapp komutunu çalıştırdığınızda BitBake, orijinal recipe yerine workspace'teki kodu kullanır. Bu, orijinal layer'daki recipe'yi etkilemez.

Bu bölümde

  • devtool modify recipe — kaynağı workspace'e al
  • Kaynak dizini normal bir git deposu gibi davranır
  • devtool finish ile commit'ler patch'e dönüştürülüp layer'a eklenir

03 devtool upgrade

devtool upgrade, mevcut bir recipe'yi upstream'in yeni sürümüne günceller. Mevcut patch'leri yeni sürüme uyarlamaya çalışır ve çakışmaları gösterir.

bash — sürüm yükseltme
# Belirli bir sürüme yükselt
devtool upgrade --version 0.9.78 libmicrohttpd

# Belirli bir git commit'e yükselt
devtool upgrade --srcrev abc123def456 myapp

# Otomatik sürüm tespiti (upstream tarball URL deseniyle)
devtool upgrade libmicrohttpd

# Yükseltme sonrası workspace yapısı
# workspace/recipes/libmicrohttpd/libmicrohttpd_0.9.78.bb  ← yeni sürüm
# workspace/sources/libmicrohttpd/  ← yeni sürüm kaynağı
# Eski patch'ler uygulanmaya çalışılır

Patch çakışması çözümü

bash — patch uyarlama
# Çakışan patch'leri kontrol et
cd workspace/sources/libmicrohttpd
git status
# CONFLICT (content): Merge conflict in src/microhttpd.c

# Çakışmayı çöz
vim src/microhttpd.c    # çakışmaları düzelt
git add src/microhttpd.c
git am --continue

# Çakışan patch'i tamamen yeniden yaz
git am --abort
git cherry-pick <original-commit-sha>
# Manuel düzenleme sonrası
git add -A
git commit --amend

Bu bölümde

  • devtool upgrade --version X.Y.Z — hedef sürümü belirt
  • Mevcut patch'ler yeni sürüme otomatik uygulanmaya çalışılır
  • Çakışmalar git am ile çözülür, ardından devtool finish ile tamamlanır

04 devtool build ve deploy

Workspace'te değişiklik yaptıktan sonra devtool build ile derleyip devtool deploy-target ile doğrudan hedef cihaza aktarabilirsiniz.

devtool build

bash — build
# Workspace'teki recipe'yi derle
devtool build libmicrohttpd

# Alternatif: normal bitbake da çalışır (workspace layer aktif)
bitbake libmicrohttpd

# Sadece belirli bir task
bitbake -c compile libmicrohttpd

# Build logunu takip et
bitbake libmicrohttpd 2>&1 | tee /tmp/build.log

devtool deploy-target

bash — SSH ile cihaza deploy
# Hedef cihaza SSH ile deploy et
# root@192.168.1.100 — cihazın SSH adresi
devtool deploy-target libmicrohttpd root@192.168.1.100

# Port belirt
devtool deploy-target -s "ssh -p 2222" libmicrohttpd root@192.168.1.100

# Dry-run: neyin kopyalanacağını göster, gerçekten kopyalama
devtool deploy-target --dry-run libmicrohttpd root@192.168.1.100

# Önceki deploy'ı temizle ve yeniden deploy et
devtool deploy-target --strip libmicrohttpd root@192.168.1.100

# Deploy edilen dosyaları cihazdan kaldır
devtool undeploy-target libmicrohttpd root@192.168.1.100

Hedef sistem gereksinimleri

GereksinimAçıklama
SSH sunucuHedef image'da OpenSSH kurulu ve çalışıyor olmalı
root erişimi/usr/lib, /usr/bin gibi sistem dizinlerine yazma yetkisi gerekli
Ağ bağlantısıHost ve hedef aynı ağda veya yönlendirilebilir konumda
SSH keyParola yerine SSH key authentication önerilir
İPUCU

Image'a EXTRA_IMAGE_FEATURES += "ssh-server-openssh debug-tweaks" ekleyerek SSH erişimini ve root login'i kolayca aktif edebilirsiniz. debug-tweaks sadece geliştirme image'larında kullanın!

Bu bölümde

  • devtool build veya bitbake — workspace kaynağını derler
  • devtool deploy-target recipe root@IP — SSH ile cihaza kopyalar
  • devtool undeploy-target — deploy edilen dosyaları cihazdan siler

05 devtool finish

devtool finish, workspace'teki tüm değişiklikleri (yeni commit'ler) patch dosyasına dönüştürür ve hedef layer'a yazar. Workspace temizlenir.

bash — finish ile layer'a yaz
# Değişiklikleri hedef layer'a taşı ve workspace'i temizle
devtool finish libmicrohttpd /home/user/meta-myproduct

# Finish ne yapar:
# 1. workspace/sources/libmicrohttpd/ içindeki yeni commit'leri bulur
# 2. Her commit'i git format-patch ile .patch dosyasına dönüştürür
# 3. Patch'leri meta-myproduct/recipes-libs/libmicrohttpd/ içine kopyalar
# 4. .bb ve .bbappend dosyalarını layer'a günceller
# 5. workspace'teki recipe girişini siler

# Dry-run: neyin yazılacağını gör
devtool finish --dry-run libmicrohttpd /home/user/meta-myproduct

# Force: mevcut dosyaların üzerine yaz
devtool finish --force libmicrohttpd /home/user/meta-myproduct

finish sonrası layer yapısı

Layer'a yazılan dosyalar
meta-myproduct/recipes-libs/libmicrohttpd/
├── libmicrohttpd_0.9.77.bb         ← güncellenmiş recipe
└── libmicrohttpd/
    ├── 0001-fix-memory-leak.patch  ← commit'ten üretilen patch
    └── 0002-add-custom-header.patch
bash — workspace'i tamamen temizle
# Workspace'ten bir recipe'yi kaldır (finish yapmadan)
devtool reset libmicrohttpd

# Tüm workspace'i temizle
devtool reset --all

# Workspace durumunu kontrol et
devtool status

Bu bölümde

  • devtool finish recipe /path/to/layer — değişiklikleri layer'a yaz
  • Her git commit otomatik olarak .patch dosyasına dönüşür
  • devtool reset — değişiklikleri kaydetmeden workspace'i temizler

06 devshell

devshell, belirli bir recipe'nin tam cross-compile ortamıyla başlatılan interaktif bir kabuktur. Derleme sorunlarını manuel olarak debug etmek için kullanılır.

bash — devshell açma
# myapp için interaktif cross-compile shell aç
bitbake -c devshell myapp

# Shell açılır — WORKDIR/sources/ içindesiniz
# Tüm ortam değişkenleri ayarlıdır:
# CC=aarch64-poky-linux-gcc
# LD=aarch64-poky-linux-ld
# CFLAGS=-O2 -march=armv8-a ...
# PKG_CONFIG_PATH=.../staging/usr/lib/pkgconfig

# devshell içinde — manuel derleme test
$CC -o test_compile test.c
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake .
make -j4

# devshell içinde ortam değişkenlerini görüntüle
env | grep -E '^(CC|LD|AR|CFLAGS|LDFLAGS|PKG_CONFIG)'

# Çıkış
exit

devshell'de kullanılabilir değişkenler

DeğişkenDeğer ÖrneğiKullanım
CCaarch64-poky-linux-gccC derleyici
CXXaarch64-poky-linux-g++C++ derleyici
LDaarch64-poky-linux-ldLinker
ARaarch64-poky-linux-arArşivleyici
CFLAGS-O2 -march=armv8-a ...C derleme bayrakları
STAGING_DIR_TARGETtmp/sysroots/cortexa53Hedef sysroot dizini
PKG_CONFIG_PATHsysroot/usr/lib/pkgconfigKütüphane keşfi
SKaynak dizini yoluKaynak kodu konumu
BBuild dizini yoluDerleme çıktılarının konumu
devshell — PKG_CONFIG kullanımı
# devshell içinde bir kütüphanenin flag'lerini kontrol et
pkg-config --cflags --libs openssl
# -I/path/to/sysroot/usr/include -lssl -lcrypto

# Belirli bir kütüphanenin sysroot'ta olup olmadığını kontrol et
pkg-config --exists libmicrohttpd && echo "Mevcut"

Bu bölümde

  • bitbake -c devshell recipe — cross-compile ortamlı interaktif shell
  • CC, CXX, CFLAGS, PKG_CONFIG_PATH otomatik ayarlıdır
  • Manuel derleme, link hatası debug ve pkg-config kontrolü için kullanılır

07 Pratik: libmicrohttpd döngüsü

Açık kaynak kütüphane ekle → patch yaz → cihaza deploy et → layer'a taşı. libmicrohttpd üzerinden tam devtool döngüsü.

1. Kütüphaneyi workspace'e ekle

bash — adım 1: add
# Build ortamını aktive et
source /home/user/poky/oe-init-build-env build/

# libmicrohttpd'yi workspace'e ekle
devtool add libmicrohttpd \
    https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.77.tar.gz

# Otomatik üretilen recipe'yi gör
cat workspace/recipes/libmicrohttpd/libmicrohttpd_0.9.77.bb

2. Kaynak koda patch yaz

bash — adım 2: patch
# Kaynak dizine git
cd workspace/sources/libmicrohttpd/

# Bir değişiklik yap — örneğin özel log prefix ekle
vim src/microhttpd/internal.c
# "MHD" prefix'ini "MyProduct-MHD" olarak değiştir

# Değişikliği commit et
git add src/microhttpd/internal.c
git commit -m "microhttpd: add MyProduct log prefix"

3. Derle ve cihaza deploy et

bash — adım 3: build ve deploy
# Build dizinine geri dön
cd /home/user/poky/build/

# Derle
devtool build libmicrohttpd

# Build başarılı — cihaza deploy et
# Hedef: 192.168.1.100 adresindeki ARM board
devtool deploy-target libmicrohttpd root@192.168.1.100

# Cihazda test et
ssh root@192.168.1.100 "ldconfig && myapp_using_mhd --test"
# Çıktı: [MyProduct-MHD] Server started on port 8080

4. Değişiklikleri layer'a taşı

bash — adım 4: finish
# Değişiklikleri meta-myproduct layer'ına yaz
devtool finish libmicrohttpd /home/user/meta-myproduct

# Layer'da ne oluştu?
find /home/user/meta-myproduct -name "*microhttpd*"
# meta-myproduct/recipes-libs/libmicrohttpd/libmicrohttpd_0.9.77.bb
# meta-myproduct/recipes-libs/libmicrohttpd/libmicrohttpd/
#   0001-microhttpd-add-MyProduct-log-prefix.patch

# Layer'dan build et — workspace artık yok
devtool status   # libmicrohttpd yok
bitbake libmicrohttpd   # layer'dan derlenir

Tam döngü özeti

  devtool add libmicrohttpd <URL>
         ↓
  workspace/sources/libmicrohttpd/ içinde değişiklik + git commit
         ↓
  devtool build libmicrohttpd
         ↓
  devtool deploy-target libmicrohttpd root@192.168.1.100
         ↓
  Cihazda test — başarılı ✓
         ↓
  devtool finish libmicrohttpd /home/user/meta-myproduct
         ↓
  meta-myproduct/recipes-libs/libmicrohttpd/
  ├── libmicrohttpd_0.9.77.bb
  └── libmicrohttpd/
      └── 0001-add-MyProduct-log-prefix.patch
    

Bu bölümde

  • add → kaynak kod workspace'te, recipe otomatik üretildi
  • git commit → patch kaynağı; deploy-target → SSH ile cihaza
  • finish → commit'ler .patch'e dönüşür, layer'a yazılır, workspace temizlenir
  • Tam döngü: URL'den cihaza test, cihazdan layer'a — sıfır manuel adım