OpenJDK İnşa(Building) Part13
OpenJDK build ile ilgili önceki yazılarıma aşağıdaki linklerden ulaşabilirsiniz.
OpenJDK serisinin 1.bölümü için Link
OpenJDK serisinin 2.bölümü için Link
OpenJDK serisinin 3.bölümü için Link
OpenJDK serisinin 4.bölümü için Link
OpenJDK serisinin 5.bölümü için Link
OpenJDK serisinin 6.bölümü için Link
OpenJDK serisinin 7.bölümü için Link
OpenJDK serisinin 8.bölümü için Link
OpenJDK serisinin 9.bölümü için Link
OpenJDK serisinin 10.bölümü için Link
OpenJDK serisinin 11.bölümü için Link
OpenJDK serisinin 12.bölümü için Link
OpenJDK build serisinin 12.bölümünde “Hata-Problem Giderme” başlığı üzerinde yoğunlaşmıştık.Bu bölümde yine aynı başlık üzerinden devam ederek,build sürecinde ortaya çıkan problemlere çözüm yaklaşımı,ipuçları vb. konularını inceleyeceğiz.
Belirli Derleme Sorunları
Kapsamlı projeler üzerinde çalışırken genel problemlerin yanı sıra,belirli-özel problemler meydana gelebilir. Bu problemleri genel olanlardan ayıran bazı özellikler vardır.
Bunlar: Problemlerin ortaya çıkış biçimi,problemlerin bağlı olduğu proje modülü ve verdikleri mesajlar olarak ayırt edebilir ve tüm bunların neticesinde,problemleri çözme sürecinde de belirli ipuçları elde ederiz.
Clock Skew(Saat Eğimi/Çarpık Zaman)
Buna benzer bir hata mesajı alırsanız:
File 'xxx' has modification time in the future.
Clock skew detected. Your build may be incomplete.
Bu hatanın sonucunda,derleme yaptığınız makinenizdeki saat-zaman ile kaynak dosyalardaki saat-zaman damgalarıyla senkronize olmadığı görülüyor. Eğer bu uyarı mesajlarını görürseniz,derleme yaptığınız makinenizdeki saati sıfırlayın,aşağıdaki komutla make sürecini temizleyin ve derlemeyi yeniden başlatın.
make clean
Yetersiz Bellek Hataları(Out of Memory)
Windows ortamında derleme yapıyorsanız aşağıdaki gibi bir hata mesajı alabilirsiniz:
fatal error - couldn't allocate heap
cannot create ... Permission denied
spawn failed
Bu bir “Cygwin” sorununun işareti olabilir. Cygwin kurulumu ve diğer bilgiler için OpenJDK build yazı serimizdeki “Cygwin” bölümünü inceleyin.
Ayrıca bilgisayarınızı yeniden başlatmak geçici olarak yardımcı olabilir.
Path İçindeki Boşluklar:
Windows’ta,konfigurasyon sırasında “fixpath.sh” bazı dizin adlarında boşluk olduğunu bildirebilir.
Genellikle bu,dizinlerin kısa yolları olduğunu varsayar.
Konfigurasyon sürecinde bu tür boşluk barındıran klasörere erişilebilmesi için aşağıdaki komutu cmd’de ilgili dizinlerde çalıştırarak isteğe bağlı/rastgele isim atayabilirsiniz .
fsutil file setshortname
Yardım Almak
Bu belgedeki önerilerden hiçbiri size yardımcı olmuyorsa veya derleme sisteminden kaynaklı bir hata olduğunu ve bulduğunuzu düşünüyorsanız,lütfen “dev@openjdk.java.net” adresine e-mail göndererek “Build Group” ile iletişime geçin. Ayrıca soru ve sorunlarınızı yorum olarak da bu konu altında paylaşabilirsiniz. İletişime geçerken veya konu altında problemleri bildirirken,problem ile ilgili log çıktılarını eklemeyi unutmayın. Şayet JDK geliştirme konusunda genel olarak yardıma ihtiyacınız varsa ve/veya tavsiyeleriniz varsa JDK “Adoption Group” ile iletişime geçebilirsiniz.
İleri Düzey Kullanıcılar için İpuçları ve Öneriler
Bash Completion(Komut Tamamlama)
Bildiğimiz gibi;kod yazmak için tasarlanmış editörler(IDE,vb),genel olarak kod tamamlama özelliğin barındırır. Bu özellik sayesinde,kullanacağımız komutun tamamını yazmak yerine,belli bir karakter yazarak komutun tamamına ulaşabiliyoruz. Buna benzer yapı,komut satırı penceresinde de mevcut.
Yani Uçbirim(linux)’de komut yazarken,<tab> veya <tab><tab> yaparak yazmakta olduğumuz komutu otomatik olarak tamamlayabiliriz. Bu özelliği kullanmak için “./bashrc” dosyası içinde komut tamamlamanın aktif olması gerekir. Bu konuda işletim sisteminizde komut talimatları ile ilgili kısımları inceleyin.
Komut tamamlama özelliği,tamamen geçerli komutlara yönelik çalışır. Yani konsolda(Uçbirim,cmd) yazdığınız komutun geçerli bir komut olması gerekir. Aksi halde isteğinize cevap vermeyecektir.
Örneğin “make jdk-i<tab>” şeklinde bir komut girişi yaptığınızda,
”make jdk-image” şeklinde komutu otomatik olarak tamamlayacaktır.
Komut tamamlama özelliği “configure” komutları üzerinde etkili çalışmıyorsa,aşağıdaki script’i konsol ekranında çalıştırarak veya bir bash dosyası olarak oluşturup çalıştırarak “configure” süreci için yardımcı bir özellik seti oluşturabilirsiniz.Komut satırında çalıştırmak için script:
cat << EOT > /tmp/configure
#!/bin/bash
if [ \$(pwd) = \$(cd \$(dirname \$0); pwd) ] ; then
echo >&2 "Abort: Trying to call configure helper recursively"
exit 1
fibash \$PWD/configure "\$@"
EOT
chmod +x /tmp/configure
sudo mv /tmp/configure /usr/local/bin
Bash dosyası(dosya yolu “/tmp” dizini varsayılmıştır) olarak oluşturmak için script:
#!/bin/bash
if [ \$(pwd) = \$(cd \$(dirname \$0); pwd) ] ; then
echo >&2 "Abort: Trying to call configure helper recursively"
exit 1
fi
bash \$PWD/configure "\$@"
Daha sonra konsol ekranında aşağıdaki komutları sırasıyla çalıştırın:
chmod +x /tmp/configure
sudo mv /tmp/configure /usr/local/bin
Bu işlemden sonra “configure — en<tab>-dt<tab>” şeklinde komutu yazmaya çalıştığınızda,otomatik olarak “configure — enable-dtrace” şeklinde tamamlayacaktır.
Çoklu Konfigürasyon İle Çalışmak
Tek bir kaynak deposu için birden fazla konfigürasyona sahip olabilirsiniz. Çoklu konfigürasyonlar oluştururken onlara isim-ad vererek erişimi ve yönetimi kolaylaştırabiliriz.Aşağıdaki komutu kullanarak bir isim-ad’a sahip konfigürasyon oluşturabiliriz.
configure --with-conf-name=<name>
Alternatif olarak “build” altında bir dizin oluşturarak ve daha sonra “configure” komutunu çalıştırarak da çoklu konfigürasyon oluşturabilirsiniz.
Örnek:
mkdir build/<name> && cd build/<name> && bash ../../configure
Yukarıdaki komutun ardından:
make CONF_NAME=<name>
veya:
make CONF=<pattern>
komutlarını kullanarak oluşturduğunuz konfigürasyonu build edebilirsiniz. Buradaki <pattern>,bir veya birkaç konfigürasyonla eşleşen bir alt dizedir.
Örnek:
CONF=debug
Şayet boş desen belirtirseniz(CONF=),böylece mevcut tüm konfigürasyonları ele alacaktır.Aşağıdaki gibi bir kullanım ise tüm konfigürasyonlar için “hotspot”’u build edecektir.
make CONF=hotspot
Alternatif olarak ise konfigürasyon dizini içinde “make” komutunu çalıştırabilirsiniz.Örnek:
cd build/<name> && make
Yeniden Yapılandırma(Reconfigurations)
Üzerinde çalıştığınız repoyu güncellerseniz veya konfigürasyon komut dosyasında bir değişiklik olduğunda,derleme sistemi sizi “configure”’yi yeniden çalıştırmaya zorlayacaktır.
Çoğu durumda yeniden konfigürasyon yapmak,ortaya çıkması muhtemel birçok problemi de giderecektir.
Ancak her değişiklikte veya yeniden konfigürasyonun gerektiğini düşündüğünüz durumda “make reconfigure” komutuyla uğraşmak istemiyorsanız,”CONF_CHECK”’e “auto” değişkenini atayarak bu işlemi otomatik yaptırabilirsiniz.Örneğin aşağıdaki komutu “.bashrc” dosyasına eklerseniz,yukarıda bahsettiğimiz değişiklikler olduğunda make komutu otomatik olarak “reconfigure”’yi çalıştıracaktır.
Ayrıca aşağıdaki komutu kullanarak yeniden konfigürasyonu kontrol etmeyi göz ardı edebilirsiniz.
Bu yöntem build sürecini hızlandıracaktır ancak hatalı bir build riskini de beraberinde getirecektir.
Bu kullanım,yalnızca ne yaptığınızı biliyorsanız önerilir.
CONF_CHECK=ignore
Zaman zaman,değişiklikler nedeniyle yapılandırmak için komut satırını da değiştirmeniz gerekecektir.Mevcut yapılandırmanız/konfigürasyonunuz için kullanılan komut satırını göstermek için:
make print-configuration
Make İçin İnce Ayar
Make için varsayılan(default) davranış,gerekirse derleme hızı pahasına tutarlı ve doğru çıktı üretmektir. Eğer hatalı bir build sonucunu göze alıyorsanız,ve build süreciyle ilgili yeterince sistem bilgisine sahipseniz,make’e projenin yalnızca bir bölümünü build etmesi talimatını verebilir ve böylece build sürecini önemli ölçüde hızlandırabilirsiniz.
Bağımsız Modüller Oluşturma
Make’i ince ayar olarak kullanmanın güvenli yolu,modüle özel bağımsız build hedefleri kullanmaktır.JDK’daki tüm kaynak kod bir modüle ait olacak şekilde düzenlenmiştir.Örneğin “java.base” veya “jdk.jdwp.agent”.
Dolayısıyla “make” komutunu sadece bir hedef modül üzerinde çalıştırarak ilgili hedefi build edebilirsiniz.
Örnek:
make jdk.jdwp.agent
Belirtilen modül diğer modüllere bağlıysa(örn:java.base),öncelikle bu modüller build edilecektir.Ayrıca make komutuna bir dizi modül de belirtebilirsiniz.
Örnek:
make jdk.crypto.cryptoki jdk.crypto.ec jdk.crypto.mscapi
Bağımsız Modül Aşamaları Oluşturma
Her modül için derleme süreci ayrı aşamalara bölünmüştür(daha önce bu konuya değinildi). Tüm modüllerin tüm aşamalara ihtiyacı yoktur.Hangisine ihtiyaç duyulduğu,modülün ne tür kaynak kodundan ve diğer yapılardan oluştuğuna bağlıdır. Aşamalar:
- gensrc (Derlemek için kaynak kodu oluştur)
- gendata (Kaynak olmayan kod yapıları oluştur)
- copy (Kaynağı kopyala)
- java (Java kodunu derle)
- launchers (Native çalıştırılabilir dosyaları derle)
- libs (Native kütüphaneleri derle)
Aşağıdaki gibi bir kullanım ile bir modül için yalnızca tek bir aşama/faz build edebilirsiniz:
$MODULE-$PHASE
Örneğin “java.base” için “gensrc” fazı build etmek için:
make java.base-gensrc
Bazı aşamaların/fazların diğerlerine bağlı olabileceğini unutmayın.Örneğin “java” “gensrc”’ye bağlıdır.Make,istenen aşama/fazı build etmeden önce,diğer gerekli tüm ön koşulları build edecektir.
Bağımlılık Kontrolünü Atlama
Make tarafından yapılan bağımlılık kontrolü-denetimi,yeniden build için harcanan sürenin önemli bir bölümünü kapsar. Hızlı build elde edebilmek için bu tür bağımlılık denetimini yapmadan atlamak mümkündür. Ancak yanlış kullanıldığı durumda,bozuk bir build sonucuyla karşı karşıya kalacağınızı unutmayın. Bunu yapmak için make’e “-only” komutunu verin.
Örneğin:
make jdk.jdwp.agent-java-only
java.base (JDK_FILTER)
JDK’daki en büyük modül olan “java.base” üzerinde çalışıyorsanız ve tek bir dosya bile değiştirdiğinizde,tüm bu dosyaları yeniden build etmeniz gerekir.Buna benzer yapı üzerinde çalışırken,derlenecek dosya kümesini sınırlamak için “JDK_FILTER” modeli bulunuyor.
Dolayısıyla JDK_FILTER kullanarak bir sınır belirlememiz mümkündür.
Örneğin aşağıdaki komutu kullanarak “javax.crypto” paketini limitleyebiliriz:
make java.base JDK_FILTER=javax/crypto
Eğer “-only” ile kullanmak istersek:
make java.base-java-only JDK_FILTER=javax/crypto
Böylece derleme çerçevesi sadece “javax.crypto” paketiyle sınırla kalacaktır.
-end of