Чи безпосередньо використання Марк вважається застарілим? [зачинено]


31

Тому я стикався з багатьма коментарями / публікаціями / тощо, що стосуються створення файлів безпосередньо, і як це нерозумно робити в 2015 році. Я знаю такі інструменти, як CMake, і я фактично використовую CMake досить часто. Вся справа в тому, що CMake просто створює Makefile для вас і допомагає зняти нудьгу, як це зробити самостійно. Звичайно, він додає багато інших чудових функцій ... але це все-таки Makefile врешті-решт.

Отже, моє запитання - це "застаріла" розмова про те, щоб зробити посилання на всю утиліту Make, або просто ідея вручну написати власні Makefiles? Я взагалі не використовую IDE для розробки C / C ++ (лише emacs), тому я завжди писав Makefiles.

Якщо Make вважається застарілим, що C / C ++ розробник повинен використовувати для створення невеликих особистих проектів?


8
Для невеликих особистих проектів достатньо makeбез Makefile. Що за клопоти?
ott--

8
Кожен фрагмент доступного програмного забезпечення на моїх системах FreeBSD, як настільних, так і серверів, має Makefile, який починається з 'make'. Ні. "Зробити" не застаріло.
Роб

3
Люди вільні у використанні IDE, але якщо їхні IDE не можуть підтримувати проекти, які використовують Makefiles майже 40 років після того, як makeбуло вперше написано, тоді вони не повинні сподіватися, що люди обійдуться цим.
Майлз Рут

1
«Застарілі розмови про роблять» це просто симптом або точка болю , а не проголошення старіння. Особливо, коли вищої тотальної заміни ще не існує, і всі підходи до зменшення болю все ще використовуються певним чином, просто прихованими від користувачів, найбільш схильних до болю. Хоча було дано багато хороших відповідей, саме питання є прикордонною думкою.
rwong

1
CMakeявляє собою шар абстракції. Ця абстракція потрібна для приборкання дикої різноманітності споживчих продуктів IDE, які не відповідають відкритим кодам Makefile. Знову ж таки це не лише абстракція, але й дозволяє конфігурувати (наприклад, autoconf) функції. Як і інші абстракції, вона дозволяє альтернативи . Але це прокладає шлях експериментальної нової ідеї альтернатив Makefile, легко доступних для користувачів CMake.
shuva

Відповіді:


30

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

Я б не сказав, що використання прямого або навіть вручну редагування файлів "застаріло", але це речі, які ви, мабуть, не повинні робити, якщо ви не працюєте на Unix / Linux, які не потребують перенесення до Windows, як, наприклад, не слід редагувати файли проектів Visual Studio безпосередньо, якщо ви хочете будь-коли перенести їх у не-Windows. Якщо у вас є інтерес до портативності, варто вивчити систему мета-побудови на зразок Scons або CMake.


9
POSIX makeтакож є кросплатформним.
Blrfl

6
@Blrfl це може бути правдою, але зазвичай ви знайдете командні рядки, які потрібно використовувати для компіляції та / або посилання вашого проекту, залежно від платформи, навіть якщо всі платформи, на які ви орієнтуєтесь, сумісні з POSIX і навіть якщо ви «використовує один і той же компілятор все (там ще будуть прикрі проблеми з розташуванням включення файл, чи потрібно -lm, -lnslі так далі , або ці об'єкти включені в бібліотеці C, і т.д.).
Жуль

5
@Jules Існує набагато більше (або менше) CMake, це в основному пристосовано до створення вашого стандартного модульного додатку для систем з навантажувачами ELF і надає абстракції для всіх інструментів, необхідних для цього певного ланцюга інструментів. Якщо ви відходите від цієї ланцюжка інструментів (наприклад, спеціальний скрипт посилання для голого металу), CMakeраптом взагалі не надається ніякої підтримки або портативності, ви, в кінцевому підсумку, зламаєте її так, як ви звикли зламати повністю власні сценарії побудови.
Ext3h

Те саме стосується Q make (не дивлячись на те, що погано задокументовано непослідовно поводиться ** ap CMake є), btw;)
mlvljr

11

Невже makeзастаріла?

Я не думаю, що так. Зрештою, make є все ще досить потужним, щоб забезпечити всі необхідні функціональні можливості, як умовна компіляція зміненого джерела тощо. Скажімо, що makeзастаріло, це було б те саме, що говорити про те, що написання спеціальних сценаріїв посилання було застарілим

Але те, makeщо не надає сировини , - це розширені функціональні можливості та фондові бібліотеки для комфорту, такі як генерація параметричних заголовків, інтегрована рамка тестування або навіть просто умовні бібліотеки загалом.

З іншого боку, CMakeвін безпосередньо налаштований на створення загальних бібліотек і виконуваних файлів ELF. Щоразу, коли ви відходите від них заздалегідь визначених процедур, вам потрібно починати злом так CMakeсамо, як ви звикли зламати власні Makefiles.

Зважаючи на те, що ви можете створити набагато більше в C ++, ніж просто середнє додаток для системи, яка знає навантажувачі ELF, CMakeнапевно, не підходить для всіх сценаріїв. Однак якщо ви працюєте в такому стандартизованому середовищі CMakeабо будь-який інший із цих сучасних систем генератора скриптів, безумовно, є вашими найкращими друзями.

Це завжди залежить від того, наскільки спеціалізована ваша програма, і наскільки структура CMakeструктури відповідає вашому робочому потоку.


Хоча корисно, зробити це жахливою системою з мозковим загибеллю, прихованим синтаксисом і безліччю зайвих обмежень, які створюють багато моментів.
antred

7

Колись мови високого рівня були просто ідеєю. Люди намагалися реалізувати компілятори. Тоді були жорсткі обмеження на обладнання - не було графічних інструментів, тому "звичайний текст" в кінцевому підсумку використовувався для формату вхідного файлу; комп'ютери зазвичай мали надзвичайно невелику кількість оперативної пам’яті, тому вихідний код потрібно було розбити на частини, і компілятор розділився на окремі утиліти (попередній процесор, компілятор, асемблер, лінкер); Процесори були повільними і дорогими, тому ви не могли робити дорогих оптимізацій тощо.

Звичайно, якщо багато вихідних файлів і багато утиліт використовуються для створення багатьох об’єктних файлів, безладно будувати що-небудь вручну. У результаті вирішення проблем із дизайном інструментів (спричинених сильно обмеженим обладнанням) люди, природно, почали писати сценарії, щоб усунути деякі проблеми.

На жаль, сценарії були незручними і безладними. Щоб вирішити проблеми зі сценаріями (які були проблемою для недоліків дизайну в інструментах, спричинених обмеженим обладнанням), врешті-решт люди винайшли утиліти, щоб полегшити справи make.

Однак; makefiles незручні та безладні. Щоб вирішити проблеми з makefiles (які були проблемою для вирішення проблем із-за вад дизайну в інструментах, спричинених обмеженим обладнанням), люди почали експериментувати з автоматично створеними makefiles; починаючи з таких речей, як отримання компілятора для генерування залежностей; і переходить до таких інструментів, як автоконфігурація та cmake.

Ось, де ми зараз знаходимося: work-arounds for a work-arounds for a абыймати для недоліків дизайну в інструментах, спричинених обмеженим обладнанням.

Я сподіваюсь, що до кінця століття на вершині наявної купи з’явиться ще кілька шарів "робочої зони для роботи". За іронією долі, суворі обмеження обладнання, що спричинили все це, зникли багато десятиліть тому, і єдина причина, по якій ми все ще використовуємо такий архаїчний безлад, - це так, як це робиться завжди .


1
То що альтернатива? Чи альтернатива повністю змінює концепцію побудови, як ми її знаємо?
JParrilla

1
@Darkslash: Після того, як ви почнете розглядати (гіпотетичні) альтернативи, це як відкриття шлюзів - ви все-таки ставите під сумнів усе (і в кінцевому підсумку висуваєте ідеї, як розділення семантики та синтаксису, і перепроектування IDE та інструментів та доставку як набір, а не окремі фрагменти більша головоломка). Більш практичним є усвідомлення того, що такі засоби, як cmakeлише лікування симптомів, не вдається вилікувати першопричину; що полегшує прийняття факту, що у вас немає іншого вибору, крім використання інструментів, які, ймовірно, ніколи не будуть близькими до "ідеального".
Брендан

5
Makefiles ні в якому разі не "незручні і безладні". Вони неймовірно елегантні: makeв основі є двигуном для переходу ациклічного графіка залежності. Нічого про "скрипти" чи командний рядок не є "архаїчним".
Майлз Рут

1
@MilesRout: Незручна і безладна частина - це побудова графіка. Обхід досить елегантний. Але просто візьміть єдиний найпоширеніший приклад безладної частини: файли заголовків C. Кожен #includeє краєм, але makeне може аналізувати файли C. Все ще не проблема, тому що вони makeможуть зберігати ці краї разом із наступним вузлом (файлом * .o), але і це не робить.
MSalters

3
Я не згоден, що кращий дизайн можливий. makeне тільки для складання C! Ви хочете програму, яка приймає .cі .hфайли, і видає Makefiles. Але це не так 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, розроблені для того, щоб приймати код, і будувати його таким чином, щоб вписатися в платформу користувача (тобто знайти бібліотеки або вказати правильні параметри компіляції). Наприклад, ви можете мати файл makefile, який допомагає автоматизувати деякі завдання випуску, такі як: побудувати zip-файл, що містить код з версією, отриманою з git; запустити тести на свій код; завантажте вказаний zip-файл на якусь службу хостингу. Деякі системи побудови (такі як автоматизація) можуть забезпечити простий спосіб зробити це, інші - не.

Це не означає, що для цього вам потрібно використовувати файли, ви можете використовувати мову сценаріїв (оболонку, пітон тощо) для таких завдань.


1

Я не думаю, що письмові Makefileзаписи людей застаріли, особливо коли:

  1. за допомогою POSIX make, яка дає вам портативний Makefile
  2. або за допомогою GNU make 4, що дає вам багато дуже цікавих функцій, зокрема сценарій GUILE, який дозволяє ефективно кодувати фантазійні функції, що надаються Makefileгенераторами (я вважаю, що функції автоінструментів або Cmake можна було легко записати за допомогою Guile customisation GNU make ). Звичайно, ціна, яку потрібно платити, - вимагати, щоб GNU склала 4 (не велика справа, ІМХО).

0

Makefiles не застаріли так само, як текстові файли не застаріли. Збереження всіх даних у простому тексті не завжди є правильним способом вчинити, але якщо все, що вам потрібно, це список списків 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).
sleske

Це не має нічого спільного з останнім часом. Перевага автоінструментів полягає в тому, що він працює в кожній віддаленій POSIX-системі. Windows дещо сумісний з POSIX.
Майлз Рут

Так, я виправлений. Насправді, я пам’ятаю, одна критика автоінструментів полягає саме в тому, що він містить код навіть для дуже старих систем, тому подряпайте «останні». Я все ще стояв біля частини Windows.
sleske

І вину за це повністю лежить на Microsoft. Якщо б вони дбали про створення якісного продукту, тоді Windows матиме належну підтримку міжнародних стандартів операційних систем (наприклад, POSIX). POSIX - це не просто "річ Unix", це стандарт портативної операційної системи для всіх операційних систем. Windows - це лише невідповідна купа сміття.
Майлз Рут

@MilesRout все ще полягає в тому, що "практично скрізь" виключає 90% настільних комп'ютерів .
el.pescado

-2

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

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

Якщо ви хочете стерти старі файли / компілювати / посилати / встановити з мінімальною кількістю клопоту та ймовірності помилок при натисканні клавіш, makefile - справжня користь.

Коли ви потрапляєте в "реальний світ", проекти рідко коли-небудь складають лише 1 або 2 файли, а швидше сотні файлів. makefile завжди буде виконувати правильні дії і не зайві дії (після його налагодження), тому ви вводите лише одну просту команду, і makefile виконує всю роботу


1
Це не відповіло, чому віддавати перевагу makeнад cmakeчи навпаки.
Ext3h

Використання makefiles не відновлює всі файли кожного разу. (інакше CMake або Auto-tools не змогли ним скористатися)
Ideman42
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.