Eclipse ile yaşadığım bir build sorunu ve çözümü

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,796
Renesas'ın bir ARM işlemcisi üzerinde çalışıyorum ve aynı firmanın Eclipse bazlı IDE'si olan e2studio yu kullanıyorum. Yakın zamanda firmware içerisine png resimler dahil ettim. png dosyasını bir C header dosyasına dönüştürüyorum, ve bu işlemi de komut satırı programları ile yapıyorum. İlgili programların çalışması için de IDE nin kullandığı makefile dosyalarına ilave yapıyorum. Ama son zamanlarda tuhaf sorunlar başladı. Kodu derliyorum ve bazan durup dururken hata alıyorum. Tekrar derliyorum hata yok. Kodda birşey değişmiyor, nasıl olur bu?

Sonra farkettim ki hatalar hep üretilen C header dosyalarında bulunan ve resim bilgilerini içeren array'ler ile ilgili. Sanki o header'i kullanan C dosyası, daha o header tam olarak oluşturulmadan derlenmeye çalışıyor. Biraz inceleyince farkettim ki, e2studio, program hızlı derlensin diye "paralel make" kullanıyor. İşlemcide 8 çekirdek var, dolayısıyla 16 tane paralel make çalıştırılıyor, her bir make de hangi dosyayı yakalarsa onu derlemeye çalışıyor. Burada tabi akla gelen ilk çözüm, paralel make kullanmamak. Ama o zaman da normalde birkaç saniye süren build işlemi, yarım dakikadan daha uzun sürüyor. Bunu istemiyorum.

Diğer ihtimal bu sorunu e2studio nun ürettiği makefile'da düzeltmenin bir yolu var, ama o makefile her seferinde e2studio tarafından sıfırdan üretiliyor, ona müdahale etme şansım yok. Sadece o makefile tarafından başta ve sonda "include" edilen makefile parçalarını değiştirebiliyorum. İnternette de faydalı bir bilgi bulamadım ve doğrudan GNU Make programının dokümanını okumaya başladım. Orada, paralel make işini kontrol eden özel direktiflerden bahsediyor. Mesela .NOTPARALEL diye bir direktif kullanarak bazı bileşenlerin paralel olmayacak şekilde build edilmesini sağlayabiliyorsun. Bir de .WAIT diye bir direktif var, bu da be belli bileşenlerin build işleminin bitmesini beklemeye yarıyor. Tam bana lazım olan şey. C header'lar önce üretilsin, sonra geri kalan firmware derlensin. Ama gene de tüm build paralel yapılsın ve hızlı olsun.
 
Make include dosyasına gereken değişikliği yaptım

makefile.init:
IMAGE_FILES_JPG := \
    splash-100.jpg \

IMAGE_FILES_PNG := \
    main.png \
    logo.png \
    gain.png \
    setup.png \
    vu_meter.png \
    clipping.png \
    ilimit.png \
    inrca.png \
    inrca_s.png \
    inxlr.png \
    inxlr_s.png \
    mono.png \
    mono_s.png \
    muted.png \
    muted_s.png \
    unmuted.png \
    unmuted_s.png \
    stereo.png \
    stereo_s.png \

images_jpg:
    cd ../src; for f in ${IMAGE_FILES_JPG}; do xxd -i images/$$f | sed -e 's/unsigned char/const unsigned char/g' > "$$f"".h" ; done

images_png:
    cd ../src; for f in ${IMAGE_FILES_PNG}; do bn=$$(basename $$f .png); bgr="$$bn""-bgr.png"; convert -color-matrix '0 0 1 0 1 0 1 0 0' images/$$f $$bgr; png2c -file $$bgr -mode 565 -var "$$bn""_data" > "$$f"".h"; rm -f $$bgr; done

all: images_jpg images_png .WAIT

Bu değişikliği yapıp çalıştırınca build doğrudan hata verdi. ".WAIT diye bir target yok" diye daha baştan build sonlandı. Biraz daha araştırınca, bu özelliğin en güncel GNU Make versiyonu olan 4.4 de bulunduğunu gördüm. Bendeki make, cross compiler'in içindeki make ve o da versiyon 4.3. GNU Make 4.4 ün kaynak kodunu indirdim, derleyip sisteme kurdum. Sonra da eclipse proje ayarlarından bu kurduğum make programını çalıştırmasını söyledim ve sorun düzeldi. Şu anda hem paralel, hızlı derleme yapıyorum, hem de resimlere karşılık gelen C header'ların ilk önce tamamen üretildiğini garanti ediyorum.
 
@taydin paralel make hangi durumda kullaniyor, ben degisiklik yapilmayan dosyalar diye hatirliyorum.
 
@taydin paralel make hangi durumda kullaniyor, ben degisiklik yapilmayan dosyalar diye hatirliyorum.

Build işlemini hızlandırmak için kullanılıyor. Ama build bileşenlerin birbirine bağımlılıklarını %100 doğru tanımlaman şart, yoksa build çalışmaz.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,839
Mesajlar
99,583
Üyeler
2,479
Son üye
yiyehuoxing32

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top