Co .PHONY
oznacza plik Makefile? Przeszedłem przez to , ale jest to zbyt skomplikowane.
Czy ktoś może mi to wyjaśnić w prosty sposób?
źródło
Co .PHONY
oznacza plik Makefile? Przeszedłem przez to , ale jest to zbyt skomplikowane.
Czy ktoś może mi to wyjaśnić w prosty sposób?
Domyślnie cele Makefile są „celami plików” - służą do budowania plików z innych plików. Make przyjmuje, że jego celem jest plik, a to sprawia, że pisanie Makefiles jest stosunkowo łatwe:
foo: bar
create_one_from_the_other foo bar
Czasami jednak chcesz, aby Twój Makefile uruchamiał polecenia, które nie reprezentują fizycznych plików w systemie plików. Dobrym przykładem tego są wspólne cele „czyste” i „wszystkie”. Możliwe, że tak nie jest, ale potencjalnie plik może mieć nazwę clean
w katalogu głównym. W takim przypadku Make zostanie zdezorientowany, ponieważ domyślnie clean
cel będzie powiązany z tym plikiem, a Make uruchomi go tylko wtedy, gdy plik nie wydaje się być aktualny w odniesieniu do jego zależności.
Te specjalne cele nazywane są fałszywymi i możesz wyraźnie powiedzieć Make, że nie są powiązane z plikami, np .:
.PHONY: clean
clean:
rm -rf *.o
Teraz make clean
będzie działać zgodnie z oczekiwaniami, nawet jeśli masz plik o nazwie clean
.
Pod względem marki fałszywy cel to po prostu cel, który jest zawsze nieaktualny, więc za każdym razem, gdy o to poprosisz make <phony_target>
, będzie działał niezależnie od stanu systemu plików. Pewne wspólne make
cele, które są często fałszywe są: all
, install
, clean
, distclean
, TAGS
, info
, check
.
Załóżmy, że masz
install
cel, który jest bardzo powszechny w plikach makefile. Jeśli nie używasz.PHONY
, a plik o nazwieinstall
istnieje w tym samym katalogu co plik Makefile, nic niemake install
zrobi . Wynika to z faktu, że Make interpretuje regułę w ten sposób, że oznacza „wykonaj taką i inną receptę, aby utworzyć plik o nazwie ”. Ponieważ plik już tam jest, a jego zależności się nie zmieniły, nic nie zostanie zrobione.install
Jeśli jednak
install
ustawisz docelowy obiekt PHONY, powie on narzędziu make, że cel jest fikcyjny, i marka nie powinna oczekiwać, że utworzy rzeczywisty plik. Dlatego nie sprawdzi, czyinstall
plik istnieje, co oznacza: a) jego zachowanie nie zostanie zmienione, jeśli plik istnieje, oraz b) dodatkowestat()
nie zostaną wywołane.Zasadniczo wszystkie cele w twoim Makefile, które nie tworzą pliku wyjściowego o takiej samej nazwie jak nazwa celu, powinny mieć wartość PHONY. To zazwyczaj obejmuje
all
,install
,clean
,distclean
, i tak dalej.źródło
.sh
lub.bash
” dla programów, które działają tak, jakby miały główną funkcję, i rezerwowanie dodawania rozszerzenia dla bibliotek, które dołączasz (source mylib.sh
). W rzeczywistości dotarłem do tego pytania SO, ponieważ miałem skrypt w tym samym katalogu, co mój Makefile o nazwieinstall
.PHONY
cały czas ....PHONY
wersją.UWAGA : Narzędzie make odczytuje plik makefile i sprawdza znaczniki czasu modyfikacji plików po obu stronach symbolu „:” w regule.
Przykład
W katalogu „test” obecne są następujące pliki:
W makefile reguła jest zdefiniowana następująco:
Załóżmy teraz, że plik „hello” to plik tekstowy zawierający pewne dane, który został utworzony po pliku „hello.c”. Tak więc znacznik czasu modyfikacji (lub tworzenia) „hello” będzie nowszy niż znacznik „hello.c”. Kiedy więc wywołamy „make hello” z wiersza poleceń, zostanie wydrukowany jako:
Teraz uzyskaj dostęp do pliku „hello.c” i umieść w nim trochę białych znaków, co nie wpływa na składnię ani logikę kodu, a następnie zapisz i wyjdź. Teraz znacznik czasu modyfikacji hello.c jest nowszy niż znacznik „hello”. Teraz, jeśli wywołasz „make hello”, wykona polecenia w następujący sposób:
Plik „hello” (plik tekstowy) zostanie zastąpiony nowym plikiem binarnym „hello” (wynik powyższego polecenia kompilacji).
Jeśli użyjemy .PHONY w pliku makefile w następujący sposób:
a następnie wywołać „make hello”, zignoruje każdy plik obecny w „teście pwd” i wykona polecenie za każdym razem.
Załóżmy teraz, że cel „cześć” nie ma zadeklarowanych zależności:
a plik „hello” jest już obecny w „teście” pwd, wtedy „make hello” będzie zawsze wyświetlane jako:
źródło
make
jako całość mają sens, to wszystko dotyczy plików! Dziękuję za tę odpowiedź.źródło
Jest to cel kompilacji, który nie jest nazwą pliku.
źródło
Najlepszym wyjaśnieniem jest sam GNU make manual: sekcja 4.6 Fikcyjne cele .
.PHONY
jest jedną z wbudowanych specjalnych nazw marek . Istnieją inne cele, które mogą Cię zainteresować, więc warto przejrzeć te odniesienia.Możesz być także zainteresowany standardowymi celami marki, takimi jak
all
iclean
.źródło
Jest też jedna ważna podstępna metoda „.PHONY” - kiedy cel fizyczny zależy od fałszywego celu, który zależy od innego celu fizycznego:
TARGET1 -> PHONY_FORWARDER1 -> PHONY_FORWARDER2 -> TARGET2
Po prostu można oczekiwać, że jeśli zaktualizujesz TARGET2, to TARGET1 należy uznać za nieaktualny w stosunku do TARGET1, więc TARGET1 powinien zostać odbudowany. I to naprawdę działa w ten sposób .
Trudna część polega na tym, że TARGET2 nie jest przestarzały w stosunku do TARGET1 - w takim przypadku należy spodziewać się, że TARGET1 nie powinien zostać odbudowany.
To zaskakująco nie działa, ponieważ: fałszywy cel i tak został uruchomiony (jak zwykle fałszywe cele) , co oznacza, że fałszywy cel został uznany za zaktualizowany . Z tego powodu TARGET1 jest uważany za przestarzały w stosunku do fałszywego celu .
Rozważać:
Możesz się tym pobawić:
Możesz zobaczyć, że fileall zależy od file1 pośrednio poprzez fałszywy cel - ale zawsze jest odbudowywany z powodu tej zależności. Jeśli zmienisz zależność
fileall
zfilefwd
nafile
, terazfileall
nie będzie ona przebudowywana za każdym razem, ale tylko wtedy, gdy któryś z zależnych celów jest nieaktualny w stosunku do niego jako plik.źródło
Specjalny cel
.PHONY:
pozwala zadeklarować fałszywe cele, abymake
nie sprawdzały ich jako rzeczywistych nazw plików: będzie działał przez cały czas, nawet jeśli takie pliki nadal istnieją.Możesz umieścić kilka
.PHONY:
w swoimMakefile
:Istnieje inny sposób deklarowania fałszywych celów: wystarczy wpisać „::”
„::” ma specjalne znaczenie: cele są fałszywe, a ponadto mogą pojawiać się kilka razy:
Bloki poleceń będą wywoływane jeden po drugim.
źródło
Często używam ich, aby powiedzieć domyślnemu celowi, aby nie strzelał.
Bez fałszywej,
make superclean
by ogieńclean
,andsomethingelse
icatcher superclean
; ale dzięki PHONYmake superclean
nie zwolnicatcher superclean
.Nie musimy się martwić, że
clean
celem będzie PHONY, ponieważ nie jest on całkowicie fałszywy. Chociaż nigdy nie tworzy czystego pliku, ma polecenia do uruchomienia, więc make pomyśli, że jest to ostateczny cel.Jednak
superclean
cel jest naprawdę fałszywy, więc make spróbuje go ułożyć w stos z czymkolwiek innym, co zapewnia dep dlasuperclean
celu - w tym innesuperclean
cele i%
cel.Zauważ, że nie mówimy nic o
andsomethingelse
lubblah
, więc najwyraźniej idą do łapacza.Dane wyjściowe wyglądają mniej więcej tak:
źródło