2012-01-11 6 views
10

Bunu yapmak için örtülü oluşturma kurallarını kullanarak bir grup statik kitaplık oluşturmak için GNU make kullanıyorum. Bu kurallar kütüphaneyi/arşivi güncellemek için ar (1) komutunu çalıştırır. Profil oluşturma, yapım sırasında paralel işleri yürütmek için -j seçeneğini kullanmış olsaydım, yapım süresinin azaltılacağını gösterdi.GNU yapımını paralel dosya yapıları için kullanırken eşzamanlılık sorunlarını nasıl önleyebilirim?

Maalesef GNU manuel hemen hemen yapmak ar (1), ve böylece can (ve) bozuk arşiv çalıştırmak için hiçbir eşzamanlılık korumaları sağladığını söyleyen bir bölüm http://www.gnu.org/software/make/manual/html_node/Archive-Pitfalls.html sahiptir olun. El kitabı ayrıca, bunun gelecekte de düzeltilebileceğini göstermektedir.

Bunun için bir çözüm, bir komutu çalıştırmadan önce temelde semafor kilitleme yapan http://code.google.com/p/ipcmd kullanmaktır, böylece arşi (1) arşive hazırlayan komutlar serileştirilir. Bu özel çözüm benim için iyi değil çünkü Windows'da mingw tabanlı çapraz derleme araçlarıyla yapıyorum.

Bu sorunun daha basit veya daha iyi bir çözümü var mı?

cevap

2

yerine aşamalı arşivi güncellemek için çalışmak yerine, tek bir adım olarak arşivleme yapın:

libfoo.a: $(OBJS) 
     -rm -f [email protected] 
     $(AR) rc [email protected] $^ 
     $(RANLIB) [email protected] 
+1

Sanırım arşivi değil, arşivi çalıştırmanız gerekiyor. Muhtemelen kurallardaki nesne dosyaları için $^kullanabilirsiniz. – user1143888

2

deneyin aşağıdaki -

AR := flock make.lock $(AR) 

clean:: 
    rm -f make.lock 

Şimdi ar (1) özel bir kilit ile çalıştırır

make.lock dosyasına, böylece kütüphaneye erişimi serileştirir.

ranlib komutundan sonra make.lock dosyasını silmek için bir komut ekleyebilirsiniz.

Tanımı gerekirse alt üretimlere yaymak için export AR'u ekleyin.

+0

Yapım aşamasında olan arşivde 'akın' mantıklı olur mu? Ya da 'sürüs' erişimi başka yollarla yasaklıyor mu? –

İlgili konular