Korzystałem z pliku Makefile z książki „ Advanced Linux Programming (2001)” [kod] . Dziwne było dla mnie, że GNU make poprawnie kompiluje kod, nawet nie określając kompilatora w Makefile. To jak pieczenie bez przepisu!
To jest minimalna wersja kodu:
test.c
int main(){}
Makefile
all: test
i spraw, by naprawdę działało! Jest to polecenie, które wykonuje:
cc test.c -o test
Nie mogłem znaleźć niczego przydatnego w dokumentacji. Jak to mozliwe
PS Jedna dodatkowa uwaga: Nawet język nie jest określony; Ponieważ test.c
jest dostępny, GNU make
używa cc
. Jeśli istnieje test.cpp
lub test.cc
(gdy nie ma test.c
), używa g++
(i nie c++
).
make
gotować wodę, a stosując jej wewnętrzne zasady,make
po prostumake
sprawdza lodówkę i dowiaduje się, że jest dostępna mąka, a następnie wypieka dla ciebie domyślne ciasto z wewnętrznego przepisu. :-)Odpowiedzi:
Make robi to przy użyciu swoich wbudowanych reguł . Mówią one w szczególności, jak skompilować kod C i jak połączyć programy z jednym obiektem.
W rzeczywistości nie potrzebujesz nawet pliku Makefile:
działałby bez niego.
Aby zobaczyć ukryte reguły, które umożliwiają to wszystko, użyj
-p
opcji bez Makefile:Jak zauważył alephzero , Make ma wbudowane reguły od bardzo dawna (jeśli nie zawsze); Pierwsza wersja Stuarta Feldmana w Unixie V7 je definiuje
files.c
, o czym wspomina jego artykuł z 1979 roku . Są również częścią specyfikacji POSIX . (Nie oznacza to, że wszystkie implementacje Make je obsługują - stara Borland Make for DOS nie, przynajmniej do wersji 3.0).źródło
test.c
można go wykorzystać do produkcjitest
.make -d
pokaże ci szczegółowo proces ...make
długo przed wynalezieniem GNU lub POSIX. Pierwsza wersja została napisana prawie 40 lat temu, a wcześniej istniały pewne prototypowe wersje zbudowane ze skryptów powłoki.CPP
nadal wywołuje preprocesor (cc -E
zwykle); kompilatorem C ++ jestCXX
.CXX
w tym kontekście jest zmienną Make, a nie poleceniem -$(CXX)
w Makefile zostanie zastąpione poleceniem, aby uruchomić kompilator C ++.