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?
cevap
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.
GNU uzantıları olmadan bunu yapmanın bir yolu var mı? (Soru "GNUmakefile" değil, "Makefile" olarak etiketlenmiştir). – jww
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
Olası çoğaltılabilir [Yapım dosyasını kullanarak dizin oluşturma] (http://stackoverflow.com/questions/1950926/create-directories-using-make-file) – SimplyKnownAsG