Jestem początkującym make
i zastanawiam się, kiedy użyć make clean
.
Jeden kolega powiedział mi, że przyrostowe kompilacje make
oparte są na znacznikach czasowych plików. Tak więc, jeśli pobierzesz starą wersję pliku w VCS, będzie on miał „stary” znacznik czasu i będzie oznaczony jako „nie ma potrzeby ponownej kompilacji tego pliku”. Wtedy ten plik nie zostałby włączony do następnej kompilacji.
Według tego samego kolegi byłby to powód do korzystania make clean
.
Tak czy make clean
inaczej, z grubsza uzyskałem odpowiedź na pytanie „kiedy używać ” z innych pytań StackExchange, ale moje inne pytanie brzmi:
Dlaczego kompilacje przyrostowe przy użyciu
make
polegają na sygnaturach czasowych plików, a nie na przykład na SHA-1? Na przykład Git pokazuje, że możemy z powodzeniem ustalić, czy plik został zmodyfikowany za pomocą SHA-1.
Czy dotyczy to problemów z prędkością?
make
powstał w latach 70-tych. SHA-1 powstał w latach 90-tych. Git powstał w latach 00-tych. Ostatnią rzeczą, jakiej pragniesz, jest to, że niektóre niejasne wersje działające przez 30 lat nagle zawiodą, ponieważ ktoś zdecydował się na nowoczesność dzięki wypróbowanemu i przetestowanemu systemowi.make
oprogramowania, oprogramowanie się nie zepsuje, alemake
raczej starasz się zachować kompatybilność wsteczną w nowych wersjach. Zmiana zachowania rdzenia bez uzasadnionego powodu jest wręcz przeciwna. A daty pokazują, dlaczego pierwotnie nie został stworzony do użycia SHA-1 lub dlaczego nie było łatwo go zmodernizować, gdy stał się dostępny (make
miał wtedy już dekady).Odpowiedzi:
Oczywistym (i prawdopodobnie powierzchownym) problemem byłoby to, że system kompilacji musiałby rejestrować skróty plików, które zostały użyte dla ostatniej kompilacji. Chociaż ten problem można z pewnością rozwiązać, wymagałby on bocznego przechowywania, gdy informacje o znaczniku czasu są już obecne w systemie plików.
A tak na poważnie, skrót nie przekazałby tej samej semantyki. Jeśli wiesz, że plik T został zbudowany z zależności D z haszowaniem H 1, a następnie dowiesz się, że D teraz haszuje do H 2 , czy powinieneś przebudować T ? Prawdopodobnie tak, ale możliwe, że H 2 faktycznie odnosi się do starszej wersji pliku. Znaczniki czasu definiują porządek, podczas gdy skróty są porównywalne tylko dla równości.
Obsługa znaczników czasu polega na tym, że można po prostu zaktualizować znacznik czasu (na przykład za pomocą narzędzia wiersza polecenia POSIX
touch
), aby oszukać,make
że zależność uległa zmianie lub - co ciekawsze - cel jest nowszy niż jest w rzeczywistości. Podczas gdy gra się tym, jest świetną okazją do zastrzelenia się w stopę, jest jednak przydatna od czasu do czasu. W systemie opartym na haszowaniu potrzebna byłaby pomoc samego systemu kompilacji, aby zaktualizować wewnętrzną bazę danych skrótów używanych dla ostatniej kompilacji bez budowania czegokolwiek.Chociaż z pewnością można argumentować za używaniem skrótów zamiast znaczników czasu, moim celem jest to, że nie są one lepszym rozwiązaniem dla osiągnięcia tego samego celu, ale innym rozwiązaniem dla osiągnięcia innego celu. Który z tych celów jest bardziej pożądany, może zostać poddany debacie.
źródło
D
teraz do skrótówH2
, a nie masz jakiś wyjściowyT2
zbudowany zD@H2
, trzeba produkować i przechowywać go. Następnie, niezależnie od tego, w jakiej kolejnościD
przełączane są między stanamiH1
iH2
, będziesz mógł używać danych wyjściowych z pamięci podręcznej.Hashowanie całego projektu jest bardzo wolne. Musisz przeczytać każdy bajt każdego pliku. Git nie haszuje każdego pliku przy każdym uruchomieniu
git status
. Kasy VCS również nie ustawiają czasu modyfikacji pliku na pierwotny czas autorstwa. Jeśli to zrobisz, zostanie przywrócona kopia zapasowa. Cały powód, dla którego systemy plików mają znaczniki czasu, dotyczy takich przypadków użycia.Deweloper zwykle działa,
make clean
gdy zmienia się zależność, która nie jest bezpośrednio śledzona przez plik Makefile. Jak na ironię, zwykle obejmuje to sam Makefile. Zwykle zawiera również wersje kompilatora. W zależności od tego, jak dobrze napisany jest Twój plik Makefile, może on zawierać wersje bibliotek zewnętrznych.Są to rzeczy, które mają tendencję do aktualizowania się, gdy wykonujesz aktualizację kontroli wersji, więc większość programistów po prostu przyzwyczaja się do uruchamiania
make clean
w tym samym czasie, więc wiesz, że zaczynasz od czystej listy. Możesz uciec bez robienia tego dużo czasu, ale naprawdę trudno jest przewidzieć czasy, których nie możesz.źródło
Kilka uwag na temat skrótów a znaczników czasu w systemach kompilacji:
źródło