Szukaj…


Używanie .PHONY dla celów niebędących plikami

Użyj .PHONY aby określić cele, które nie są plikami, np. clean lub mrproper .

Dobry przykład

.PHONY: clean
clean:
    rm *.o temp

Zły przykład

clean:
    rm *.o temp

W dobrym przykładzie make wie, że clean nie jest plikiem, dlatego nie będzie wyszukiwał, czy jest aktualny, i wykona przepis.

W złym przykładzie make będzie szukał pliku o nazwie clean . Jeśli nie istnieje lub jest nieaktualny, wykona przepis, ale jeśli istnieje i jest aktualny, przepis nie zostanie wykonany.

Używanie .PHONY do rekurencyjnych wywołań polecenia „make”

Rekurencyjne użycie make oznacza użycie make jako polecenia w pliku makefile. Ta technika jest przydatna, gdy duży projekt zawiera podkatalogi, z których każdy ma swoje odpowiednie pliki makefile. Poniższy przykład pomoże zrozumieć zaletę używania .PHONY z marką rekurencyjną.

/main
     |_ Makefile
     |_ /foo
            |_ Makefile
            |_ ... // other files
     |_ /bar
            |_ Makefile
            |_ ... // other files
     |_ /koo
            |_ Makefile
            |_ ... // other files

Aby uruchomić plik makefile podkatalogu z pliku makefile main, plik makefile main miałby pętlę, jak pokazano poniżej (istnieją inne sposoby, w jakie można to osiągnąć, ale to nie wchodzi w zakres bieżącego tematu)

SUBDIRS = foo bar koo

subdirs:
        for dir in $(SUBDIRS); do \
          $(MAKE) -C $$dir; \
        done

Jednak przy tej metodzie występują pułapki.

  1. Każdy błąd wykryty w podwykonawcy jest ignorowany przez tę regułę, więc będzie kontynuował budowanie reszty katalogów, nawet jeśli jeden zawiedzie.
  2. Marka nie może wykonywać równoległego wykonywania wielu celów kompilacji, ponieważ używana jest tylko jedna reguła.

Deklarując podkatalogi jako obiekty docelowe .PHONY (musisz to zrobić, ponieważ podkatalog oczywiście zawsze istnieje; w przeciwnym razie nie zostanie zbudowany) problemy te można rozwiązać.

SUBDIRS = foo bar koo

.PHONY: subdirs $(SUBDIRS)

subdirs: $(SUBDIRS)

$(SUBDIRS):
        $(MAKE) -C $@


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow