← Back to team overview

millennium-dev team mailing list archive

Uwaga odnośnie używania make

 

Jakiś czas temu przygotowałem w obu projektach pliki Makefile zarządzające
zautomatyzowanym kompilowaniem.

Od tej pory nie używajcie skryptów ./build* do kompilowania. Zamiast tego
wpiszcie:
  make
i reszta powinna stać się sama, tj włączy się make, przeczyta po cichu
Makefile, zobaczy co wymaga przebudowania i włączy kompilator wypisując
komendy jakich używa.

Dlaczego z make jest fajniej? Przede wszystkim jest szybciej. Make
kompiluje wszystkie pliki .cpp osobno, i zawsze kompiluje tylko te, które
uległy zmianie od ostatniej kompilacji, co strasznie skraca czas budowy,
jeśli robicie poprawki tylko w jednym/kilku plikach, a nie w całości. Do
tego - w wypadku libmillennium - budowanie i serwera i klienta zajmuje
teraz mniej więcej tyle samo czasu co tylko jednego z nich, więc dwukrotnie
mniej.
A do tego przygotowałem makefile tak, by sam wykrywał nowo dodane pliki i
karty, o ile tylko są w odpowiednich katalogach, co oszczędzi roboty na
przyszłość.

Przydatne komendy make to przede wszystkim:
  make clean
która czyści jego tymczasowe pliki, tym samym zmuszając make do
przebudowania wszystkiego od nowa przy następnej kompilacji.
W wypadku libmillennium
  make server
  make client
  make ccardstack_test
buduje tylko jeden wybrany program. Natomiast:
  make all
buduje wszystkie. Synonimem do `make all` jest
  make

I teraz pora na uwagę o której wspomniałem w tytule maila.
Sprawa jest dosć nieoczywista.

Wyobraźmy sobie taką sytuację: wlączamy make, wlączamy program, wszystko
śmiga. Modyfikujemy jakąś jedną klasę (cpp i hpp), wlączamy znowu make, on
oczywiście tylko ten jeden zmieniony cpp przekompiluje, włączamy program:
wszystko się sypie, dziwaczne bugi, segfgaulty i bezsensowne problemy.
Chodzi o to, że skoro zmieniliśmy nagłówek, to trzeba by też przekompilować
wszystko co z niego korzysta, więc i sporo innych .cpp też... Z czasem
usprawnię naszego make tak, by sam to wykrywał, ale na razie nie rozkminia
on zależności między naszymi plikami nagłówkowymi, i w tej sytuacji
przekompilował za mało. W takim przypadku by poradzić sobie z problemem
wystarcza:
  make clean
  make
i będzie śmigać.

Czasami zdarza się, że merdżując coś wciągniecie do swojej lokalnej gałązki
zmiany, które są starsze chronologicznie niż skompilowane przez was
tymczasowe pliki .o. Wtedy też make będzie kompilował za mało, i macie duże
szanse że linker się poskarży na `undefined references`. W tej sytuacji
podobnie zmuście go do przekompilowania wszystkiego za pomocą:
  make clean
  make


No i w razie kłopotów/pytań możecie liczyć na moje wsparcie ;)

cielak