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?
Odpowiedz
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.
Czy istnieje sposób, aby to zrobić bez GNU, aby tworzyć rozszerzenia? (Pytanie jest oznaczone 'Makefile', a nie' GNUmakefile'). – jww
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
Możliwy duplikat [Utwórz katalogi przy użyciu pliku make] (http://stackoverflow.com/questions/1950926/create-directories-using-make-file) – SimplyKnownAsG