Насколько важно изучать make-файлы? [закрыто]

12

Я работаю на с ++ в основном как хобби (я все еще учусь в школе, и поэтому у меня нет настоящей работы). Среды разработки генерируют make-файл для меня, и поэтому мне интересно, стоит ли учиться создавать их самостоятельно. Под «стоящим изучением» я имею в виду, должен ли я отбросить все и научиться писать их, прежде чем продолжать изучать c ++? Будет ли их изучение действительно необходимым? Если да, я должен узнать о них (общий синтаксис и понимание того, как они работают и т. Д.) Или действительно научиться их писать?

sinθ
источник
1
большинство проектов с открытым исходным кодом так или иначе интенсивно используют make-файлы. Итак, да, вы должны узнать, как работают make-файлы. Написание их вручную - это еще одна история, и ее следует избегать, предпочитая создавать их каким-либо инструментом, за исключением того, что у вас очень мало файлов или вы можете использовать общие / неявные правила и другие подобные методы
permeakra
если вы хотите, чтобы другие компилировали ваш исходный код в Linux и другой операционной системе на основе Unix, вам необходимо изучить их.
Вы могли бы изучить основы make-файлов, зависимостей, подстановок и т. Д. За меньшее время, которое понадобится вам, чтобы прочитать все ответы на этот вопрос :)
JohnB

Ответы:

14

Да, определенно стоит понять, как работают Makefiles. Возможно, это не относится к вам сейчас (потому что вы используете IDE, которая их генерирует), но есть вероятность, что знания будут полезны в будущем.

Под «стоящим изучением» я имею в виду, должен ли я отбросить все и научиться писать их, прежде чем продолжать изучать c ++?

Честно говоря, это странное понятие "стоит учиться" ...

Но нет, я не думаю, что тебе нужно это делать.

Будет ли их изучение действительно необходимым?

Мы не можем предсказать, действительно ли вам понадобятся эти знания в будущем. Это зависит от того, продолжаете ли вы программирование на C ++ и в каком контексте вы это делаете.

Если да, я должен узнать о них (общий синтаксис и понимание того, как они работают и т. Д.) Или действительно научиться их писать?

Я бы порекомендовал оба. Если вы не можете написать Makefile, это спорно, что вы знаете, что происходит.

Есть другая точка зрения, которая говорит, что слишком много знаний не полезно.

Если вы углубитесь в это, вы узнаете, что существует множество разных версий Make, и что написание сложного Makefile, который работает с несколькими версиями Make на разных платформах ... сложно. Тем не менее, в мире открытого исходного кода, «наилучшей практикой» является использование таких инструментов, как automake, autoconfи так далее, для генерации make-файлов и т. Д. Если вы это сделаете, большая часть сложности, связанной с версией / платформой, решается за кулисами. ,


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

Стивен С
источник
8

Если вы работаете с открытыми или Unix-подобными операционными системами, да. Примите мужество, хотя, они не так сложны. Обучение makeсэкономит вам много времени в долгосрочной перспективе.

EhevuTov
источник
Учимся читать или учимся писать?
И то и другое. Вы хотите знать, как его читать, чтобы вы могли отлаживать проблемы программного обеспечения, которое вы используете, или писать, чтобы вы могли создавать свои собственные.
EhevuTov
Тогда я должен не согласиться с письменной частью. Существует множество других - возможно, гораздо лучших - способов автоматизации сборок. Написание действительно полезных make-файлов далеко не тривиально и не нужно.
3

Makefile важны в системах UNIX (например, AIX, Linux, OS X). Тем не менее, я думаю, что их абсолютная важность «ты должен знать это» в последние годы уменьшилась. Например, вы действительно не можете найти их в разработке Windows (Visual Studio и т. Д.), А XCode (в OS X) вообще использует другую систему. Я не сильно разбираюсь в Java, но там я думаю, что они используют муравьиные файлы и еще много чего.

Существует очень крутая система, называемая CMake, которая генерирует собственные файлы сборки для операционной системы, на которой вы работаете. Например, если вы пишете спецификацию своего проекта в CMake, то вы можете создать проект сборки Visual Studio в Windows, проект XCode в Mac и Makefile в Linux. В некотором смысле, CMake заменяет autoconf и automake.

Я обычно создаю файлы CMake для своих «больших проектов», но я знаю Make на тот случай, если я хочу написать быстрый Makefile «просто сделай это». Это хорошо для вашей культурной грамотности, потому что существуют тонны и тонны программных библиотек, которые используют Makefiles, и вам неизбежно придется редактировать определенные компиляторы и места расположения библиотек. Но вы обнаружите, что большие проекты (такие как KDE) переходят на CMake и тому подобное, поскольку у Make есть некоторые ограничения, которые поднимают их уродливую голову, когда проекты становятся сложными.

Эрик Браун
источник
Изучение CMake будет на порядок выгоднее. Make-файлы можно рассматривать как подробности реализации - не беспокойтесь о том, чтобы изучать их (пока они действительно не будут вынуждены это делать), так же, как файлы проекта Visual Studio.
2

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


источник
Хотите объяснить, почему make-файлы представляют собой ужасную систему? По сравнению с чем?
JonnyJD
@JonnyJD: Во-первых, я не верю, что хорошая система сборки должна содержать файл make в каждом подкаталоге. Но это плохо, потому что его не намного проще использовать, чем писать файл bat, который действительно что-то говорит.
Похоже, вам не нравится создавать файлы сборки вручную. Что само по себе не имеет большого значения. Makefiles - это вариант, который должен быть доступен для чтения и записи вручную. (модульный, только упрощает отслеживание зависимостей по сравнению с bash / bat) Автоматизированная часть - automake. Единственное, что на самом деле сильно отличается - это указание зависимостей в графическом интерфейсе и сохранение всего этого в одном файле проекта. Или какая система сборки намного менее ужасна?
JonnyJD
2

Как и во многих аспектах вывода IDE, типичный автоматически сгенерированный make-файл часто неэффективно структурирован.

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

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

Андрей
источник
2

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

Blrfl
источник
1

Научиться писать Makefiles - хорошая идея по ряду причин.

  1. Make - это язык, который позволяет вам кодировать зависимости между компонентами через правила. Вы получите большой опыт написания кода таким образом, и это расширит ваши инструменты для решения проблем программирования.
  2. Принципы, которые вы изучаете с помощью Make, можно использовать с Ant, Maven и Rake, если вы решите изучать программирование в мире Java или Ruby.
  3. У многих IDE есть волшебные файлы, которые содержат информацию о конфигурации, чтобы помочь вам создать программное обеспечение. Если вы мне не верите, попробуйте написать скрипт для сборки вашего программного обеспечения без IDE. Когда вы пишете свои собственные файлы Makefile, вы очень хорошо понимаете зависимости между вашим кодом, библиотеками и переменными среды. По мере того как системы становятся больше, это оказывается полезным инструментом для отладки вашей системы.
Джей Годсе
источник
0

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

Это не обязательно означает, что вы должны иметь возможность создавать все файлы сборки вручную. Важной частью является понимание того, что система сборки делает для вашего проекта, и общая возможность компилировать небольшие проекты вручную (как в «наборе команд на терминале»).

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

Почему / когда изучать Makefiles

Если вы продолжаете программировать только для Windows и не ожидаете, что кто-то другой скомпилирует ваш код, смело компилируйте код так, как вам нравится.

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

Если вы хотите программировать для разных платформ, вам, безусловно, нужно использовать широко распространенную систему сборки.

Это по-прежнему не означает, что вы должны знать, как автоматически сгенерированные Make-файлы работают в деталях. Вам просто нужно знать, как работают входные файлы для системы сборки. У них просто бывает похожий синтаксис.


Мне лично очень нравятся Makefiles, и я использую их для многих вещей. Не только компиляция кода. Я создаю Makefile для каждого большего PDF-файла, который я создаю (с LaTeX), и для каждого проекта, в котором мне нужно автоматизировать пару задач (сборка, упаковка, выгрузка, обновление зависимостей из исходных репозиториев, резервное копирование вручную / извлечение)

Тем не менее, я много работаю на терминале и работаю с Linux. Я не использую то, что вы бы назвали IDE, кроме vim (мощный текстовый редактор) и консольных инструментов. Это может сильно отличаться для вас.

Если вы когда-либо жаловались на необходимость запуска различных повторяющихся команд просто для «обновления» / package / upload / .. «проекта», то изучение написания Makefiles может оказаться для вас полезным.

Если у вас есть и вы используете инструменты / GUI / IDE для всего, то вы можете ничего не получить от этих знаний.

JonnyJD
источник