2009-11-22 20 views
5

xxx.c dosyasında belirtilen bir başlık dosyasını oluşturan bir Makefile.am dosyası oluşturmak istiyorum.Automake'de Header bağımlılığı

en xxx.c içerdiğini varsayalım:

#include <version.h> 
... 

ve ben Makefile.am sonunda onu oluşturmak için bir kural olduğunu: Ben değiştirmek zorunda yapmak ne

version.h: 
     echo '#define VERSION "'`hg id`'"' > version.h.tmp 
     cmp version.h.tmp version.h || mv version.h.tmp version.h 

xxx.c derleme yapmak version.h'a bağımlı mı? nodist_progname_SOURCES=version.h'u denedim, ancak bunu yapmıyor gibi görünüyor. BUILT_SOURCES olarak sözü

cevap

10
BUILT_SOURCES = version.h 

tüm dosyalar kuralları çalıştırmak, normal derleme herhangi önce inşa edilecek.

Ancak bu hafif bir sorun oluşturur: version.h her make çağırma yeniden inşa edilmesi gerekecektir gibi, #include s version.h her make kaçak tekrar tetiklenecek her foo.c dosyanın recompilation. Yeniden derlemenin yalnızca değişmiş bir şey olduğunda gerçekleşmesi tercih edilir.

Bu soruna geçici bir çözüm bulmak için , her seferinde "oluşturulan" bir damga dosyasında bir BUILT_SOURCES bağımlılık kullanın (aslında hiçbir zaman oluşturulur, böylece yapı kuralı her zaman çalışır). version.h.tmp version.h aslında farklı ise o damga dosyası için yapı kural version.h bir version.h.tmp olarak yeni version.h dosyası ve tek kopya version.h.tmp oluşturur (sizin version.h kural yaptığı gibi). hiçbir şey version.h değişti, yani onun damgası (mtime) aynı kalır ve version.h bağlı nesnelerin hiçbir yapı tetiklenir:

BUILT_SOURCES = version.stamp 

version.stamp: 
     echo '#define VERSION "'`hg id`'"' > version.h.tmp 
     cmp version.h.tmp version.h || mv version.h.tmp version.h 

Bu çözüm için ne soruyorsun yapacağız.

Maalesef olsa, bir dist Tarball'dan inşa ediyoruz hafif sorun olacaktır: Sonra hg id size sahte bilgi verecektir ve muhtemelen tarball hiçbir version.h yoktur, bu nedenle yapı başarısız veya sahte versiyonu bilgileri içerir .

Bu sorunu, git kullanan xf86-video-radeonhd projesi için çözdüm. Bu çözümde oluşturulan git-version.h dosyası, yalnızca tek bir sürüm numarasından daha fazla sürüm bilgisi içerir. Sen git_version.sh sonunda benim bu güncelleme okunur-if-farklı çözümü ve umarım tüm dışı kaynak ağacının işlenmesi ve dahil BUILT_SOURCES Kargaburun (görebileceği-dist-tarball inşa vakası Eğer ilgileniyorsanız RadeonHD.am içinde.

+0

Bu özellik, bir özellik ile harika çalışır. Automake el kitabından: "BUILT_SOURCES'in yalnızca 'make all', 'make check' ve 'make make' tarafından yapıldığını vurgulamak önemli olabilir. Bu, belirli bir hedefi (örneğin, 'make foo') oluşturamayacağınız anlamına gelir. Yapılı bir kaynağa bağlıysa temiz bir ağaç. " Yine de, bildiğim en iyi çözüm. – phs

+0

Eğer birisi 'foo' yapmak için özel olarak çalıştırmayı biliyorsa, ne yaptıklarına dair bir miktar bilgi edinebilir ve bu nedenle BUILT_SOURCES öğesinin yeniden oluşturulduğundan emin olmaları gerekip gerekmediğini öğrenebilirsiniz. – ndim

+0

Bunları tek bir satıra '' && '' operatörüyle koymalısınız, aksi halde version.h yapınızı paralelleştirmekten mutluluk duyacaktır. –