Cross-compilation — compiler ishlayotgan host platformadan boshqa target platforma uchun executable yoki kutubxona yaratish jarayonidir. Masalan, x86-64 Linux serverda ARM embedded qurilma uchun firmware qurish mumkin. Host build vositalarini, target esa yakuniy kod ishlaydigan architecture, operatsion tizim va ABI’ni bildiradi.
Toolchain qismlari
Cross-toolchain target instruction chiqaruvchi compiler, assembler, linker va binary utilitylardan iborat. Target triple architecture, vendor, OS va ABI variantini ifodalaydi. Compiler faqat instructionni bilishi yetmaydi; target header, startup object va standard library joylashgan sysroot ham kerak.
Build vaqtida ishlaydigan generator host uchun, mahsulot tarkibiga kiradigan library target uchun compile qilinadi. Build system bu ikki dependency graphni ajratmasa target binaryni hostda ishga tushirishga urinish yoki host object’ni targetga linklash xatosi yuz beradi.
ABI va muhit
Bir architecture ichida ham endianness, pointer o‘lchami, calling convention va floating-point ABI farq qilishi mumkin. Linux target uchun libc turi ham muhim. Header yangi, target runtime eski bo‘lsa symbol runtime’da topilmasligi mumkin. Sysroot aynan qo‘llab-quvvatlanadigan image yoki SDK’dan olinadi.
CPU baseline tanlovi tarqatish doirasini belgilaydi. Qurilma qo‘llamaydigan instruction compiler flag sabab binaryga kirsa build muvaffaqiyatli, ishga tushish esa muvaffaqiyatsiz bo‘ladi. Hardware feature runtime detection yoki alohida paket bilan boshqariladi.
Build tizimi
CMake toolchain file yoki boshqa build konfiguratsiyasi compiler, sysroot va search pathni ko‘rsatadi. pkg-config host library pathini tasodifan qaytarmasligi uchun target metadata bilan sozlanadi. Build hostdagi /usr/includega yashirin tayanmasa hermetic natija chiqadi.
Code generator, protocol compiler va resource packer host tool sifatida avval quriladi. Generated source keyin target compilerga beriladi. Configure script “test dasturini compile va run qil” desa cross build’da run bosqichi emulator yoki oldindan berilgan capability bilan almashtiriladi.
Test va emulation
QEMU kabi emulator target binaryni hostda ishga tushirishga yordam beradi, ammo timing, device driver va real hardware xatti-harakatini to‘liq bermaydi. Unit testlarning platformadan mustaqil qismi hostda tez ishlashi, target-specific integration esa emulator va haqiqiy qurilmada bajarilishi mumkin.
Firmware testida flashing, boot log va hardware-in-the-loop avtomatlashtiriladi. Crash address target debug symbol va architecture-aware debugger bilan tahlil qilinadi. Byte order va alignment xatolari ayniqsa serializatsiya hamda memory-mapped registerlarda sinovdan o‘tadi.
Ta’minot zanjiri
Toolchain versiyasi pin qilinadi va checksum bilan tekshiriladi. Bir xil source turli compiler versiyasida boshqa code yoki ABI berishi mumkin. Reproducible build flaglari timestamp va host pathlarini artifactdan chiqaradi. Yakuniy paket target nomi, minimum runtime, debug symbol va SBOM bilan nashr qilinadi.
Reproducible container toolchain
Build container compiler va sysrootni izolyatsiya qiladi, lekin container tag o‘zgaruvchan bo‘lsa takrorlanuvchanlik bermaydi. Image digest, SDK checksum va environment pin qilinadi. Host kernel va filesystem semantics baribir buildga ta’sir qilishi mumkin; case-sensitive path va executable bit tekshiriladi. Parallel build nondeterministic archive order yaratmasligi kerak. Target artifact emulator testidan keyin hardware model, bootloader va firmware versioni bilan compatibility matritsaga bog‘lanadi. Field update noto‘g‘ri architecture paketini qabul qilmasligi uchun manifest target ID va signature’ni device’da tekshiradi.
Bog‘liq tushunchalar
Toolchain, Target triple, Sysroot, ABI, Emulator, Embedded system, Reproducible build