GNU C Kütüphanesi bir makine ve işletim sistemine kolayca uyarlanabilecek şekilde yazılmıştır. Makine ve işletim sistemi bağımlı işlevler yeni bir makine veya işletim sistemi için gerçeklenimler ayrı dizinler halinde kolayca eklenebilir. Bu bölümde kütüphane kaynak kodu ağacının yerleşimi ile kullanılacak makine bağımlı kodu seçecek mekanizmalar anlatılacaktır.
Tüm makine ve işletim sistemi bağımlı dosyalar kütüphane kaynak kodunun ana dizini altındaki
sysdeps dizininde bulunurlar. Bu dizinin kendi alt dizinlerinden oluşan bir hiyerarşisi vardır (bkz.
Hiyerarşi Uzlaşımları).
sysdeps dizininin altındaki her dizin belli bir makine veya işletim sistemi için kaynak dosyaları içerir (örneğin, belli bir üreticiye ait sistemler veya IEEE 754 kayan nokta biçimini kullanan tüm makineler). Bir yapılandırma bu alt dizinlerin sıralı bir listesini içerir. Her alt dizin kendi üst dizinini bu listeye dolaylı olarak ekler. Örneğin listeyi unix/bsd/vax olarak belirtirseniz bu, unix/bsd/vax unix/bsd unix listesine eşdeğerdir. Ayrıca bir alt dizin doğrudan dizin hiyerarşisinde bulunmayan başka bir alt dizine uygulanabilir. Bir alt dizinde Implies adında bir dosya varsa ve içinde sysdeps dizinindeki Implies dosyasını içeren dizinin altındaki dizinlerden oluşan bir liste varsa, bunlar listeye eklenirler. Implies dosyasında # ile başlayan satırlar açıklamalar olarak yoksayılırlar. Örneğin, unix/bsd/Implies dosyasında şunlar olsun:
# BSD has Internet-related things.
unix/inet
ve unix/Implies dosyası da şunu içersin:
Bu durumda son liste unix/bsd/vax unix/bsd unix/inet unix posix olur.
sysdeps dizininde generic isminde "özel" bir dizin bulunur. Daima dolaylı olarak altdizin listesine eklenir, böylece onu bir Implies dosyasına koymanız gerekmez. Ancak onun altına yeni bir özel kategori olacağını düşünerek bir alt dizin eklememelisiniz. generic dizini iki amaca hizmet eder. İlki; Makefile dosyaları, generic dizininde olmayan bir dosyanın sistem bağımlı bir sürümüne bakma endişesi duymazlar. Yani bir sistem bağımlı kaynak dosyası, diğer platformalarda gerçeklenmeyen yordamlar içeriyorsa bile, generic içinde benzeri olmalıdır. İkincisi; Makefile dosyaları bir sistem bağımlı dosyanın sisteme özel bir sürümünü derlemek için bulamıyorsa bu dosyanın generic sürümü kullanılır.
Bir
generic dosyasında makineden bağımsız C yordamlarını sadece kütüphanedeki makineden bağımsız işlevleri kullanarak gerçekleştirebiliyorsanız, öyle yapmalısınız. Aksi takdirde onları içiboş işlevler yapın. Bir
içiboş (stub) işlev belli bir makine ya da işletim sistemi için gerçeklenemeyen bir işlevdir (yani adı var kendi yok). İçiboş işlevler daima bir hata döndürür ve
errno değişkenine
ENOSYS (İşlev gerçeklenmedi) hatasını atarlar. Bkz.
Hata Bildirme. Bir içiboş işlev tanımlayacaksanız, işlevin tanımından sonra,
işlev bu işlevin ismi olmak üzere
stub_warning(işlev) deyimini eklemelisiniz; ayrıca bu dosyaya
stub-tag.h başlık dosyasını dahil etmelisiniz. Bu işlem, işlevin
gnu/stubs.h dosyasında listelenmesini ve bu işlev kullanıldığında GNU ld'nin uyarı vermesini sağlar.
Nadiren bazı işlevler sadece belli sistemlerde kullanılabilir, diğerlerinde tanımlanmazlar; bunlar sistem bağımsız kaynak kodun bir yerlerinde ya da Makefile dosyalarında (generic dizini dahil) bulunmazlar, sadece o belli sistemlerin altdizinlerindeki Makefile dosyalarında bulunurlar.
Eğer ana kaynak dizininlerinden birindeki bir dosyanın makine ya da işletim sistemine bağlı sürümünü yazmak isterseniz o dosyayı sysdeps/generic içine taşımalı ve kendi gerçeklemenizi sisteme özel altdizinde yazmalısınız. Yalnız, sistem bağımlı bir dosyanın ana kaynak dizinlerinden birinde bulunmaması gerektiğine dikkat edin.
sysdeps altdizinlerinin her birinde mevcut olması gereken bir kaç özel dosya vardır:
- Makefile
O makine ya da makine sınıfı ve işletim sistemi için bir make dosyası. Bu dosya, ana kaynak dizinindeki ve onun alt dizinlerindeki Makefile dosyalarının Makerules'u tarafından içerilir. İçerildiği Makefile dosyalarının değişken kümesini değiştirebilir ya da yeni kurallar ekleyebilir. Farklı değişken kümelerinin ve kütüphanenin farklı bölümlerinin kurallarının seçilmesi için subdir değişkenini temel alan GNU make koşullu yönergelerini kullanabilir. Ayrıca, kütüphaneye dahil edilecek ek modülleri make değişkeni sysdep-routines'e atayabilir. Modülleri eklemek için routines değil sysdep-routines değişkenini kullanmalısınız çünkü birincisi ana kaynak dizinindeki alt dizinlerden nelerin dağıtıma gireceğini belirtmek için kullanılır.
Her alt dizinin Makefile dosyası, alt dizin listesinde bulundukları sırayla aranırlar. Birden fazla sistem bağımlı Makefile içerileceğinden her birinin basitçe atanması yerine sysdep-routines'e eklenebilir:
sysdep-routines := $(sysdep-routines) foo bar
- Subdirs
Bu sistemin dosyaları için ana dizin olan dizinin altındaki tüm dizinlerin isimlerini içeren dosya. Bu altdizinler, kütüphane kaynak ağacındaki sistem bağımsız altdizinler gibi işlem görür.
Bu sysdeps altdizinindeki sistem için gerçeklenen kütüphane tamamen yeni işlevler ve başlık dosyalarından oluşacaksa bunu kullanın. Örneğin, sysdeps/unix/inet/Subdirs dosyası inet içerir; inet dizininde sadece interneti destekleyen sistemlerdeki kütüphane içinde yer alacak çeşitli ağ yönlenimli işlemler bulunur.
- configure
Bu dosya yapılandırma için kullanılan bir kabuk betiğidir. Ana kaynak dizinindeki configure betiği seçilen her sistem bağımlı dizindeki configure betiğini kabuğun . komutunu kullanarak okur. configure betikleri genelde configure.in dosyalarından Autoconf tarafından üretilir.
Bir sistem bağımlı configure betiği genellikle DEFS ve config_vars kabuk değişkenlerine birşeyler ekler; ayrıntılar için ana kaynak dizinindeki configure betiğine bakınız. Bu betik, ana kaynak dizinindeki configure betiğinin --with-paket seçeneğiyle çalıştırılması sonucunda etkin olur. --with-paket=değer gibi bir seçenekle configure betiği with_paket değişkenine (paket ismindeki tire işaretlerini altçizgiye dönüştürülerek) değer değerini atar; eğer seçenek --with-paket şeklinde argümansız olarak belirtilirse, with_paket değişkenine yes değerini atar.
- configure.in
Bu dosya Autoconf tarafından bu dizin içinde configure betiğini oluşturmakta kullanılır. Autoconf ile ilgili açıklamalar için Autoconf Kılavuzundaki Giriş (Introduction) bölümüne bakınız. Ya configure betiğini ya da configure.in dosyasını yazmalısınız, ikisini birden değil. configure.in dosyasındaki ilk satırda bir m4 makrosu olan GLIBC_PROVIDES çağrılmalıdır. Bu makro ana kaynak dizinindeki configure betiğinin kullandığı Autoconf makroları için çeşitli AC_PROVIDE çağrıları yapar; bunsuz bu makrolar Autoconf tarafınfan yine de gerekmediği halde çağrılabilir.
Böylece genel sistem, sistem bağımlılıklarından yalıtılır.