2008-08-10 23 views
9

GNU autoconf/automake yapıları ile ilgili herhangi bir soru görmedim, ama en azından bazılarınızın orada aşina olmasını umuyorum. Burada:VERSİYONU, PAKETİ, vb. Yeniden tanımlamaktan nasıl sakınırsınız?

Başka bir proje (satıcı) içeren bir projem var. Satıcı projesi, başkası tarafından sürdürülen bağımsız bir projedir. Bunun gibi bir proje de dahil olmak üzere, straightforward, ancak bu durumda küçük bir sapma vardır: her proje kendi PACKAGE, VERSION, vb. Gibi standart makroları tanımlayan kendi config.h dosyasını üretir. zaman en azından olduğu için,

... warning: "VERSION" redefined 
... warning: this is the location of the previous definition 
... warning: "PACKAGE" redefined 
... warning: this is the location of the previous definition 

Bunlar sadece uyarılar var ama onlardan kurtulmak istiyorum: satıcı inşa ediliyor, böyle hatalar çok olsun. Bir Google aramasında arama yapabildiğim tek alakalı bilgi, otomatik bir posta listesi listesinde this ileti dizisidir. Başka kimsenin daha iyi bir fikri var mı?

cevap

5

bazı notlar:

  • Eğer config.h dahil nasıl söz etmedi - tırnak veya açılı ayraçlar ile. Fark hakkında daha fazla bilgi için bkz. this other question. Kısacası, config.h, genellikle köşeli parantezler değil, tırnak işaretleri ile birlikte gelir ve bu ön işlemcinin projenin kendi dizininden (genellikle istediğiniz gibi) config.h olmasını tercih etmelidir.
  • Bir alt projenin, kapsayıcı projeyi de içermesi gerektiğini söylüyorsunuz. config.h Normalde bu sizin istediğiniz gibi değildir. Alt proje bağımsızdır ve PAKETİ ve VERSİYONU, sizin değil, bu alt projeden biri olmalıdır. Örneğin, xmlreader projenize libxml eklerseniz, libxml kodunun PACKAGE libxml ve VERSION (libxml sürümü ne olursa olsun) ile derlenmesini istersiniz.
  • Genel üstbilgilerden config.h numarasının dahil edilmesi genellikle büyük bir hatadır. config.h her zaman projenize veya alt projenize özeldir ve yalnızca .c dosyalarından dahil edilmelidir. Bu nedenle, satıcınızın belgelerinde "vendor.h" ifadesi yer alıyorsa ve bu genel başlık config.h'u bir şekilde içeriyorsa, o zaman no-no'dur. Benzer şekilde, projeniz bir kütüphane ise, yayınlanmış başlıklarınızdan herhangi bir yere config.h'u dahil etmeyin.
3

Kesinlikle bir hack, ama sonrası süreç autogen'd config.h dosyası: Bu bizim yapı ortamında tolere edilebilir ama temiz bir şekilde ilgi duyarım

sed -e 's/.*PACKAGE_.*//' <config.h> config.h.sed && mv config.h.sed config.h 

.

1

Durumumda çok basit bir çözüm olduğu ortaya çıkıyor. Satıcı projesi birkaç üstbilgi dosyasını satıcı kaynakları tarafından #include d olan tek bir monolitik başlık dosyasına toplar. Ancak, monolitik başlık oluşturan make kuralı, yanlışlıkla oluşturulan config.h'u içermiştir. Monolitik başlıktaki PACKAGE, VERSION vb. Yapılandırma değişkenlerinin varlığı, yeniden tanımlama uyarılarına neden olan şeydir. Sağlayıcının config.h'un alakasız olduğu ortaya çıkıyor çünkü "config.h" her zaman $(top_builddir)/config.h olarak çözüldü.

Bunun çalışma şeklinin böyle olduğuna inanıyorum. Varsayılan olarak, bir alt proje, kendi başına bir alt proje, kendi başına değil veya kendi dizininin $(top_builddir)'dan önce gelmesi için INCLUDE yolunu manipüle etmedikçe veya başlık dosyalarını benim durumumdaki gibi yönlendirmedikçe, kapsayıcı projenin kendi yerine config.h'u içermelidir.

İlgili konular