Прямое использование Make считается устаревшим? [закрыто]

31

Поэтому я сталкивался со многими комментариями / публикациями / и т. Д., Касающимися непосредственного создания make-файлов, и того, как это глупо делать в 2015 году. Мне известны такие инструменты, как CMake, и я на самом деле довольно часто использую CMake. Дело в том, что CMake просто создает Makefile для вас и помогает избавиться от скуки делать это самостоятельно. Конечно, он добавляет много других замечательных функций ... но в конце концов это все еще Makefile.

Поэтому мой вопрос заключается в том, является ли «устаревшим» разговор о make со ссылкой на всю утилиту Make или просто идея ручного написания ваших собственных Makefile? Я вообще не использую IDE для разработки на C / C ++ (просто emacs), поэтому я всегда писал Makefiles.

Если Make считается устаревшим, что разработчик C / C ++ должен использовать для создания небольших личных проектов?

JParrilla
источник
8
Для небольших личных проектов достаточно makeбез Makefile. В чем суета?
ot--
8
Каждая часть доступного программного обеспечения в моих системах FreeBSD, как для настольных компьютеров, так и для серверов, имеет Makefile, который запускается командой «make». Нет. 'Make' не устарел.
Роб
3
Люди могут свободно использовать IDE, но если их IDE не могут поддерживать проекты, использующие Makefiles спустя почти 40 лет после того, как они makeбыли впервые написаны, они не должны ожидать, что люди обойдут это.
Майлз Рут
1
«Устаревшие разговоры о делают» это просто симптом или точка боли , а не провозглашение устаревания. Особенно, когда превосходной полной замены еще не существует, и все подходы к уменьшению боли все еще используются в некоторых отношениях, просто скрытые от пользователей, которые наиболее подвержены боли. Хотя было дано много хороших ответов, сам вопрос носит пограничный характер.
Rwong
1
CMakeэто слой абстракции. Эта абстракция необходима, чтобы укротить дикое разнообразие потребительских IDE-продуктов, которые не соответствуют open-source Makefile. Опять же, это не только абстракция, но и возможность конфигурации (например, autoconf). Как и другие абстракции, он допускает альтернативы . Но это прокладывает путь экспериментальной новой идеи альтернативы Makefile, легко доступной пользователям CMake.
Шува

Ответы:

30

Большая разница в том, что CMake - это кроссплатформенная система мета-сборки. Один проект CMake может создать обычный make-файл для Unix / Linux, проект Visual Studio для Windows, проект XCode для Mac и почти любую другую не-метаданную систему сборки, которую вы можете использовать или поддерживать.

Я бы не сказал, что использование make напрямую или даже ручное редактирование make-файлов «устарело», но это то, что вы, вероятно, не должны делать, если вы не работаете над Unix / Linux, который не нуждается в портировании на Windows, так же, как вы не следует редактировать файлы проекта Visual Studio напрямую, если вы когда-нибудь захотите перенести их в не-Windows. Если у вас есть интерес к переносимости, стоит изучить систему мета-сборки, такую ​​как Scons или CMake.

Ixrec
источник
9
POSIX makeтакже кроссплатформенный.
Blrfl
6
@Blrfl это может быть правдой, но обычно вы найдете командные строки, которые вам нужно использовать для компиляции и / или компоновки вашего проекта, зависят от платформы, даже если все платформы, на которые вы нацеливаетесь, соответствуют POSIX и даже если вы Вы используете один и тот же компилятор (все еще будут неприятные проблемы с расположением включаемых файлов, нужно ли вам -lm, -lnslи так далее, или же эти средства включены в библиотеку C и т. д.).
Жюль
5
@Jules Существует гораздо больше (или меньше) того CMake, что он в основном предназначен для создания стандартного модульного приложения для систем с загрузчиками ELF и предоставляет абстракции для всех инструментов, необходимых для этой конкретной цепочки инструментов. Если вы отойдете от этой цепочки инструментов (например, пользовательский скрипт компоновщика для «голого металла»), CMakeвдруг не предоставите никакой поддержки или переносимости, вы в конечном итоге будете его взламывать точно так же, как вы использовали для взлома полностью пользовательских сценариев сборки.
Ext3h
То же самое касается Q make (несмотря на то, что она плохо документирована, непоследовательно ведет себя ** ap CMake is), кстати;)
mlvljr
11

Это makeдействительно устарело?

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

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

С другой стороны, CMakeнепосредственно ориентирован на создание общих библиотек ELF и исполняемых файлов. Всякий раз, когда вы отказываетесь от этих предопределенных процедур, вы должны начинать взломать так CMakeже, как вы использовали для взлома свои собственные Makefiles.

Учитывая, что вы можете создать в C ++ гораздо больше, чем просто обычное приложение для системы, которая знает загрузчики ELF, CMakeконечно, не подходит для всех сценариев. Однако, если вы работаете в такой стандартизированной среде CMakeили любой другой из этих современных сред генератора сценариев, безусловно, ваши лучшие друзья.

Это всегда зависит от того, насколько специализировано ваше приложение и насколько хорошо структура CMakeфреймворка соответствует вашему рабочему процессу.

Ext3h
источник
Несмотря на свою полезность, make - ужасная система с мозговым мертвецом, загадочным синтаксисом и множеством ненужных ограничений, которые создают множество упс-моментов
antred
7

Когда-то языки высокого уровня были просто идеей. Люди пытались реализовать компиляторы. В то время существовали жесткие аппаратные ограничения - не было графических инструментов, поэтому в качестве формата входного файла использовался «простой текст»; на компьютерах обычно было очень мало оперативной памяти, поэтому исходный код приходилось разбивать на части, а компилятор разделялся на отдельные утилиты (препроцессор, компилятор, ассемблер, компоновщик); Процессоры были медленными и дорогими, поэтому вы не могли выполнять дорогостоящие оптимизации и т. Д.

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

К сожалению, сценарии были неуклюжими и грязными. Чтобы обойти проблемы со сценариями (которые обходили недостатки дизайна в инструментах, вызванные ограниченным аппаратным обеспечением), в конечном итоге люди изобрели утилиты, чтобы упростить задачу make.

Тем не мение; Makefiles неуклюжи и грязны. Чтобы обойти проблемы с make-файлами (которые были обходным путем для устранения недостатков проектирования в инструментах, вызванных ограниченным оборудованием), люди начали экспериментировать с автоматически генерируемыми make-файлами; начиная с таких вещей, как получение компилятором для генерации зависимостей; и приводит к таким инструментам, как auto-conf и cmake.

Вот где мы сейчас находимся: обходные пути для обходных путей для обходного пути для конструктивных недостатков инструментов, вызванных ограниченным аппаратным обеспечением.

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

Brendan
источник
1
Так какая альтернатива? Является ли альтернатива полностью меняющей концепцию сборок, какой мы ее знаем?
JParrilla
1
@Darkslash: Как только вы начинаете рассматривать (гипотетические) альтернативы, это похоже на открытие шлюзов - вы в конечном итоге подвергаете сомнению все (и в конечном итоге получаете идеи, такие как разделение семантики и синтаксиса, а также перепроектирование IDE, инструментов и доставки в виде набора, а не отдельных частей большая загадка). Более практичным является осознание того, что такие инструменты, как cmakeтолько лечение симптомов и не могут вылечить основную причину (ы); что облегчает принятие факта, что у вас нет другого выбора, кроме как использовать инструменты, которые, вероятно, никогда не будут близки к «идеальным».
Брендан
5
Makefiles ни в коем случае не «неловкий и грязный». Они невероятно элегантны: makeв основе их лежит движок для ациклического графа зависимостей. Ничто о «сценариях» или командной строке не является «архаичным».
Майлз Рут
1
@MilesRout: неловкая и грязная часть - построение графика. Обход достаточно элегантен. Но просто возьмем один наиболее распространенный пример этой грязной части: файлы заголовков C. Каждый #includeявляется ребром, но makeне может анализировать C-файлы. Все еще не проблема, потому что makeможет хранить эти ребра со следующим узлом (файл * .o), но это также не делает этого.
MSalters
3
Я не согласен, что лучший дизайн возможен. makeне только для компиляции C! Вы хотите программу, которая берет .cи .hфайлы и дает Makefileс. Но это не так make, и это не то, что makeнужно делать. Опять же, makeне все о C, а встроенное в C решение make- плохая идея (и, кстати, нарушение философии UNIX).
Майлз Рут
5

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

Конечно, вы также можете использовать его для более крупных проектов, в том числе для нескольких платформ. С помощью переменных, специфичных для целей, вы можете легко настроить способ сборки для разных платформ. В настоящее время дистрибутивы Linux поставляются с кросс-компиляцией наборов инструментов (например, mingw-w64 ), так что вы можете создать полный пакет программного обеспечения Windows (с программой установки, если вам нравится) из Linux, все из которых создаются из вашего Makefile.

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

IDE, такие как Qt Creator и Eclipse, также могут импортировать проекты на основе Makefile, чтобы вы могли делиться ими с разработчиками, использующими IDE. Я думаю, что Qt Creator IDE превосходна в качестве C ++ IDE, но, потратив некоторое время, чтобы стать более эффективным с Emacs, и, поскольку я больше занимаюсь разработкой Ada, я предпочитаю Emacs для всего. Чтобы вернуться к вопросу о том make, что как шаг после ссылки в моем Makefile, я обновляю свой файл TAGS (для навигации по символам в Emacs), загруженный M-x visit-tags-table:

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

Или для развития Ады:

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -
Патрик
источник
2

Этот ответ дополняет ответ @lxrec.

Makefiles можно использовать для многих целей, а не просто для создания программы / библиотеки из исходного кода. Системы сборки, такие как CMake или autotools, предназначены для получения кода и его сборки таким образом, чтобы он подходил для платформы пользователя (т.е. находил библиотеки или определял правильные параметры компиляции). Например, у вас может быть make-файл, который помогает автоматизировать некоторые задачи выпуска, такие как: создать zip-файл, содержащий код с версией, полученной из git; запускать тесты против вашего кода; загрузить указанный zip-файл на какой-либо хостинг. Некоторые системы сборки (например, automake) могут обеспечить простой способ сделать это, другие - нет.

Это не значит, что для этого вам нужно использовать make-файлы, вы можете использовать язык сценариев (shell, python и т. Д.) Для таких задач.

Джеймс Токнелл
источник
1

Я не думаю, что написанное человеком Makefileустарело, особенно когда:

  1. используя POSIX make, который дает вам портативный Makefile
  2. или используя GNU make 4, который дает вам много очень интересных функций, в частности, возможность написания сценариев GUILE, который позволяет эффективно кодировать необычные функции, предоставляемые Makefileгенераторами (я считаю, что функции автоинструментов или Cmake можно было бы легко написать с помощью настройки Guile в GNU make ). Конечно, цена, которую нужно заплатить, - это потребовать, чтобы GNU составлял 4 (не имеет большого значения, имхо).
Василий Старынкевич
источник
0

Make-файлы не являются устаревшими, так же как текстовые файлы не являются устаревшими. Хранение всех данных в виде простого текста не всегда является правильным способом выполнения действий, но если все, что вам нужно, это список Todo, то файл в виде простого текста подойдет. Для чего-то более сложного вам может потребоваться более сложный формат, такой как Markdown или XML, или пользовательский двоичный формат, или что-то среднее, но в простых случаях обычный текст работает нормально.

Точно так же, если все, что вам нужно, - это способ не писать g++ -g src/*.c -o blah -W -Wall -Werror && ./blahвсе время, рукописный Makefile идеален!

Если вы хотите создать что-то с высокой степенью переносимости, когда вам не нужно управлять этой переносимостью самостоятельно, вы, вероятно, захотите, чтобы что-то вроде Autotools сгенерировало подходящий Makefile для вас. Автоинструменты будут определять функции, поддерживаемые различными платформами. Программа, написанная на стандартном C89, построенная с помощью Autotools, будет компилироваться практически везде.

Майлз Рут
источник
«будет компилироваться практически везде» -> «будет компилироваться в самых последних Unix-подобных системах». Я не думаю, что autotoolsв какой-то степени работает в системе Windows, например (не считая Cygwin / MingW, которая действительно является Unix-подобной системой поверх Windows).
Слёске
Это не имеет ничего общего с тем, чтобы быть недавним. Преимущество autotools заключается в том, что он работает на любой удаленной POSIX-подобной системе. Windows в некоторой степени соответствует POSIX.
Майлз Рут
Да, я исправлен. На самом деле, я помню одну критику автоинструментов в том, что они содержат код даже для очень старых систем, так что поцарапайте «последние». Я все еще поддерживаю часть Windows, хотя.
слеске
И вина за это полностью лежит на Microsoft. Если бы они заботились о выпуске качественного продукта, то Windows имела бы надлежащую поддержку международных стандартов операционных систем (таких как POSIX). POSIX - это не просто «вещь Unix», это стандарт портативной операционной системы для всех операционных систем. Windows - просто несоответствующая груда барахла.
Майлз Рут
@MilesRout по-прежнему сводится к тому, что «практически везде» исключает 90% настольных компьютеров .
el.pescado
-2

если ваш проект прост и содержит очень мало файлов, то файл make не требуется.

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

Если вы хотите стереть старые файлы / compile / link / install с минимальным количеством хлопот и вероятностью ошибок нажатия клавиш, make-файл - это настоящее благо.

Когда вы попадаете в проекты «реального мира», редко бывает всего 1 или 2 файла, а скорее сотни файлов. make-файл всегда будет выполнять правильные действия, а не ненужные (после отладки), поэтому вы вводите только одну простую команду, а make-файл выполняет всю работу.

user3629249
источник
1
Это не ответ , почему предпочитают makeболее cmakeили наоборот.
Ext3h
Использование make-файлов не перестраивает все файлы каждый раз. (иначе CMake или Auto-tools не могли его использовать)
ideasman42