2013-05-02 18 views
5

Próbuję użyć makefile, moim problemem jest to, że mam katalog, z katalogiem src i Makefile. Używam również katalogu tmp, który również muszę utworzyć. Zawiera pliki obiektów. A dla wydajności staram się nie usuwać ich podczas debugowania. Jeśli utworzę regułę dla tmp, aby ją utworzyć, zawsze przebudowuje wszystkie pliki C. Jak to zrobić?Jak utworzyć katalog, jeśli jest potrzebny?

+1

Możliwy duplikat [Utwórz katalogi przy użyciu pliku make] (http://stackoverflow.com/questions/1950926/create-directories-using-make-file) – SimplyKnownAsG

Odpowiedz

8

Istnieje wiele sposobów. Zależy to od używanej wersji make i od używanego systemu operacyjnego.

Jedną rzeczą, której NIGDY nie należy robić, jest użycie katalogu jako prostego warunku. Reguły używane przez system plików do aktualizowania zmodyfikowanego czasu w katalogach nie działają dobrze z make.

Do prostego make w systemie POSIX, można wstępnie utworzyć katalog w regule, aby wykonać kompilację:

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

Jeśli masz GNU make masz dwie opcje. Najprostszym z nich jest po prostu zmusić katalog który ma zostać utworzony, gdy jest czytana w makefile zanim cokolwiek się zdarzy, przez dodanie odpowiedniego wiersza tak:

_dummy := $(shell mkdir -p obj) 

jest łatwe, szybkie i niezawodne. Jedynym minusem jest to, że katalog będzie tworzony zawsze, nawet jeśli nie jest potrzebny. Mimo to tak zwykle to robię.

Najbardziej fantazyjny sposób, jeśli masz nowy-wystarczająco GNU make, jest użycie zleceniem tylko wymagania:

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

obj: 
     mkdir -p [email protected] 

Zmusza cel obj być zbudowany przed docelowym obj/foo.o, ale znacznik czasu na obj jest ignorowany podczas określania, czy obj/foo.o jest nieaktualny.

+0

Czy istnieje sposób, aby to zrobić bez GNU, aby tworzyć rozszerzenia? (Pytanie jest oznaczone 'Makefile', a nie' GNUmakefile'). – jww

+0

Nie, nie ma możliwości użycia katalogu jako warunku wstępnego (takiego, który zachowuje się zgodnie z oczekiwaniami) podczas pisania plików Makefile zgodnych z POSIX. Jedyne, co możesz zrobić, to przepisać wszystkie reguły, aby dodać je w jawnym 'mkdir -p', zanim spróbują użyć katalogu, który może nie istnieć, i nie używaj wymagań wstępnych ani nie twórz reguł do budowania katalogu. – MadScientist

Powiązane problemy