2008-10-20 15 views
11

Çalıştığım küçük bir proje için GNUMake'i öğrenmeye çalışıyorum. Şimdiye kadar, "temel" öğreticiler bile oldukça kaba görünüyor ve henüz makefile sözdizimini anlamıyorum.GNUMake öğrenmek için kaynaklar?

GNUMake'yi tanımak için yeni başlayan herkesin iyi kaynakları var mı?

cevap

12

Kesin kılavuz http://www.gnu.org/software/make/manual/make.html
Daha fazla açıklamaya sahip bir "GNU Make ile Projeleri Yönetme" adlı bir kitap var. Ayrıca, daha önceki sürümleri de kullanabilirsiniz, bunlar özellikle GnuMake'yi kapsamaz ancak çok daha incedir.

Geliştiriciler arasında kirli bir sır olsun - hiçbirimiz bunu anlayamıyoruz, bir başkasından bir betik betiği alıyoruz ve değiştiriyoruz. Sadece bir betiğin en baştan yazıldığını hayal ediyorum (muhtemelen aracın yaratıcısı tarafından).

Basit örnekden daha fazlasını yapmanız gerektiğinde, çoğu kişi ya Ant gibi daha modern bir yapı sistemine geçebilir veya Perl/Python/etc içinde kendi rulolarını açabilir.

+0

Makefile için bir aile ağacının hoşgörülü görüneceğini duymuştum. : D –

+0

Hiç birisinin kendi Perl/Python/ektlerini "yuvarlama" konusunda bir sürüye sahibim. Karmaşık veya "daha basit" yapı senaryoları için sistem. Aslında Python’un SCon'ları gibi çok büyük karmaşık kod tabanları ile yüzüne düşüyor. Ancak, diğer insanların yapacağı senaryoları "ödünç alarak", belki de senin de "ödünç al" diyebileceğine katılıyorum. – Tom

+0

@Tom - 'neyin değiştiğini/yeniden yapılandırmaya ihtiyaç duyduğunu' çok fazla değil, DB'leri kurmak, seri numaraları oluşturmak ve CD'leri yazmak için daha fazla araç için daha fazla değil –

0

mgb: Daha da kötüsü. Bir keresinde karmaşık bir make sistemi (birkaç bin dosya, elli veya yüz dizin, dört ya da beş derleyici ve çapraz derleme hedefleri, 2 OS, vb) yazdım. Oturup gnu'nun içte ve dışta yapmasını öğrendim, sistemi tasarladım, önce bir prototiple oynadım. Sonuçtan hepimiz çok mutluyuz.

Ancak yıllar önceydi. Onları bugün nasıl yazdığımı biliyor musun? Tanımladığınız gibi. Oldukça düzenli ve sözdizimi ayrıntıları oldukça düzenli yapmıyorsanız, detayları hatırlayamazsınız. Sadece sezgisel olmayan sözdizimi ve bazı ilginç kurallar ile başka bir dil gibi, sanırım.

+0

istiyorsanız Qt qmake/.pro sistemi oldukça basit ve biz Python kendi basit systme yazdı, windows/linux/sparc üzerine inşa ve yapmak anlamaya çalışmaktan daha kolay oldu. –

+0

Bunu düşündüm, ama kafamı aldığımda makyaj o kadar da kötü değildi. Bu python ve ruby ​​öncesi idi; Sanırım erken perl kullanabilirdim belki. – simon

3

En yaygın kullanılan özellikler, birkaç basit kavram, hedef, bağımlılık ve değişkene ayrılabilir.

Hedefler oluşturmak istediğiniz şeylerdir, ancak bir hedefin altındaki komutlar derleyici komutları veya komut dosyaları olabilir. Genellikle her bir hedef kodunuzdaki bir modüle atıfta bulunur, ancak bunları projenize uygun olarak istediğiniz kadar yapabilirsiniz.

Bağımlılıklar projenizdeki dosyalar veya başka hedeflerdir. Bunun en iyi örneği, bir grup nesne dosyasından ikili oluşturduğunuz bir C projesidir. İkili yapıyı oluşturmadan önce her nesne dosyasının bulunması gerekir, bu nedenle tüm bağımlılıklar tamamlanana kadar hedeflerinizin geçişi gerçekleştirilir ve ardından genel hedef için komutu çalıştırın.

Değişkenler her zaman gerekli değildir, ancak derleyici bayrakları gibi şeyler için oldukça kullanışlıdır. Kanonik örnekler CC ve CCFLAG'lar olup, derleyiciye örneğin gcc'yi ve -ansi -Wall -o2 gibi bayrakları kullanır.

Birkaç tane daha genel ipuçları ve püf noktaları:

  • Komutları bir [sekme] karakteri ile devam edilmelidir, ya da yürütülmez, bu marka sadece eski bir kalıntı, ı don Bunun neden olduğunu hatırlamıyorum.
  • Kural olarak, hangi hedefin varsayılan olması gerektiğini varsayılan olarak belirlemek için bir hedef eklemek isteyebilirsiniz. Karmaşık bir makefile sahip olduğunuzda ve her zaman varsayılan olmak istediğiniz belirli bir hedef olduğunda bu yararlıdır.
  • Sizin makefile makefile veya Makefile ettim, ama kullanmak, başka bir şey aramak istiyorsanız $ [makefilename]
  • Her zaman tam değişken genişleme sözdizimi yani $ (DEĞİŞKEN) kullanmayın veya olmayabilir çıkışını yapmak -f yapmak gerekir İstediğiniz komutları.
  • Yinelemeli olarak çalışabilirsiniz, bu nedenle, projenizde dizinlerin içinde yaşayan bir dizi alt modülünüz varsa, her biri oluşturmak için maket içinde alt dizin makefile üzerinde arama yapabilirsiniz.
  • Kurulum komut dosyalarına gereksinim duyan, gerçekten karmaşık bir projeniz varsa, muhtemelen sizin için makefile oluşturan autotools'u araştırmak isteyeceksiniz ve kitaplık varlığını ve diğer taşınabilirlik sorunlarını denetlemek için bir dizi hile yapmalısınız.
+0

Buna eşlik edecek öğretici bir şey var mı? GNUMake'in genel kavramlarını anlıyorum, ama makefile sözdizimi biraz arcane. –

+0

Üzgünüm Dana ama yukarıdaki listedeki ifadelerin bazıları yanlış. Örneğin, hem Makefile hem makefile kabul edilebilirdir ve make "all" hedefini aramaz. Genellikle "all", dosyanın en üstünde bulunur, hepsi budur. Ayrıca, komutların herhangi bir karakterle değil, bir sekmeyle olması gerekir. –

+0

Not, Jeff'in html dezenfektanı tablomun yorumunu yedi. Bu düzeltmeleri –

0

de yap bakmak içine bazı yararlı ipuçları, hile ve görüşler için

GNU bilgi sisteminin büyük bir hayranı değilim, ama GNU bilgi sayfaları çok yararlı olduğu yapmak bulduk. Çok temel kavramları ve kabaca ne tür şeyler olduğunu öğrendikten sonra, bilgi sayfalarının örneğin önceden oluşturulmuş işlevler gibi bilgileri yönlendirmenin en hızlı yolu olduğunu öğrendim.

(GNU info programı unutmak ve bunun yerine örneğin pinfo kullanın.)

2

"GNU yönetme Projeler olun, 3. baskı" "GNU Özgür Belgeleme Lisansı" altında konur ve yasal olarak ücretsiz çevrimiçi okunabilir: link.

İlgili konular