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ı
# 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.
# 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 / İz | Algılanan Build Sistemi | Seçilen Class |
|---|---|---|
CMakeLists.txt | CMake | cmake |
configure.ac | autoconf/automake | autotools |
meson.build | Meson | meson |
setup.py / pyproject.toml | Python | setuptools3 |
Cargo.toml | Rust/Cargo | cargo |
Makefile | Make | Manuel görevler |
# 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.
# 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
# --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
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.
# 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ü
# Ç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
# 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
# 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
| Gereksinim | Açıklama |
|---|---|
| SSH sunucu | Hedef 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 key | Parola yerine SSH key authentication önerilir |
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 buildveyabitbake— workspace kaynağını derlerdevtool deploy-target recipe root@IP— SSH ile cihaza kopyalardevtool 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.
# 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ı
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
# 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.
# 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şken | Değer Örneği | Kullanım |
|---|---|---|
CC | aarch64-poky-linux-gcc | C derleyici |
CXX | aarch64-poky-linux-g++ | C++ derleyici |
LD | aarch64-poky-linux-ld | Linker |
AR | aarch64-poky-linux-ar | Arşivleyici |
CFLAGS | -O2 -march=armv8-a ... | C derleme bayrakları |
STAGING_DIR_TARGET | tmp/sysroots/cortexa53 | Hedef sysroot dizini |
PKG_CONFIG_PATH | sysroot/usr/lib/pkgconfig | Kütüphane keşfi |
S | Kaynak dizini yolu | Kaynak kodu konumu |
B | Build dizini yolu | Derleme çıktılarının konumu |
# 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
# 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
# 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
# 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şı
# 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