docs: add roadmap and V8 d8 wrapper

This commit is contained in:
abdussamedulutas 2026-07-28 23:44:54 +03:00
parent d51f1053cd
commit 10a5fe8dac
2 changed files with 484 additions and 0 deletions

475
ROADMAP.md Normal file
View File

@ -0,0 +1,475 @@
# Kubbe Roadmap
Son güncelleme: 2026-07-28
Kubbe, Chromium/CEF ağırlığını taşımayan, C++22 ile yazılan, SDL3 + Skia + V8 tabanlı gömülü web işleme motoru olarak tasarlanıyor. Hedef son kullanıcı tarayıcısı değil; uygulamaların içine gömülebilen, modüler, test edilebilir ve gerektiğinde ayrı executable/shared-library artifactleriyle çalışabilen bir toolbox/engine mimarisi.
## Ne yaptık
### Git ve repo düzeni
- Git geçmişi sıfırlandı ve temiz `main` geçmişiyle remote güncellendi.
- Büyük kaynak ağaçları doğrudan commitlenmeyecek şekilde `.gitignore` düzenlendi.
- Şu klasörler bilinçli olarak ignore edildi:
- `vendor/source/`
- `vendor/cache/`
- `vendor/tools/`
- `vendor/work/`
- `out/`
- `.toolchains/`
- `spec/`
- `scripts/`
- `.codewhale/`
- Commit batch sınırı fiilen uygulandı: 700 MiB üstü staged içerik commitlenmeyecek.
### Proje iskeleti
- CMake tabanlı C++ proje iskeleti oluşturuldu.
- CMake presetleri, vendor bağlama dosyaları, compiler cache, warning ve sanitizer hazırlıkları eklendi.
- `modules/` ve `tests/` ayrımı oluşturuldu.
- `tools/doctor.sh` ve vendor doğrulama/script altyapısı eklendi.
### Vendor kaynakları
Kaynak ağaçları yerelde tutuluyor, ancak Git’e alınmıyor.
- SDL3 kaynakları indirildi.
- Vulkan headers/loader kaynakları indirildi.
- Skia kaynakları indirildi.
- V8 kaynakları indirildi.
- ccache, Valgrind ve test araçları için yerel hazırlık yapıldı.
- Vendor doğrulama script’i çalıştırıldı ve vendor setinin yerelde var olduğu doğrulandı.
### Derlenmiş artifactler
Derlenmiş çıktılar kaynak ağaçlarının dışına, `vendor/artifacts/` altına taşındı ve Git’e alındı.
Mevcut artifact boyutları:
- `vendor/artifacts/sdl`: yaklaşık 8.5 MiB
- `vendor/artifacts/vulkan`: yaklaşık 40 MiB
- `vendor/artifacts/skia`: yaklaşık 36 MiB
- `vendor/artifacts/v8`: yaklaşık 233 MiB
Tamamlanan artifact commitleri:
- `719abce` — SDL3 ve Vulkan artifactleri
- `d3d1643` — Skia shared artifact
- `d51f105` — V8 shared artifact
### SDL3
- SDL3 Release/shared olarak derlendi.
- Header, shared library, CMake config ve pkg-config çıktıları `vendor/artifacts/sdl` altına paketlendi.
### Vulkan
- Vulkan headers kuruldu.
- Vulkan loader Release olarak derlendi.
- Header, loader shared library ve CMake config çıktıları `vendor/artifacts/vulkan` altına paketlendi.
### Skia
- Skia Release/component build olarak derlendi.
- OpenGL, EGL, Vulkan, X11, SVG ve PDF destekleri açık derlendi.
- `libskia.so`, public include dosyaları ve build argümanları `vendor/artifacts/skia` altına paketlendi.
- Not: Skia şu an bazı sistem kütüphanelerine dinamik bağlıdır. Tam taşınabilir paket için ileride fontconfig/freetype/png/jpeg/webp/harfbuzz vb. bağımlılık stratejisi ayrıca kararlaştırılacak.
### V8
- V8 Release/component build olarak derlendi.
- `d8` hedefi başarıyla üretildi.
- V8 sandbox gereksinimi nedeniyle bundled libc++ ile derlendi.
- V8 tarafında standart release özellikleri varsayılan olarak açık kabul edilecek; JIT, Maglev, Sparkplug, TurboFan, Wasm ve modern ECMAScript özellikleri bilinçli bir karar olmadan kapatılmayacak.
- Runtime test yapıldı:
- `vendor/artifacts/v8/bin/d8 -e 'console.log("kubbe-v8-ok")'`
- Çıktı: `kubbe-v8-ok`
- `libv8.so`, V8 yardımcı shared libraryleri, `d8`, headerlar, ICU data ve snapshot dosyaları `vendor/artifacts/v8` altına paketlendi.
## Ne yapmadık
### Henüz motor kodu yazmadık
Şu aşamada bilinçli olarak `main.cpp` veya rendering loop kodu yazılmadı. Önce ağır altyapı ve vendor/artifact stratejisi sabitlendi.
Henüz yapılmayanlar:
- SDL3 pencere açma kodu
- OpenGL/Vulkan context kurulumu
- Skia surface/context bağlama
- Kırmızı dikdörtgen smoke test’i
- Event loop ve kapanma sinyali yönetimi
### HTML/CSS/DOM katmanlarına başlamadık
Alt seviye piksel/render köprüsü kurulmadan üst katmanlara girilmeyecek.
Henüz yapılmayanlar:
- HTML tokenizer
- DOM node modeli
- CSS parser
- CSS cascade/computed style
- Flexbox layout
- Grid layout
- Painting pipeline
- Hit testing
- Event dispatch
- JavaScript DOM binding
### V8 entegrasyonu yapılmadı
V8 derlendi ve paketlendi, ancak Kubbe koduna bağlanmadı.
Henüz yapılmayanlar:
- CMake tarafında V8 import target doğrulaması
- Minimal V8 embed smoke test
- Isolate/context lifecycle
- C++ object ↔ JavaScript wrapper modeli
- DOM binding stratejisi
- Script execution scheduling
### Skia entegrasyonu yapılmadı
Skia derlendi ve paketlendi, ancak Kubbe runtime’a bağlanmadı.
Henüz yapılmayanlar:
- OpenGL/Vulkan backend seçimi
- SDL3 native window handle alma
- Skia GPU context kurulumu
- Render surface lifecycle
- Resize handling
- Frame begin/end/discard akışı
### Modül mimarisi henüz uygulanmadı
Modüler build hedefi kabul edildi, ancak kod tarafında uygulanmadı.
Henüz yapılmayanlar:
- Her ana modülün ayrı shared library/executable olması
- İç modüller arası link/import düzeni
- Test edilebilir modül sınırları
- Runtime plugin ABI tasarımı
- Debug symbol/symbol visibility politikası
Not: Kubbe modülleri dış dünyaya public plugin sistemi olarak açılmayacak. Modüller Kubbe’nin iç parçaları olacak; aynı versiyonda birlikte değişebilirler.
### Spec kaynakları Git’e alınmadı
WHATWG HTML, WHATWG DOM ve Servo gibi referans kaynaklar çalışma materyali olarak düşünülüyor. Bunların tam kaynak ağaçları Git’e alınmadı.
Sebep:
- Repo boyutunu kontrol altında tutmak.
- Kubbe kodu ile referans/spec kaynaklarını karıştırmamak.
- İleride spec kaynakları için ayrı fetch/update mekanizması kullanmak.
## Mimari hedefler
### Genel yön
- C++22
- CMake + Ninja öncelikli build
- Modüler shared-library/executable artifact yaklaşımı
- Her aşama kendi içinde test edilebilir olacak
- Önce pencere/grafik/piksel güvenilirliği, sonra HTML/CSS/JS
- Modern standartlara odaklanma:
- modern HTML
- modern DOM
- modern CSS
- flexbox
- grid
- gradient, border radius, transform, opacity gibi pratik çizim ihtiyaçları
### Başlangıç ilkesi
İlk gerçek motor kodu şu işi yapmalı:
1. SDL3 başlat.
2. Boş pencere aç.
3. OpenGL veya Vulkan context kur.
4. Skia’yı bu context’e bağla.
5. Ekrana kırmızı bir dikdörtgen çiz.
6. Sonsuz event loop içinde pencere kapanma sinyalini dinle.
7. Temiz kapan.
Bu aşama geçmeden HTML, CSS veya V8 entegrasyonuna geçilmeyecek.
## Yakın plan
### Faz 0 — Build ve artifact doğrulama
Amaç: Vendor artifactlerinin Kubbe CMake projesi tarafından doğru import edildiğini kanıtlamak.
Yapılacaklar:
- SDL3 import target doğrulaması.
- Vulkan import target doğrulaması.
- Skia import target doğrulaması.
- V8 import target doğrulaması.
- `tests/vendor_smoke` altında küçük build/link testleri.
- `LD_LIBRARY_PATH`/rpath stratejisinin netleştirilmesi.
- Linux debug/release presetlerinin ayrıştırılması.
Çıkış kriteri:
- Temiz clone + artifactler ile CMake configure/build başarılı olmalı.
- SDL3, Skia ve V8 için ayrı smoke executablelar çalışmalı.
### Faz 1 — Platform ve pencere modülü
Amaç: Kubbe’nin işletim sistemiyle konuşan en alt katmanını kurmak.
Önerilen modül:
- `modules/platform`
Yapılacaklar:
- SDL3 lifecycle wrapper.
- Window abstraction.
- Event pump.
- Resize, close, keyboard/mouse eventlerinin temel modeli.
- Hata/log raporlama.
Çıkış kriteri:
- `kubbe_platform_smoke` boş pencere açıp kapanabilmeli.
### Faz 2 — Grafik backend köprüsü
Amaç: SDL3 penceresi ile Skia arasında güvenilir çizim köprüsü kurmak.
Önerilen modül:
- `modules/graphics`
Yapılacaklar:
- İlk backend tercihini netleştir:
- kısa yol: OpenGL
- daha uzun vadeli yol: Vulkan
- Skia GPU context oluşturma.
- Surface oluşturma/yok etme.
- Swap/present akışı.
- Resize sonrası surface yenileme.
- Kırmızı dikdörtgen smoke test.
Çıkış kriteri:
- `kubbe_graphics_smoke` pencere açıp Skia ile kırmızı dikdörtgen çizmeli.
- Pencere kapanırken crash/leak olmamalı.
### Faz 3 — Test ve debug standardı
Amaç: Proje büyümeden hata yakalama alışkanlığını sabitlemek.
Yapılacaklar:
- ASan preset.
- UBSan preset.
- Debug symbol politikası.
- ccache entegrasyonu.
- Valgrind kullanım notları.
- Render smoke testlerinde görüntü doğrulama yaklaşımı:
- framebuffer readback
- golden image
- toleranslı pixel diff
- headless/CI uygunluğu
Çıkış kriteri:
- En az bir sanitizer build çalışmalı.
- En az bir render test otomatik doğrulanmalı.
### Faz 4 — Çekirdek veri modelleri
Amaç: HTML/CSS’e geçmeden önce engine iç veri modellerini ayırmak.
Önerilen modüller:
- `modules/base`
- `modules/dom`
- `modules/html`
- `modules/css`
- `modules/layout`
- `modules/paint`
- `modules/js`
Yapılacaklar:
- Ortak string/encoding stratejisi.
- Arena/allocator stratejisi.
- Node ownership modeli.
- Error/result tipi.
- Logging/tracing formatı.
Çıkış kriteri:
- Her modül tek başına build edilebilir ve minimal test edilebilir olmalı.
### Faz 5 — HTML tokenizer ve DOM
Amaç: Modern HTML’i bellekte DOM düğümlerine çevirmek.
Yapılacaklar:
- Basit tokenizer.
- Element/text/comment node modeli.
- Attribute modeli.
- Minimal parser tree construction.
- WHATWG HTML spec ile test senaryoları seçimi.
Çıkış kriteri:
- Basit HTML string’i parse edilip DOM ağacı snapshot olarak test edilebilmeli.
### Faz 6 — CSS ve layout
Amaç: DOM düğümlerini CSS kurallarına göre ölçüp konumlandırmak.
Yapılacaklar:
- CSS tokenizer/parser.
- Selector matching.
- Cascade.
- Computed style.
- Box tree.
- Block layout.
- Flexbox.
- Grid.
Çıkış kriteri:
- Test HTML/CSS girdisinden beklenen box tree/layout snapshot’ı üretilebilmeli.
### Faz 7 — Paint pipeline
Amaç: Layout sonuçlarını Skia komutlarına çevirmek.
Yapılacaklar:
- Display list.
- Background/border çizimi.
- Text çizimi.
- Gradient.
- Border radius.
- Clip.
- Transform.
- Opacity/layering.
Çıkış kriteri:
- Basit HTML/CSS dokümanı Skia ile görsel olarak çizilebilmeli.
- Golden image testleri başlamalı.
### Faz 8 — V8 binding
Amaç: C++ DOM dünyasını JavaScript dünyasına bağlamak.
Yapılacaklar:
- V8 isolate/context lifecycle.
- Script execution API.
- DOM wrapper prototipi.
- Event loop ile microtask entegrasyonu.
- Basit `document.createElement`/`appendChild` benzeri API prototipi.
Çıkış kriteri:
- JavaScript kodu DOM ağacını değiştirebilmeli ve render çıktısı değişmeli.
### Faz 9 — JavaScript debugging ve Inspector
Amaç: Kubbe içinde çalışan JavaScript’i harici debug araçlarıyla gözlenebilir hale getirmek.
Notlar:
- V8 native olarak DAP sunmaz.
- V8 tarafındaki temel debug entegrasyonu `v8-inspector` ve Chrome DevTools Protocol/CDP modelidir.
- VS Code/DAP entegrasyonu gerekiyorsa DAP doğrudan V8’den değil, CDP ile konuşan ayrı bir debug adapter üzerinden sağlanır.
Yapılacaklar:
- `v8_inspector` entegrasyonunu araştır.
- Script origin, source URL, breakpoint, pause/resume, step-over/step-into akışlarını prototiple.
- Inspector mesajlarını taşıyacak minimal WebSocket endpoint tasarla.
- DevTools frontend veya CDP uyumlu araçlarla bağlantı denemesi yap.
- Event loop duraklatma/devam ettirme davranışını Kubbe runtime ile uyumlu hale getir.
Çıkış kriteri:
- Kubbe içinde çalışan basit bir script’e breakpoint konulabilmeli.
- Stack trace, local/global değişkenler ve console mesajları debug aracı tarafından görülebilmeli.
## Açık teknik kararlar
### OpenGL mi Vulkan mı?
İlk smoke test için OpenGL daha hızlı sonuç verir. Vulkan daha modern ve kontrollü yol olabilir, ancak başlangıç maliyeti daha yüksek.
Pragmatik öneri:
- İlk kırmızı dikdörtgen testini OpenGL + Skia ile yapmak.
- Vulkan backend’i ikinci grafik backend olarak eklemek.
### Artifact paketleme stratejisi
Şu an artifactler Git’e alınıyor. Batch sınırı 700 MiB.
İleride karar verilecek:
- Artifactler Git içinde kalacak mı?
- Ayrı release asset sistemi kurulacak mı?
- Local bootstrap script artifactleri indirecek mi?
- Platform başına artifact dizini ayrılacak mı?
### Spec kaynakları
Spec kaynakları çalışma referansı olarak gerekli, ancak repo içine tam kaynak olarak alınmamalı.
Öneri:
- `tools/spec/sync-*` scriptleri yazmak.
- Spec kaynaklarını `spec/` altında local-only tutmak.
- Gerekli notları/çıkarımları Kubbe dokümanlarına taşımak.
### Modül sınırları
Her modül ayrı derlenebilir olmalı, ancak dışarıya stabil ABI sözü verilmeyecek.
Öneri:
- İç modüller shared library olabilir.
- Smoke/test executableları ayrı olmalı.
- Ortak sembol/export politikası erken belirlenmeli.
- Cross-module ownership mümkün olduğunca açık tutulmalı.
## Kısa vadeli yapılacaklar
1. `ROADMAP.md` sonrası CMake import targetlarını doğrula.
2. SDL3 smoke executable yaz.
3. Skia + OpenGL smoke executable yaz.
4. V8 embed smoke executable yaz.
5. Runtime path/rpath stratejisini sabitle.
6. ASan/UBSan presetlerini çalışır hale getir.
7. Render output için golden image test altyapısını tasarla.
8. İlk gerçek `main.cpp` için karar ver:
- sadece demo executable mı?
- yoksa `kubbe_shell` gibi ayrı runtime mı?
## Başarı tanımı
Bu roadmap’in ilk büyük kilometre taşı:
- Temiz CMake build alınacak.
- SDL3 pencere açacak.
- Skia pencereye kırmızı dikdörtgen çizecek.
- Event loop stabil kapanacak.
- V8 ayrı smoke test olarak JavaScript çalıştıracak.
- Bu üç parça birbirine karıştırılmadan test edilecek.
Bu tamamlanmadan HTML/CSS/DOM/V8 binding gibi üst katmanlara geçilmeyecek.

9
vendor/artifacts/v8/bin/d8-wrapper vendored Executable file
View File

@ -0,0 +1,9 @@
#!/usr/bin/env sh
set -eu
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
v8_root=$(CDPATH= cd -- "$script_dir/.." && pwd)
export LD_LIBRARY_PATH="$v8_root/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
exec "$script_dir/d8" "$@"