2012-01-23 21 views
6

birden çok kaynak dosya uzantılarıyla çalışma Kaynak dosyaları (.cpp, .c, .cc) ve başlık dosyaları için çeşitli uzantılar için çeşitli uzantılara sahip bir C++ projem var (.hpp, .h, .hh)). kaynak dosyaları SRC denilen bir dizinde bulunan ve başlık dosyaları A.Ş. adlı bir dizinde tahmin edilebileceği vardır edilir.Bir makefile

Tabii bu çalışır

vpath %.c $(SRC) 

%.o: %.c 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

gibi bir kuralla kaynağı derlemek istiyoruz Kaynak dosyanın% .c biçiminde olacağını biliyorum, ancak birden fazla olası dosya uzantısında,% .cpp ve% .cc için de benzer bir kural oluşturmam gerekiyor. Tabii ki üç kural yazmak için çok önemli değil, fakat bu makefile, kuralları yeniden yazmadan, farklı bir dilde bile olsa, herhangi bir proje için bir sürükle ve bırak olarak kullanmak güzel olurdu. Yardımlarınız için

SRC_EXT = cpp c cc 
vpath %.$(SRC_EXT) $(SRC) 

%.o: %.$(SRC_EXT) 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

teşekkür:

Peki nasıl bir kural (veya aynı amaca gerçekleştirir diğer bazı yapısını) gibi çalışır yazabilirsiniz.

cevap

3

Standart POSIX ürününe sahip olamazsınız. Ancak vpath'den bahsetmişken, GNU yapımını kullandığınızı varsayacağım. Eğer yeterince yeni GNU yapmak gerekmez veya alternatif bir çözümü tercih ederseniz,

SRC_EXT = cpp c cc 

define compile_rule 
%.o : %.$1 
     $$(COMPILER) $$(FLAGS) $$< $$(INCFLAG)$$(INC) 
endef  
$(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT)))) 

sizi: Eğer yeterince yeni sürümü (3,81 veya daha yeni) varsa, çağrı ve eval sahip ve kolay yeterli yapabilirsiniz oluşturulan makefile ile aynı şeyi yapabilir.

+0

aha! harika! Bir derleme kuralı nasıl çağırılacağını merak ediyordum, ama foreach ilk etapta nasıl çağrılıyor? SRC_EXT değişkenini ayarladıktan hemen sonra çağrıldığı gibi dosyada sadece oturuyor mu? Bu, tüm güncel kaynak dosyaların yeniden derlenmesini zorlar mı? – user487100

+1

Makefile ayrıştırma, her şeyi genişletmekle ilgilidir. Her ne zaman bir "anında bağlamda" bir değişkeni ya da işlevi yerine getirdiyse (bkz. "GNU yapımı el kitabında" Makefile Okumak "), genişletecektir. Bu elbette birçok adımı içerebilir. Genişleme tamamlandığında, kalan her şey makefile olarak ayrıştırılır. Eval işlevi ekstra özeldir. Temel olarak, bu foreach döngüsü makefile içinde okunduğunda make tarafından genişletilir ve ayrıştırılır ve kurallar, bunları yazmış olmanızla aynı şekilde tanımlar. Yani başka bir kural gibi davranır (yeniden derleme zorlamaz). – MadScientist

+0

çok havalı. Teşekkürler! – user487100