Ресурсы для обучения GNUMake?

Я пытаюсь изучить GNUMake для небольшого проекта, над которым я работаю. Пока что даже "базовые" учебники кажутся довольно грубыми, и я еще не понял синтаксис make файла.

Есть ли у кого-нибудь хорошие ресурсы для абсолютного новичка, чтобы познакомиться с GNUMake?

Ответ 1

Окончательное руководство http://www.gnu.org/software/make/manual/make.html
Существует книга o'reilly "Управление проектами с GNU Make", которая имеет больше объяснений. Вы также можете использовать более ранние версии, они не покрывают GnuMake специально, но намного тоньше.

Make является грязным секретом среди разработчиков - никто из нас этого не понимает, мы просто заимствуем make script от кого-то другого и меняем его. Я полагаю, что только один script был написан с нуля (вероятно, создателем инструмента).

Если вам нужно сделать больше, чем простой пример, большинство людей либо переключится на более современную систему сборки, например, Ant, либо свернет свой собственный в Perl/Python/и т.д.

Ответ 2

Наиболее часто используемые черты make можно разбить на несколько простых понятий, целей, зависимостей и переменных.

Цели - это те вещи, которые вы хотите построить, но команда под целью может быть командами или сценариями компилятора. Как правило, каждая цель относится к модулю в вашем коде, но вы можете сделать их такими же гранулярными, как вы хотите, чтобы соответствовать вашему проекту.

Зависимости - это файлы или другие цели в вашем проекте. Лучший пример этого - для проекта C, в котором вы строите двоичный файл из группы объектных файлов. Каждый объектный файл должен существовать до того, как вы сможете создать двоичный файл, поэтому make будет перемещаться по вашим целям до тех пор, пока все зависимости не будут завершены, а затем запустите команду для общей цели.

Переменные не всегда необходимы, но очень удобны для обработки таких вещей, как флаги компилятора. Каноническими примерами являются CC и CCFLAG, которые будут ссылаться на компилятор, использующий i.e gcc и флаги, такие как -ansi -Wall -o2.

Несколько общих советов и трюков:

  • Команды должны выполняться символом [tab], иначе они не будут выполнены, это всего лишь старая реликвия make, я не помню, почему это так.
  • По соглашению, вы можете включить всю цель, чтобы указать значение по умолчанию, которое должно быть по умолчанию. Это полезно, когда у вас есть сложный make файл, и есть та или иная цель, которой вы всегда хотите быть по умолчанию.
  • Ваш make файл должен быть вызван makefile или Makefile, но если вы хотите называть его чем-то другим, используйте $make -f [makefilename]
  • Всегда используйте полный синтаксис расширения переменных, т.е. $(VARIABLE) или make не могут выводить нужные команды.
  • make может работать рекурсивно, поэтому, если у вас есть куча подмодулей в вашем проекте, которые живут внутри каталогов, вы можете вызвать make из файла подкаталога из make make изнутри.
  • Если у вас действительно сложный проект, который требует сценариев установки и т.д., вам, вероятно, также захочется исследовать autotools, который создает для вас файл makefile и выполняет кучу трюков, чтобы проверить существование библиотеки и другие проблемы с переносимостью.

Ответ 3

Я согласен с предложением книги О'Рейли.

За некоторыми полезными советами, трюками и проницательностью в Make смотрите Mr. Сделать статьи

Ответ 4

"Управление проектами с GNU Make, 3rd edition" помещается в "Лицензию на бесплатную документацию GNU" и может быть законно прочитан онлайн бесплатно: link.

Ответ 5

mgb: Это еще хуже того. Я однажды написал сложную систему make с нуля (несколько тысяч файлов, пятьдесят или сотни каталогов, четыре или пять компиляторов и цели кросс-компиляции, 2 ОС и т.д.). Я сел и узнал, что гну сделал внутри и снаружи, разработал систему, сначала сыграл с прототипом. Мы были очень довольны результатом.

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

Ответ 6

Я не являюсь отличным поклонником информационной системы GNU, но я нашел полезные справочные страницы GNU очень полезными. Когда вы знаете самые основные понятия и примерно то, что доступно, я обнаружил, что информационные страницы - это самый быстрый способ передачи информации, например, предварительно построенных функций.

(Забудьте программу GNU info и используйте, например, pinfo.)