Wiem, że mogę przerwać make
proces w dowolnym momencie bez konieczności ponownej kompilacji całego drzewa źródeł. Jak wiem, make
kompiluje cel tylko wtedy, gdy nie został jeszcze skompilowany lub kod źródłowy został zmodyfikowany po ostatniej kompilacji.
Ale jeśli przeszkodzę make
, na pewno będzie jeden lub więcej (w zależności od poziomu współbieżności) w połowie gotowych plików binarnych. Co to robi z nimi przy następnym uruchomieniu make
? Czy też kończy bieżący cel, gdy naciskam Ctrl+, Caby uniknąć częściowo skompilowanych plików binarnych?
11
Odpowiedzi:
Mówiąc prościej, można pomyśleć
make
o (prawdopodobnie dużej) liczbie kroków, przy czym każdy krok przyjmuje liczbę plików jako dane wejściowe i tworzy jeden plik jako dane wyjściowe.Krokiem może być „skompiluj
file.c
dofile.o
” lub „użyjld
do połączeniamain.o
ifile.o
doprogram
”. Jeśli przerywamake
się CtrlC, a następnie krok aktualnie wykonywany zostanie zakończony, które będą (lub powinien) usunąć plik wyjściowy został pracuje. Zwykle nie ma po nich żadnych „w połowie gotowych plików binarnych”.Po ponownym uruchomieniu
make
, spojrzy na znaczniki czasu wszystkich plików wejściowych i wyjściowych i uruchom ponownie kroki, w których:Ogólnie oznacza to, że jeśli wykonanie kroku zajmuje dużo czasu (jest to rzadkie na nowoczesnych komputerach, ale
ld
etap dla dużych programów może z łatwością zająć wiele minut, jeślimake
został zaprojektowany), wówczas zatrzymanie i ponowne uruchomieniemake
rozpocznie ten krok od początku.Rzeczywistość średniej
Makefile
jest znacznie bardziej skomplikowana niż powyższy opis, ale podstawy są takie same.źródło
Ctrl+ Cpowoduje
SIGINT
wysłanie a do uruchomionego procesu. Ten sygnał może zostać przechwycony przez proces. W kodzie źródłowym make można znaleźć pułapkę dla tego sygnału wcommands.c
:remove_intermediates()
jest funkcją czyszczeniamake
, zobacz jej definicję tutaj:Później w funkcji, którą zobaczysz, zostaną skutecznie usunięte:
Wniosek: ogólnie nie bój się przerywać kompilacji
make
. Jeśli nie jest to sygnał nie do złapania (SIGKILL, SIGSEGV, SIGSTOP
), wyczyści pliki pośrednie.źródło
SIGSEGV
jest możliwe do złapania na wielu Unikach.Gdy coś się zatrzymuje
make
(ctrl-C, zamknięcie, a nawet polecenie, które się nie powiedzie), praca już wykonana zostaje. Po ponownym utworzeniumake
robi jak zawsze: sprawdza, co jeszcze należy zrobić (ponieważ plik został zmieniony lubmake
nigdy nie został przetworzony, nie ma znaczenia) i kontynuuje pracę.Powyższy opis wyraźnie zakłada, że odpowiednie
Makefile
s opisują zależności i polecenia do prawidłowego wykonania, więc wszystko, co należy (ponownie) wykonać.źródło