Я использовал Makefile из книги " Advanced Linux Programming (2001)" [code] . Мне было странно видеть, что GNU make правильно компилирует код, даже не указав компилятор в Makefile. Это как выпечка без рецепта!
Это минимальная версия кода:
test.c
int main(){}
Makefile
all: test
и сделать действительно работает! Это команда, которую он выполняет:
cc test.c -o test
Я не смог найти ничего полезного в документации. Как это возможно?
PS Еще одно примечание: даже язык не указан; Потому test.c
что доступно, GNU make
использует cc
. Если существует test.cpp
или test.cc
(когда нет test.c
), он использует g++
(а не c++
).
make
кипятить воду, и, используя свои внутренние правила,make
простоmake
проверяет ваш холодильник и узнает, что есть немного муки, а затем выпекает для вас торт по умолчанию из своего внутреннего рецепта. :-)Ответы:
Make делает это, используя свои встроенные правила . В частности, они рассказывают, как компилировать код на C и как связывать однообъектные программы.
Вам даже не нужен Makefile:
будет работать без одного.
Чтобы увидеть скрытые правила, которые делают все это возможным, используйте
-p
параметр без Makefile:Как указывает alephzero , в Make очень давно были встроенные правила (если не всегда); Первая версия Стюарта Фельдмана в Unix V7 определяет их
files.c
, и в его статье 1979 года упоминается о них. Они также являются частью спецификации POSIX . (Это не означает, что все реализации Make поддерживают их - старая Borland Make для DOS этого не делает, по крайней мере до версии 3.0.)источник
test.c
можно использовать для производстваtest
.make -d
подробно покажет вам процесс ...make
задолго до того, как были изобретены GNU или POSIX. Первая версия была написана почти 40 лет назад, и до этого было несколько прототипов, созданных из сценариев оболочки.CPP
прежнему вызывает препроцессор (cc -E
обычно); компилятор C ++ естьCXX
.CXX
в данном контексте - это переменная Make, а не команда -$(CXX)
в Makefile будет заменена команда для запуска компилятора C ++.