Які відмінності між Autotools, Cmake та Scons?


259

Які відмінності між Autotools, Cmake та Scons?


Цю тему вже обговорювали у вікі Scons . Я пропоную вам відвідати наступні посилання: 1. scons.org/wiki/SconsVsOtherBuildTools Ви відвідали дуже схожу тему для обговорення на форумі Ubuntu ?
бхадра

Ви можете перевірити цей pdf www-alt.gsi.de/documents/DOC-2007-Sep-17-1.pdf ; він має плюси і мінуси, а також деякі деталі щодо кожного інструменту.
Адам

Відповіді:


190

По правді кажучи, єдиним справжнім «благодатним порятунком» Autotools є те, що саме цим користуються всі проекти GNU.

Проблеми з Autotools:

  • По-справжньому синтаксис макросів ARCANE m4 поєднується з багатослівною, скриптованою скриптом оболонки для тестів на "сумісність" тощо.
  • Якщо ви не звертаючи уваги, ви будете заплуталися здатність крос-компіляції (Слід чітко зазначити , що Nokia придумав ScratchBox / Scratchbox2 на бічній крок сильно розбитою Autotools збірки установок для Maemo / Meego.) Якщо ви, з якої - небудь Тому, у ваших тестах є фіксовані статичні шляхи, ви збираєтеся порушити підтримку крос-компіляції, оскільки вона не буде вшановувати вашу специфікацію sysroot, і вона витягне речі з вашої хост-системи. Якщо ви порушите підтримку крос-компіляції, це робить ваш код непридатним для таких речей, як OpenEmbedded, і робить його "цікавим" для дистрибутивів, які намагаються створити свої релізи на крос-компіляторі, а не на цільовому.
  • Чи велика кількість тестувань на проблеми зі старовинними, зламаними компіляторами, якими NOBODY в даний час користується майже в будь-що виробництво в цей день і вік. Якщо ви не будуєте щось на кшталт glibc, libstdc ++ або GCC на справді стародавній версії Solaris, AIX тощо, тести - це марна трата часу і є джерелом для багатьох, багатьох потенційних зривів таких речей, як згадане вище.
  • Це досить болісний досвід отримати налаштування Autotools для створення корисного коду для системи Windows. (Хоча я мало використовую для Windows, це викликає серйозне занепокоєння, якщо ви розробляєте нібито код крос-платформи.)
  • Коли це зламається, ви збираєтесь проводити ГОДИНИ, переслідуючи свій хвіст, намагаючись розібратися в тому, що той, хто написав сценарій, помилився, щоб розібратися у вашій складанні (насправді, це я намагаюся зробити (або, вірніше, повністю вирвати автоінструменти - я сумніваюся, що в решті цього місяця є достатньо часу для того, щоб розібратися у безладді ...) для роботи зараз, коли я це набираю. Apache Thrift має одну з тих систем BROKEN зборки, які не перетинатимуться -компілювати.)
  • "Нормальні" користувачі насправді НЕ збираються просто робити "./configure; make" - для багатьох речей вони витягуватимуть пакет, наданий кимось, наприклад, з PPA або з їх розповсюдженням. "Звичайні" користувачі не є чортами і не захоплюють тарболи у багатьох випадках. Це снобізм з боку кожного за припущення, що саме там буде справа. Типовими користувачами тарболів є розробки, які роблять щось, тож вони зіб'ються з розбитістю, якщо вони є.

Це працює ... більшість часу ... це все, що можна сказати про Autotools. Це система, яка вирішує декілька проблем, які дійсно стосуються проекту GNU ... для їх базового, основного коду ланцюга інструментів. (Edit (05/24/2014): Слід зазначити , що цей типом занепокоєння є потенційно BAD речі , щоб турбуватися о- Heartbleed частково випливає з цього мислення і з правильними, сучасними системами, ви на самому справіне має жодного бізнесу, що займається великою частиною того, що виправляє Autotools. GNU, ймовірно, потрібно зробити чітке видалення кодової бази, зважаючи на те, що трапилося з Heartbleed) Ви можете використовувати його для того, щоб зробити свій проект, і це може добре працювати для невеликого проекту, який ви не очікуєте працювати ніде, крім Linux або де явно правильно працює ланцюжок інструментів GNU. Заява про те, що він «добре інтегрується з Linux», є досить сміливим твердженням і досить невірним . Він досить інтегрується з набором інструментів GNU і вирішує проблеми, які мають ІТ з поставленими цілями.

Це не означає, що з іншими варіантами, обговореними в потоці, тут немає проблем.

SCons - це більше заміна для Make / GMake / тощо. і виглядає досить приємно, усі речі враховуються ...

  • Це все ще більше лише інструмент POSIX. Ви, напевно, могли б легше отримати MinGW, щоб створити Windows для цього, ніж за допомогою Autotools, але це все-таки більш орієнтовано на те, щоб робити речі POSIX, і для його використання вам знадобиться встановити Python та SCons.
  • У нього є проблеми з перехресною компіляцією, якщо ви не використовуєте щось на зразок Scratchbox2.
  • Справді, повільніше і менш стабільно, ніж CMake з їх власного порівняння. Вони придумують напівсердечні (для POSIX-сторони потрібно зробити / gmake для побудови ...) негативів для CMake порівняно з SCons. (Вбік, якщо вам потрібна ЧАС велика розширюваність щодо інших рішень, ви повинні запитати себе, чи ваш проект занадто складний ...)

Приклади, наведені для CMake у цій темі, є дещо хибними.

Однак ...

  • Вам потрібно буде вивчити нову мову.
  • Існують контрінтуїтивні речі, якщо ви звикли робити Make, SCons або Autotools.
  • Вам потрібно буде встановити CMake в системі, для якої ви будуєте.
  • Вам знадобиться надійний компілятор C ++, якщо для нього немає попередньо вбудованих бінарних файлів.

По правді кажучи, ваші цілі повинні диктувати те, що ви обираєте тут.

  • Чи потрібно вам мати справу з Л ламаних компілюють інструменти , щоб зробити дійсний робочий бінарник? Якщо так, ви можете розглянути питання про Autotools, знаючи про недоліки, про які я згадував вище. CMake може впоратися з цим багато, але це турбується менше, ніж робить Autotools. Школи можна розширити, щоб потурбуватися про це, але це не відповідь нестандартної.
  • Чи потрібно турбуватися про цілі Windows? Якщо так, Autotools має бути буквально не працює. Якщо так, то SCON може / не може бути хорошим вибором. Якщо так, CMake - це грунтовний вибір.
  • Чи потрібно турбуватися про перехресну компіляцію (універсальні додатки / бібліотеки, такі як Google Protobufs, Apache Thrift і т. Д. ПОТРІБНО дбати про це ...)? Якщо так, то Autotools може бутипрацюють для вас до тих пір, поки вам не потрібно турбуватися про Windows, але ви збираєтеся витратити багато часу на підтримку своєї конфігураційної системи, коли на вас все зміниться. На даний момент SCons майже не працює, якщо ви не використовуєте Scratchbox2 - він дійсно не має ручки для перехресної компіляції, і вам потрібно буде використовувати цю розширюваність і підтримувати її так само, як і ви будете з Automake. Якщо це так, ви можете розглянути CMake, оскільки він підтримує перехресну компіляцію без особливих турбот про витікання з пісочниці і буде працювати з / без чогось на зразок Scratchbox2 і добре інтегрується з такими речами, як OpenEmbedded.

Причин багато, багато проектів роблять qmake, Autotools тощо та переходять на CMake. Поки я можу очікувати, що проект на базі CMake або потрапить у ситуацію перехресного компіляції, або в налаштування VisualStudio, або потрібна лише невелика кількість очищення, оскільки проект не враховував лише частини Windows та OSX. до кодової бази. Я не можу чекати , що з в SCons основі project- , і я очікую , 1/3 - й або більш Autotools проекти отримали ТО неправильно , що не дозволяє це будівля прямо на будь-якому контексті , крім господаря будівлі одного або Scratchbox2 один.


12
Розділ, в якому згадується Heartbleed, зменшує цю розчаровану зухвалість Проблема полягала в тому, що OpenSSL НЕ використовував пакет типу конфігуратора для виявлення зламаних malloc, але повторну реалізацію системних бібліотек та перемогу розробників платформи, які виробляли бібліотеки, які б виявили вади набагато раніше. Однією з причин портових програм є те, що вони стають більш якісними, оскільки вони менш залежать від тих маленьких припущень, про які ви не розумієте, що ви робите
Rob11311

9
Річ у тім, що це зовсім не шкодить цьому. За допомогою Autotools ви турбуєтесь про компенсацію таких речей - це повторна реалізація - це РОЗШИРЕННЯ саме цього мислення. Переведення його на наступний рівень як би. Ви повинні бачити, що з цього тла ... в який момент це зовсім не заважає. Ви не вказали першопричини в своїх міркуваннях - просто те, що сталося. Я маю на увазі саме ТУМНЕ, що привело його до цього разом із Shellshock та кількома іншими людьми. Якщо він зламаний, слід виправити його. Якщо ви не можете - ви повинні запитати, чому так тривати.
Швартальф

5
Я не сумніваюся, що автоінструменти та скани смокчуть, але ця відповідь робить погану роботу, відзначаючи мінуси CMake (моя краща система збирання, лише через дуже, дуже сумний стан систем збирання). В основному, CMake - це фрактал невідповідності з вбудованою підтримкою для окремих крайових випадків, а не якась основна абстракція, яка обробляє більшість речей. Це, безумовно, клейка стрічка та провід програмування. Я впевнений, що роблю щось не так, але він не підтримує VisualStudio, якщо ви не знайдете проект VS на CMakeLists.txt прийнятним (я не користувач VS, але мої Winfriends кажуть, що це погано).
weberc2

5
На відміну від інших ненависних засобів програмування , не вистачає матеріалу, щоб зробити книгу під назвою "CMake, хороші частини" (можливо, памфлет чи допис у блозі), і це більше фрактал поганого дизайну, ніж PHP .
weberc2

2
@JAB Мені сказали користувачі VS, що це не ідіоматично. Насправді CMake був замінений як система збірки для нашого проекту, оскільки ніхто не міг розібратися, як створити згадані "ідіоматичні" файли VS Project.
weberc2

73

Слід зробити важливе розмежування між тим, хто використовує інструменти. Cmake - це інструмент, який користувач повинен використовувати при складанні програмного забезпечення. Автоінструменти використовуються для генерування тарболу дистрибутива, який можна використовувати для складання програмного забезпечення, використовуючи лише стандартні інструменти, доступні в будь-якій сумісній системі SuS. Іншими словами, якщо ви встановлюєте програмне забезпечення з тарболу, який був побудований за допомогою автоінструментів, ви не використовуєте автоінструменти . З іншого боку, якщо ви встановлюєте програмне забезпечення , яке використовує CMake, то будуть з допомогою CMake і повинна встановити його для створення програмного забезпечення.

Переважній більшості користувачів не потрібно встановлювати автоматичні інструменти на свій ящик. Історично багато плутанини було спричинене тим, що багато розробників поширюють неправильно сформовані тарболи, які змушують користувача запускати autoconf для відновлення сценарію налаштування, і це помилка упаковки. Більшу плутанину викликало те, що більшість основних дистрибутивів Linux встановлюють кілька версій автоінструментів, коли вони не повинні встановлювати жодну з них за замовчуванням. Ще більше плутанини викликають розробники, які намагаються використовувати систему управління версіями (наприклад, cvs, git, svn) для розповсюдження свого програмного забезпечення, а не для створення тарболів.


5
Щоправда, хоч ви і здаєтеся, що погано використовувати VCS для розповсюдження програмного забезпечення. Якщо вміст каси або клона збігається з вмістом тарболу, чому б ви рекомендували тарболи?
d -_- b

5
@Тоор, я не розумію вашого запитання. Усі проекти, над якими я працюю, складають тарбол, який відрізняється від каси VCS. Збереження двох відмінностей допомагає надійному розподілу.
Вільям Перселл

13
Це правда, що багато проектів просять людей використовувати VCS, щоб отримати останню версію, але це підходить лише розробникам. На жаль, багатьом користувачам не вдається зрозуміти відмінність випуску тарболу від VCS. Спроба побудувати з VCS накладає більше залежностей. Користувачеві може знадобитися asciidocабо, help2manабо, doxygenабо, що важливо, правильна комбінація автоматичного інструменту. Це було величезною маркетинговою проблемою для автоінструментів. Користувачі помилково вважають, що їм потрібно встановити autoconf, оскільки вони не розуміють різниці між тарболом та VCS.
Вільям Перселл

3
Чому проект не може розповсюджувати результати Cmake, файли проектів та Makefiles для загальних платформ, наприклад) Win, Linux та MacOSX? Здається, така ж ситуація, як і з інструментами lex / yacc, ви включаєте генерований код C, щоб його можна було побудувати на платформах без інструментів
Rob11311,

3
Хоча я вважаю, що пункти, згадані в цій дискусії, є правильними, я вважаю, що в цій дискусії немає сенсу. Користувачеві потрібно встановити цілу купу інших речей і те, чи не потребує він додаткової потреби встановити cmake, не повинно бути великою проблемою. Я б більше хвилювався про бібліотеки, ланцюжок інструментів компілятора та інші інструменти, необхідні для створення програмного забезпечення.
lanoxx

24

Мова не йде про стандарти кодування GNU.

Поточні переваги автоінструментів, особливо при автоматичному використанні, - це те, що вони дуже добре інтегруються в побудову дистрибутива Linux.

Наприклад, cmake, це завжди, "мені це було потрібне -DCMAKE_CFLAGS або -DCMAKE_C_FLAGS?" Ні, це ні, це "-DCMAKE_C_FLAGS_RELEASE". Або -DCMAKE_C_FLAGS_DEBUG. Це заплутано - в autoconf це просто ./configure CFLAGS = "- O0 -ggdb3" і у вас це є.

В інтеграції з інфраструктурою побудови, у scns виникає проблема, яку ви не можете використовувати make %{?_smp_mflags}, _smp_mflagsу цьому випадку це макрос RPM, який приблизно розширюється до (системний адміністратор може встановити це). Люди розміщують такі речі, як -jNCPUS, через своє оточення. Якщо це не працює, то пакунки, що використовують scons, можуть мати серійний вбудований лише в дистрибутиві.


8
+1, і світ був би кращим місцем, якби це було правдою. На жаль, ./configure CFLAGS=-O0часто виходить з ладу пакунки, які перезаписують CFLAGS у makefile і вимагають замість цього користувача ./configure --enable-debug. (наприклад tmux).
Вільям Перселл

2
Це не більш заплутано, ніж Autotools, і як справедливо зазначає Вільям, він потрапляє до біса з неправильно обрамленим CFLAGS = "<foo>" в makefile. Досить просто це ще один із тих предметів "старої пилки". І приклади CMake є хибними ... знову ж таки ... Ви можете зробити перший, якщо не вказали RELEASE або DEBUG. НЕПРАВНО.
Швартальф

17

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


11
Стандарти GNU можна відключити в програмі Automake за допомогою AUTOMAKE_OPTIONS = -foreignвашого Makefile.am. (Або -foreignпо-вашому autogen.sh. Я думаю, що майже всі користуються цим.)
Дітріх Епп

9
Так, але це лише визначає, чи Automake виконує поверхневі правила GNU, наприклад, чи потрібен файл README. Це не змінює основні умови побудови тарболу в стилі GNU з такими правилами, як installcheckі distclean. Якщо ви намагаєтесь змінити таку поведінку, використовуючи Autotools, ви просто витрачаєте свій час.
ptomato

1
Вони (теоретично) дозволяють будувати та встановлювати всі програмні пакети точно однаково.
птомато

Вони, теоретично, дозволяють працювати з компіляторами BROKEN і ОС більш доцільно, ніж з іншими інструментами, і застосовувати поверхневі правила, такі як @ptomato, виділені там. Якщо ви використовуєте сучасні (скажімо , GCC або брязкіт ... для прикладів) інструменту на сучасній операційній системі ні з чим на самому ділі Гум, скажімо , Linux або поточним * BSD, ви не ПОТРІБНІ «правил» там. Насправді вони роблять багато, набагато більше роботи для вас і не можуть допомогти, чесно, для перехресної компіляції. Майже половина всіх звичаїв у ці дні призначені для вбудованого Linux та * BSD. ЧОМУ ти йдеш із речами, які не можуть тобі там допомогти?
Швартальф

Не впевнений, чому ви спростували відповідь, оскільки ви, схоже, визнаєте її у своєму коментарі ...?
птомато

9

Хоча з точки зору розробників, cmake в даний час найбільш простий у використанні, з точки зору користувача автоінструменти мають одну велику перевагу

autotools генерують єдиний скрипт налаштування файлу, а всі файли для його створення поставляються разом з дистрибутивом. це легко зрозуміти і виправити за допомогою grep / sed / awk / vi. Порівняйте це з Cmake, де у файлах / usr / share / cmak * / / знайдено багато файлів, які користувач не може виправити, якщо у нього немає доступу адміністратора.

Отже, якщо щось не зовсім працює, його зазвичай можна легко "виправити", використовуючи інструменти Standard Unix (grep / sed / awk / vi тощо) кувалдою без необхідності розуміти систему складання.

Ви коли-небудь копалися через каталог cmake build, щоб з’ясувати, що не так? Порівнюючи з простими оболонками, які можна читати зверху вниз, слідуючи за створеними файлами Cmake, з’ясувати, що відбувається, досить складно. Крім того, за допомогою CMake для адаптації файлів FindFoo.cmake потрібні не тільки знання мови CMake, але й можуть знадобитися привілеї суперпользователя.


7
Я не думаю, що проблеми з Autotools "легко виправляються" порівняно з CMake ...
sleske

7
Тому що autotools - це складна система (як і CMake). Якщо ви вважаєте, що автоінструменти "легко виправлені" (можуть бути причиною для цього думати), було б добре IMHO пояснити у відповідь, яким чином проблеми легше виправити.
sleske

5
autotools генерують єдиний скрипт налаштування файлу, а всі файли для його створення поставляються разом з дистрибутивом. це легко зрозуміти і виправити за допомогою grep / sed / awk / vi. Порівняйте це з Cmake, де у файлах / usr / share / cmak * / / знайдено багато файлів, які користувач не може виправити, якщо у нього немає доступу адміністратора. Ви коли-небудь копалися через каталог cmake build, щоб з’ясувати, що не так? Порівняно з простим оболонками, які можна читати зверху вниз, слідуючи за створеними файлами Cmake, з’ясувати, що відбувається, досить складно
архів

2
Так, спасибі. Я взяв на себе сміливість додати це до вашої відповіді. Сміливо повертайтеся :-).
sleske

1
Ви завжди можете використовувати власну локальну версію cmake; немає жодної причини використовувати те, що встановлено на системному рівні. Для тих, хто виконує роботу між платформами, це абсолютно нормально; це звичайно те, як я використовую cmake більшу частину часу.
Джеймс Мур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.