Czy istnieje ogólna zasada określająca, kiedy należy używać „make clean” zamiast po prostu „make”?

11

Piszę teraz program składający się z wielu plików i najwyraźniej uruchamiam tylko polecenie „make” (jak można by intuicyjnie sądzić, że należy zrobić w większości sytuacji) z jakiegoś powodu powoduje awarię mojego programu. Wydaje mi się, że mogę podać więcej szczegółów na temat problemu, ale ważne jest to, że działa on przy użyciu polecenia „make clean”. Zastanawiałem się więc, czy ktokolwiek znał ogólną ogólną zasadę działania „wyczyść” zamiast po prostu „zrobić”

Mroczny Templariusz
źródło

Odpowiedzi:

17

Czyścisz w dwóch sytuacjach - gdy chcesz spakować kod źródłowy (a zatem nie potrzebujesz / nie chcesz zbudować obiektów) LUB, gdy masz powód, by sądzić, że zbudowane obiekty są złe.

W twoim przypadku używasz opcji „oczyść”, aby rozwiązać problem, który prawdopodobnie jest wynikiem wadliwego pliku Makefile. Coś tam nie kompiluje się ponownie, kiedy powinno, a to powoduje, że wyjściowy plik binarny jest zły.

Istnieje wiele przyczyn, które mogą się zdarzyć, w zależności od złożoności projektu i sposobu jego wykorzystania, ale jego sedno jest następujące: musisz poświęcić trochę czasu na debugowanie pliku Makefile.

Michael Kohne
źródło
6
Zapominasz o „pewnych zmianach w środowisku kompilacji”, takich jak uaktualniony kompilator, nowe wersje bibliotek itp. Zawsze dobrym pomysłem jest „wyczyścić” w tych przypadkach, aby upewnić się, że wszystkie moduły śpiewają z tego samego arkusza!
James Anderson
2
@JamesAnderson Można argumentować, że są to po prostu błędne pliki Makefile.
Kristof Provost
4
@KristofProvost: Nie jestem pewien, czy nazwałbym „New ABI” (być może poprzez wprowadzenie nowej wersji kompilatora) „błędnym Makefile”. Wystarczająco wykracza poza zakres tego, na co spodziewałbym się „zrobić”.
Vatine
1
To prawda, ale możliwe jest (i wcale nie takie trudne) dodanie kompilatora do plików makefile jako warunek wstępny. To wystarczy, aby złapać problem. Podsumowując, nie jest to ogromny problem, a mimo to bardzo rzadki. Zwróciłem na to uwagę, ponieważ użyłem (i napisałem) plików makefile, które uwzględniają flagi kompilatora i tym podobne. Jest to również dość rzadkie w plikach makefiles, ale bardzo przydatne (bardziej niż sprawdzanie kompilatora;)). Moje oczekiwania dotyczące dobrych, dobrze napisanych plików makefile są dość wysokie. Moje oczekiwania dotyczące średniego makefile są raczej niższe ...
Kristof Provost
8

Zgadzam się z odpowiedzią Michaela Kohne'a w ogóle. Dodam, że musisz przeczytać dokumentację instalacyjną, aby wiedzieć, co właściwie robi „uprzątnij”. Mogą istnieć różne poziomy czystości, które mogą być potrzebne, na przykład „make realclean” i „make distclean”. Istnieją nieformalne konwencje, ale nic nie jest wyryte w kamieniu.

Bill Ruppert
źródło
2
+1: „musisz przeczytać dokumenty instalacyjne, aby wiedzieć, co faktycznie robi„ czyść ”. Nie ma „ogólnej zasady”. Musisz przeczytać dokumenty.
S.Lott,
5

Rozumiem, że to twój projekt, więc to twój makefile. Moim celem jest, aby make zawsze produkować poprawną kompilację, jeśli jest to możliwe. Jeśli make cleankonieczne jest wyleczenie się z jakiegoś stanu, to moim zdaniem makefilejest to niewłaściwe i powinno zostać poprawione. Jeśli twoje zależności zostały poprawnie obliczone, prosty makepowinien zrekompilować wszystko, co wymaga ponownej kompilacji.

Kevin Cline
źródło
2
Zgadzam się. W dzisiejszych czasach prawie nieskończonego miejsca na dysku nie jest już problemem, ale jestem wystarczająco stary, aby pamiętać, kiedy make clean i realclean były używane głównie do oszczędzania miejsca na dysku po utworzeniu połączonego pliku wykonywalnego. Tworzenie GCC, apache, perl itp. Pozostawiło wiele rzeczy dookoła.
Bill Ruppert,
1

Przed nocną kompilacją biegałbym „czyścić”. W takim przypadku dodatkowy czas potrzebny na wykonanie pełnej kompilacji prawdopodobnie nie będzie miał większego znaczenia, ale dodatkowe bezpieczeństwo wynikające z upewnienia się, że wszystko jest w odpowiedniej wersji, prawdopodobnie jest tego warte.

Zachary K.
źródło
Będzie to zależeć od wielkości twojego projektu. Tam, gdzie używam do pracy, przyrostowa kompilacja zajęłaby 2-4 godziny, a zmiany z innych witryn zostały wprowadzone z dnia na dzień. Czysta kompilacja może zająć od 7 do 9 godzin. Ponadto czasami mieliśmy 2 lub 3 gałęzie, które chcielibyśmy zbudować. Nawet na szybkich komputerach bardzo duże bazy kodu muszą być traktowane zupełnie inaczej niż mniejsze.
TafT,