2013-05-02 22 views
5

Makefile kullanmaya çalışıyorum, benim bir sorunum var, bir src dizini ve bir Makefile. Ayrıca oluşturmam gereken bir tmp dizinini de kullanıyorum. İçinde nesne dosyaları var. Ve performans için hata ayıklama yaparken bunları silmemeye çalışıyorum. Bunu oluşturmak için tmp için bir kural oluşturursam, her zaman C dosyalarını yeniden oluşturur. Peki bu nasıl yapılır?Gerektiğinde dizin nasıl oluşturulur?

+1

Olası çoğaltılabilir [Yapım dosyasını kullanarak dizin oluşturma] (http://stackoverflow.com/questions/1950926/create-directories-using-make-file) – SimplyKnownAsG

cevap

8

Bazı yollar vardır. Kullanmakta olduğunuz hangi sürüme ve hangi işletim sistemine kullandığınıza bağlıdır.

ASLA yapmamanız gereken tek şey bir dizini basit bir ön koşul olarak kullanmaktır. Dosya sisteminin değiştirilen zamanı dizinlerde güncellemek için kullandığı kurallar make ile iyi çalışmaz. Bir POSIX sisteminde basit make için

, sen derleme gerçekleştirmek üzere kuralda dizin ön oluşturabilirsiniz:

obj/foo.o: foo.c 
     @ mdkir -p obj 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

GNU'yu varsa

iki seçeneğiniz var olun. En basit bir sadece bu gibi bir satır ekleyerek makefile başka bir şey olmadan önce okunduğunda dizin oluşturulacak zorlamaktır:

_dummy := $(shell mkdir -p obj) 

kolay, hızlı ve güvenilirdir. Tek dezavantajı, gerekli olmasa bile dizinin her zaman oluşturulacağıdır. Yine de, genelde böyle yaparım.

obj/foo.o: foo.c | obj 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

obj: 
     mkdir -p [email protected] 

Bu, obj hedef obj/foo.o hedefin önce inşa edilecek ama zorlar: Eğer GNU yapmak, yeni bir yeterince varsa

en süslü şekilde, sipariş yalnızca önkoşulları kullanmaktır obj zaman damgası, obj/foo.o'un güncel olup olmadığını belirlerken yoksayılır.

+0

GNU uzantıları olmadan bunu yapmanın bir yolu var mı? (Soru "GNUmakefile" değil, "Makefile" olarak etiketlenmiştir). – jww

+0

Hayır, POSIX uyumlu makefile yazarken bir dizinin önkoşul olarak kullanılması (istenildiği gibi davranması) mümkün değildir. Yapabileceğiniz tek şey, var olmayan bir dizini kullanmaya başlamadan önce açık bir 'mkdir -p 'eklemek için tüm kurallarınızı yeniden yazmanız, önkoşulları kullanmamaları veya dizini oluşturmak için kurallar yapmalarıdır. – MadScientist

İlgili konular