Расположение Makefile по умолчанию?

#makefile #gnu-make

#makefile #gnu-make

Вопрос:

Как в лекции 1 по CS50, так и в этом старом видео GDB CS50, которое они используют make без какого-либо makefile предварительного присутствия, и оно вызывает clang с несколькими аргументами. Однако, когда я запускаю, make кажется, что он использует cc .

Я полагал, что это должно было означать, что при каждом моем запуске makefile используется значение по умолчанию make . Я проверил make документы и не смог найти ничего, подтверждающего мою теорию. Однако в онлайновом документе для GNU make есть строка:

Если вы не используете флаг ‘-f’ или ‘--file’ , по умолчанию выполняется попытка GNUmakefile , makefile и Makefile в таком порядке и используется первый из этих трех, который существует или может быть создан.

В конце этого он направляет меня к другому разделу, в котором говорится:

Если make не находит ни одного из этих имен, он не использует никакой makefile. Затем вы должны указать цель с помощью аргумента команды и make попытаетесь выяснить, как ее переделать, используя только встроенные неявные правила.

Вот примеры скриншотов обоих видео: CS50 Лекция 1

старое видео GDB CS50

Это то, что make может сделать?

Комментарии:

1. Почитайте о неявных правилах — это должно предоставить много информации о том, что make делается в таких случаях.

Ответ №1:

Make имеет ряд встроенных правил, которые используют ряд переменных по умолчанию, которые используются, если makefile не существует (или если makefile существует, но не переопределяет эти встроенные правила или переменные другими).

Однако встроенные значения по умолчанию всегда должны использоваться cc для компилятора C, и компилятору вообще не предоставляются флаги, за исключением basic -o и -c .

Однако значения этих переменных по умолчанию могут быть переопределены переменными среды. Итак, если это действительно так, что makefile отсутствует, но все же используются эти дополнительные флаги, возможно, они определили некоторые переменные среды, такие как:

 export CC=clang
export CFLAGS='....'
  

(Я не смог скопировать и вставить флаги с вашего скриншота, и у меня не было желания перепечатывать, так что вам придется их представить).

Кроме того, имейте в виду, что они могли установить MAKEFILES переменную окружения так, чтобы она указывала на makefile или набор makefiles, которые будут прочитаны, даже если локального makefile не существует.