Правильно ли я понимаю MAKE?

#visual-studio #makefile #gnu

#visual-studio #makefile #gnu

Вопрос:

Взяв в качестве примера приложение GNU make, когда я создаю makefile, он уподобляется файлу проекта Visual Studio в том смысле, что он содержит список файлов и других элементов, необходимых для компиляции приложения. Makefile содержит путь к компилятору, а также путь ко всем файлам, которые могут быть использованы в операции компиляции. Приложение MAKE считывает makefile и объединяет исходные файлы в 1 файл, который затем компилятор считывает и преобразует в соответствующую сборку / машинный код.

Директива #include — это директива, которая предписывает make-файлу: «включите содержимое этого файла в эту точку файла большего размера, который вы создаете для отправки компилятору, а затем возобновите работу с текущим файлом».

Приложение MAKE также сообщает компилятору, куда «выдать» результат операции компиляции после завершения компиляции. В этом отношении файл Visual Studio .csproj технически представляет собой makefile на основе XML для конкретного приложения Microsoft MAKE.

Правильно ли это понимание makefiles?

Ответ №1:

Приблизительно, да. Однако есть множество деталей, к которым можно придраться.

Взяв в качестве примера приложение GNU make, когда я создаю makefile, он сравнивается с файлом проекта Visual Studio в том смысле, что он содержит список файлов и других элементов, необходимых для компиляции приложения.

Это достаточно близко к точности.

Makefile содержит путь к компилятору, а также путь ко всем файлам, которые могут быть использованы в операции компиляции.

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

Приложение MAKE считывает makefile и объединяет исходные файлы в 1 файл, который затем компилятор считывает и преобразует в соответствующую сборку / машинный код.

Это не очень точно. Детали различаются, но агрегирование выполняется не MAKE, а компиляторами, которые вызывают MAKE. MAKE можно использовать для других задач, помимо простого перевода исходного кода в машинный.

Директива #include — это директива, которая предписывает make-файлу: «включите содержимое этого файла в эту точку файла большего размера, который вы создаете для отправки компилятору, а затем возобновите работу с текущим файлом».

GNU Make (и POSIX Make) поддерживает include директиву для включения других фрагментов makefile. Компиляторы C и C распознают #include директиву — и makefile часто необходимо проинформировать о том, какие заголовки (включенные в #include директиву) необходимы для компиляции программы. Однако, #include это простой комментарий в файле makefile.

Приложение MAKE также сообщает компилятору, куда «выдать» результат операции компиляции после завершения компиляции.

Makefile содержит информацию о том, куда следует поместить сгенерированный код, и компилятору сообщается, нужно ли ему это знать.

В этом отношении файл Visual Studio .csproj технически представляет собой makefile на основе XML для конкретного приложения Microsoft MAKE.

Это разумное приближение к описанию.

Ответ №2:

В частности, вы правы в том, что makefile можно использовать таким образом, и часто так и делается. Обычно утилита make разрешает зависимости в следующих правилах, указывающих, какие элементы (в основном файлы) зависят от других и какие шаги (например, операции компиляции) необходимо предпринять для выполнения зависимости. Переменные и правила внутри makefiles соответствуют синтаксису утилиты make.