Make-файлы, файлы «configure» и другие инструменты компиляции - как они работают? Почему они работают так, как работают?

Я все еще новичок в мире UNIX /Linux и, в частности, в связанных инструментах, таких как компилятор GCC. А именно, я все еще новичок в make-файлах и подобных вещах (я использую MinGW в Windows), поскольку до сих пор большая часть моей разработки была с IDE, такими как Visual Studio и Eclipse.

Когда я открываю обычную папку проекта, я вижу такие файлы:

configure
make
INSTALL
install-sh  (or a variant)

Здесь довольно много вещей, которые я не понимаю, и мои основные вопросы таковы:

  1. В чем разница между ними и зачем нам каждый? (В мире IDE все, что у вас есть, это файл проекта; вот и все. Поэтому я запутался, почему у нас здесь больше, чем просто make-файл.)

  2. Как создаются эти файлы? Для небольших проектов вы, возможно, могли бы написать их вручную, но для больших проектов, таких как GCC, было бы даже смешно пытаться. Мне показалось, что редактировать эти файлы было больно, и я пришел к выводу, что я не должен изменять их вручную. Но если так, то какие инструменты обычно используют люди для добавления и изменения этих файлов?

  3. Почему они не используют подстановочные знаки внутри make-файла? Почему для каждого отдельного объектного файла существует одна строка? Это из-за ограничения или есть преимущество?

  4. В чем разница между наличием сценария оболочки, который вызывает компилятор для каждого файла, и наличием makefile , который делает то же самое? В Windows мне очень хотелось бы просто создать командный файл внутри папки и скомпилировать все с этим - не нужно больше, чем один файл. Какая разница? Почему для компиляции всего не существует одного файла .sh?

Бонусный вопрос:

  • Существует ли "стандартный" формат make-файла? Я видел разные make инструменты, которые не принимают форматы друг друга ... как я знаю, что использовать? GCC - это просто обычный инструмент, или есть какой-то стандарт, которому все должны следовать?

У меня, вероятно, будет больше вопросов, когда я узнаю больше о структуре подобных проектов, но сейчас это мои самые большие вопросы. :)

9 голосов | спросил Mehrdad 22 MarpmTue, 22 Mar 2011 12:17:16 +03002011-03-22T12:17:16+03:0012 2011, 12:17:16

2 ответа


0

Есть много причин для разных вещей, но в итоге все сводится к переносимости. Во время Unix-войн все платформы были разными, и люди пытались создавать программное обеспечение, которое могло бы работать на максимально возможном количестве. Так что общие знаменатели должны были быть найдены. sh был одной из таких общих черт, поэтому скрипты configure были написаны так, чтобы использовать максимально переносимый sh. Максимальная переносимость подразумевает использование минимального набора функций. Различные реализации make сильно различаются по функциям, которые они поддерживают, поэтому были написаны файлы Makefile, которые использовали как можно меньше функций. Сегодня дела обстоят немного лучше, но проблемы с переносимостью по-прежнему способствуют тому, что вы видите.

ответил William Pursell 22 MarpmTue, 22 Mar 2011 12:24:03 +03002011-03-22T12:24:03+03:0012 2011, 12:24:03
0
  1. configure - это скрипт, который устанавливает среду сборки и, возможно, генерирует make-файл. С помощью make вы создаете проект с помощью make install или install.sh или аналогичные, вы устанавливаете скомпилированные файлы. Если вы хотите проверить что-то локально, вы можете пропустить финальную часть, чтобы она была отдельной.
  2. Вы можете использовать GNU autotools .
  3. Можете ли вы привести конкретные примеры? Make-файлы поддерживают шаблоны, и они время от времени используются.
  4. Makefile обрабатывает зависимости и автоматическую перекомпиляцию только необходимых файлов, если вы что-то изменили в исходном файле, а затем решили пересобрать проект. С пакетным файлом вы будете перекомпилировать все, с Makefiles вы только компилируете то, что было изменено.
ответил jho 22 MarpmTue, 22 Mar 2011 12:23:26 +03002011-03-22T12:23:26+03:0012 2011, 12:23:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132