Як цей Makefile робить програму C, навіть не вказавши компілятор?


41

Я використовував Makefile з книги " Розширене програмування Linux (2001)" [код] . Мені було дивно бачити, що GNU make компілює код правильно, навіть не вказуючи компілятор у Makefile. Це як випічка без жодного рецепта!

Це мінімальна версія коду:

тест.c

int main(){}

Makefilefile

all:            test

і змусити насправді працювати! Це команда, яку вона виконує:

cc     test.c   -o test

Я не зміг знайти нічого корисного в документації. Як це можливо?


PS Одна додаткова примітка: Навіть мова не вказана; Оскільки test.cдоступний, GNU makeвикористовує cc. Якщо існує test.cppабо test.cc(коли його немає test.c), він використовує g++(а ні c++).


4
"Це як випічка без жодного рецепту!" Рецепт підказує вам кип'ятити воду, але не варто кип'ятити воду за допомогою каструлі на газовій плиті, каструлі на індукційній плиті, електричного чайника чи казана, поставленого на штатив над вогнем. Навіть не сказати б тобі, де слід взяти воду. Це як сказати makeкип'ятити воду і, використовуючи її внутрішні правила, makeпросто
з’ясуємо

1
@Rhymoid Це як кричати: я хочу торт! І тоді робот, який називається, makeперевіряє ваш холодильник і виявляє, що є трохи борошна, а потім випікає торт за замовчуванням для вас зі свого внутрішнього рецепта. :-)
Ho1

@ Ho1: Робот може запитати, який торт ви хочете мати, сер? :): D
Сухі

Відповіді:


68

Make робить це за допомогою своїх вбудованих правил . Вони, зокрема, розповідають, як компілювати код C та як зв’язувати програми з одним об'єктом.

Ви фактично навіть не потребуєте Makefile:

make test

працював би без одного.

Щоб побачити приховані правила, які роблять все це можливим, скористайтеся -pопцією без Makefile:

make -p -f /dev/null

Як вказував алефжеро , Make дуже довго вбудовував правила (якщо не завжди); Перша версія Стюарта Фельдмана в Unix V7 визначає їхfiles.c , і його папір 1979 року згадує про них. Вони також є частиною специфікації POSIX . (Це не означає, що всі реалізації Make підтримують їх - стара Borland Make для DOS не має, принаймні, до версії 3.0.)


2

5
@KingZoingo Make - це фактично двигун висновків різного роду: він має набір правил (вбудований і з Makefile), наявні артефакти (файли в поточній директорії або названі в Makefile) та запитувані артефакти (цілі в Makefile); він просто намагається зіставити правила та існуючі артефакти, щоб визначити, чи може він використовувати їх для отримання запитуваних артефактів. Вбудовані правила говорять, що його test.cможна використовувати для створення test. make -dдокладно покажемо процес ...
Стівен Кітт

4
@ Ho1 @StephenKitt Це було makeзадовго до винайдення GNU або POSIX. Перша версія була написана майже 40 років тому, і ще до цього були деякі прототипові версії, побудовані із скриптів оболонки.
alephzero

3
@jamesqf CPPвсе ще викликає препроцесора ( cc -Eяк правило); компілятор C ++ є CXX.
Стівен Кітт

3
@ Ho1 CXXв цьому контексті є змінною Make, а не командою - $(CXX)у Makefile буде замінено командою для запуску компілятора C ++.
Стівен Кітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.