C ++ Build Systems - Що використовувати? [зачинено]


136

Я дивлюся на запуск нового проекту в C ++ - спочатку просто в свій час - і досліджую наявні системи збирання. Здавалося б, відповідь "Багато, і всі вони жахливі".

Особливості, які мені спеціально потрібні для цього:

  1. Підтримка C ++ 11
  2. Крос-платформа (Linux як головна ціль, але здатна також будуватись як мінімум на Windows)
  3. Підтримка тестування одиниці підтримки
  4. Підтримка декількох модулів для відділення коду
  5. Підтримка генерації коду (Використання asn1c або protobuf - ще не на 100% впевнені)
  6. Легкий в обслуговуванні

Тепер я знаю, що можу зробити 1-4 тих, хто використовує CMake та Autotools досить легко. Напевно, також із SCons та Waf та парою інших. Проблема полягає в тому, що я ніколи не розробляв, як правильно робити генерацію коду, використовуючи їх - тобто вихідні файли, які не існують до першого запуску процесу збирання, тому вихідні файли, які система збирання повинна бути в змозі перетворити на виконуваний код але насправді не знаю про це, поки не розпочнеться збірка ... (зокрема, ASN1C генерує десятки файлів заголовків та вихідних файлів, які повинні вміти працювати разом, а власне набір файлів генерується залежить від вмісту вашого файлу asn) також той факт, що жодне з них не дуже просте в обслуговуванні - CMake та Autotools мають свій величезний набір сценаріїв, якими вам потрібно керувати, щоб вони працювали,

Отже - які системи побудови рекомендуються для чогось подібного? Або я поки що застряг у файлах і скриптах оболонки?


11
"Здавалося б, відповідь" Багато, і всі вони жахливі "" теж моє враження (з додаванням "жахливого з моєї точки зору"; мені не подобається занадто сильно узагальнювати такі терміни, як ці ). Я насправді створив свою власну саме цю причину, і це вийшло краще, ніж очікувалося, оскільки це робить те, що я хочу, і як я завжди хотів, щоб справи працювали. Для чогось, що займає трохи менше часу, вам, ймовірно, доведеться пройти існуючі інструменти і вибрати той, який доставить менше головних болів, ніж інші.
Крістіан Стібер

4
Спробуйте tup .
Керрек СБ

Дивись також: stackoverflow.com/q/3349956
ergosys

8
Яку підтримку C ++ 11 ви очікуєте від системи складання? Це щось, що ви отримуєте від компілятора, система збирання не розбирає і не читає фактичні вихідні файли, а просто передає їх тому, кому вони потрібні, ні?
Барух

5
Правда, але полегшити можливість сказати компілятору використовувати підтримку C ++ 11. g ++ потрібен один прапор, клацніть інший набір, msvc, мабуть, не потребує жодного тощо. Також підтримка виявлення наявних функцій c ++ 11 була б корисною, оскільки це також відрізняється між компіляторами ...
Грем

Відповіді:


117

+1 для: "Багато, і вони жахливо".

Але, "найбагатший" і "найбільш масштабований" - це, мабуть, CMake , який є генератором Makefile (також генерує рідний MSVC ++ *.proj/ *.sln). Дивний синтаксис, але як тільки ви засвоїте це, він може дозволити вам чудово генерувати збірки для різних платформ. Якби я "почав-свіжий", напевно, скористався CMake. Він повинен обробляти ваш список, хоча ваше "генерування коду" може зайняти "життя-своє-власне" поза системою збірки залежно від того, що ви хочете зробити. (Дивись нижче.)

Для простих проектів генератор QMake нормальний (для використання QMake вам не потрібно використовувати бібліотеки Qt). Але ви не описуєте "просте" - генерування коду та "додаткові фази" означає, що ви, мабуть, хочете CMakeабо щось із багатим API для власних розширень, як-от Scons(або Waf).

Ми використовуємо Scons на роботі. Він виробляє "куленепробивні", але це дуже повільно. Жодна інша система не буде такою, яка захищена від куль Scons. Але, це повільно. Він написаний на Python, і ми розширили інтерфейс для нашої "організації робочого простору" (де ми просто вказуємо залежність модулів), і це є частиною Sconsнаміру дизайну (цей тип розширення через Python). Зручно, але нарощування відбувається повільно. Ви отримуєте куленепробивні збірки (будь-яка скринька розробника може зробити остаточний реліз), але це повільно. І, це повільно. Не забувайте, що якщо ви користуєтесь Scons, то це повільно. І, це повільно.

Мені стає погано думати, що через десятиліття після 2000 року у нас все ще немає літаючих машин. Напевно, нам доведеться почекати ще сто років або щось, щоб їх отримати. І, тоді ми всі, мабуть, будемо літати в наших літаючих машинах, які все ще будуються з дурними системами побудови.

Так, всі вони жахливі.

[ПРО КОРІВЛЕННЯ КОДУ]

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

Якщо це просто "попередня обробка деяких файлів та генерування вихідних файлів", то немає великого (у вас є багато варіантів, і ось чому qmakeбуло написано - для mocпопередньої обробки *.hpp/*.cppфайлів).

Однак, якщо ви робите це "важко", вам потрібно буде написати власний сценарій. Наприклад, у нас були сценарії "складової частини", які запитували бази даних та генерували класи C ++ для інтерфейсу між "шарами" (у традиційній трирівневій розробці додатків). Аналогічно, ми генерували вихідний код сервера / клієнта через IDL та вбудовували інформацію про версію, щоб дозволити декільком клієнтам / серверам одночасно працювати з різними версіями (для одного і того ж «клієнта» або «сервера»). Багато створеного вихідного коду. Ми можемо "зробити вигляд", що це "система-build-система", але насправді це нетривіальна інфраструктура для "управління конфігурацією", частиною якої є "build-система". Наприклад, ця система повинна була "знімати" та "


37
Мені також подобаються Сконс ​​- але я думаю, що це повільно.
Лотар

1
Ви можете отримати CMake для обробки генерації коду за допомогою оболонки Makefile, щоб зробити необов'язковий другий етап, коли код генерується. Мені вдалося підтримати повне відстеження залежностей, ранній вихід після створення коду, щоб викликати повторне створення файлу тощо. Див.: Javaglue.com/javaglue.html#tag:JavaGlue та code.google.com/p/javaglue
sdw

3
Майже через 2 роки ти все ще вважаєш SCON повільним? Коли я вибирав систему складання, я натрапив на це, і це сприяло моєму рішенню працювати з SCons.
JBentley

2
@Ben, це правда, але також це повільно.
Чарлі

2
Кожен, хто дивиться на це, повинен розглянути Месон (який використовує ніндзя).
Меттью Д. Скоулфілд

33

Ви можете використовувати Gradle зараз: https://docs.gradle.org/current/userguide/native_software.html

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


Я погодився б з Градле. Gradle розроблений таким чином, щоб бути масштабованим. Однак це залежить від того, наскільки швидкою є реалізація плагіна. Також є кілька накладних витрат для самого градла. Також майте на увазі, що деякі плагіни, можливо, потрібно налаштувати для ваших випадків використання.
JE42

Цікаво побачити зацікавленість gradle у підтримці C ++. Сподіваємось, вони створюють приємну та міцну систему будівництва для проектів c ++, яких нам усім бракує.
hbobenicio

@squid дякую, оновлено.
Нейт Гленн

1
Gradle потужний, але простий. Немає дивного синтаксису, одного файлу gradle.build часто досить, щоб створити весь проект з декількома виконаними результатами (основні, тести тощо). Немає завантаження файлів у всі джерела. Супер дружній для версій.
Overdrivr

1
Я провів останні два дні в битві з Градле, просто намагаючись створити бібліотеку, додаток та gtests "привіт світ", і не можу сказати, що можу рекомендувати це для нового проекту. Інструменти можуть бути всі, але документація ні (це дає користь сумніву). Може, ті з вас, хто вважає це життєздатним, можуть вказати на ваші улюблені ресурси?
jwm

16

Я знайшов це, я ще не використовував їх усіх:

Ninja , невелика система побудови, орієнтована на швидкість. Google тепер використовує ніндзя , щоб побудувати Android замість Марка: посилання .

Shake , потужна і швидка система збору.

Tup , система високої продуктивності збірки. Алгоритмічна конструкція. Аналіз Тупа .

Зараз всі кросплатформні та підтримують Windows. Я ще не впевнений у решті ваших вимог, оскільки, знову ж таки, я ще сам їх перевіряв. Вони використовуються в комерційній розробці, CIG підхопив Ninja. Я використовував і люблю легкість і швидкість Ninja за допомогою генератора проектів. Перші два схожі на шотландців, мурашок тощо.


1
Tup зіпсує пошукові символи, не грає добре з будь-якою іншою системою збірки (взагалі, насправді), не грає добре зі випадковими виходами (наприклад, класами, згенерованими javacвнутрішніми класами, які розділені на class$1.classфайли), погано написаний і використовує системні хаки для досягнення того, що робить. Він чудово підходить для невеликих систем; незбагненний для великих проектів.
Qix - МОНІКА ПОМИЛИ

@Qix: Ви не можете тримати вихід окремо від вашого сховища?
Керрек СБ

1
@KerrekSB Можна, але це не проблема з пошуком символів. Tup використовує FUSE і монтує власне проміжне програмне забезпечення в .tup/mnt. Потім він запускає всі програми збирання у папці (тобто .tup/mnt/@tupjob-XXXXX) як робочий каталог для контролю за читанням / записом, примушуючи конфігурацію збірки. Він працює добре, якщо шлях абсолютно не зберігається (тобто з символами). Коли ви компілюєте двійковий файл, шлях символів зберігається у самому бінарному файлі. Це означає, що GDB намагається завантажити символи, він шукає той tupjobшлях, який не існує, викликаючи помилки.
Qix - МОНІКА ПОМИЛИ

І Туп, і Ніндзя дуже інструменти низького рівня, настільки низькі чи ніколи нижче, ніж Make. Вони не адаптовані до C ++. Я навіть не закликав би ці інструменти будувати системи самостійно, оскільки їм не вистачає безліч важливих функцій вищого рівня, які пропонують справжні системи побудови для вирішення складних реальних проектів. Деякі з цих систем можуть використовувати Ninja як бек-енд.
Йохан Буле

11

Scons - це дуже доброзичлива і гнучка система, але ви праві, Лотар, це дуже повільно.

Але є спосіб підвищити продуктивність програм, написаних на Python. Це використання JIT. З усіх відомих проектів PyPy - це дуже потужна, швидко зростаюча та мотивована JIT-підтримка - Python 2.7. Сумісність PyPy з Python 2.7 просто дивовижна. Однак Scons оголошений як непідтримуваний проект у вікі сумісності PyPy . З іншого боку, Waf , змодельований як пітон-спадкоємець автоінструментів, повністю підтримується інфраструктурою PyPy. У моїх проектах швидкість збірки зросла в 5-7 разів при переході до PyPy. Ви можете побачити звіти про ефективність від PyPy .

Для сучасної та відносно швидкої системи складання Waf - хороший вибір.


Варто зазначити, що scons тепер позначений як "Сумісний" на пов'язаній сторінці вікі, тому, мабуть, зараз він працює з PyPy.
Підроблене ім’я

8

Система побудови Google - хороша альтернатива: http://bazel.io/


3
"Перехресна платформа (Linux як головна ціль, але здатна також будуватись як мінімум на Windows)". Поширені запитання Базеля говорить: "Зараз ми активно працюємо над вдосконаленням підтримки Windows, але це все ще способи бути корисними".
Майкл Мрозек

3
Я не впевнений, це сама система чи хлопець, який створив проект, але у мене був великий біль у спині, використовуючи його @ work. Він дуже негнучкий (у тому сенсі, що він підтримує лише один спосіб робити речі, часто неоптимальний, якщо не моторошний), недостатньо потужний, погано задокументований (окрім основних випадків), має мало спільноти, тому не сподівайтеся, що stackoverflow прийде врятувати вас , цілком залежність сама по собі, не грайте добре з більшістю IDE у більшості систем, тощо, і т. д. І тому, якщо ви не шанувальник Google - не тримайтеся подалі від цього (btw є версія цього фейсбуку під назвою Buck - для фанатів facebook)
Слава

Гей, я виявив, що це дуже просто у використанні, витративши 6 тижнів на те, щоб CMake працював. Я хотів, щоб він завантажив сторонні залежності і компілював їх (як я використовувався для гарного побудови інструментів з python та JavaScript). Це полегшило, але має зворотний зворот, що вам, можливо, доведеться писати власні файли базилів для третіх сторін, які не підтримують його. Їм потрібен центральний репо, щоб зберігати їх у i'ze računa.
CpILL

6

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

Системи Make, CMake та подібні збірки здаються сміттям макрозів. Ваф - аналог SCons. Я пробую Waf, але SCON буде більш доброзичливим, і тому я залишився з SCons.

На думку натовпу, SCons занадто повільний, але в середині проекту я не побачив різниці між make і SCons за швидкістю збирання. Натомість SCons добре працював з паралельними складаннями, в той час як у Make виникають великі проблеми з цим.

Також SCons дозволяє отримувати - налаштовувати, будувати, розгортати, генерувати конфігурацію з шаблонів, запускати тести та виконувати будь-які інші завдання, які можна виконати - кодування за допомогою python та SCons - все в одному. Це дуже велика перевага.

Для простого проекту CMake - також хороший вибір.


3
Моя проблема тут у тому, що я зіпсований. Я за професією розробник Java, і такі інструменти, як Gradle у світі Java, є тим інструментом, який мені дуже хотілося б мати для розробки C ++. Я можу створити проект gradle без зовнішніх залежностей за допомогою файлу збірки в одному рядку. Це воно. Багатомодульні проекти, які мають численні залежності, все ще легко зробити, і насправді вони мають набагато меншу конфігурацію, ніж навіть простий проект C ++ ...
Грем

У мене виникли проблеми зі створенням інших пакетів, які використовують Scons, тому що вони не абстрагуються прапорами конфігурації системи на зразок -Я включаю dirs та -L dir-бібліотеку. Це не займе CFLAGS, вам часто доводиться змінювати кожен сценарій scons, щоб він міг шукати в потрібному місці.
Ациклік

5

просто додати свої центи: premake

http://industriousone.com/premake

на вікі також є спеціальна веб-сторінка .


2
На жаль, Premake не підтримує генерацію коду відповідно до вимог ОП. І я б не назвав його підтримку модульного тестування "пристойною", хоча ви можете зробити кілька речей.
ergosys

@ergosys Я помічаю, що мураха не згадується, antтакож підтримує C / C ++, подивіться, чи добре це для вас, це прізвище у мене є, я просто використовую для цього Makefiles та Cmake.
користувач827992

2

Ви можете використовувати Ceedling . Зауважте, однак він підтримує лише C на даний момент, і він щільно поєднаний з рамками тестування Unity та CMock автора.

Це може бути роздвоєним і модифікованим, щоб працювати з компілятором C ++ і рамкою тестування / знущання з рамками досить легко.

Також Туп - гідна згадка. Це надзвичайно швидко, але він нічого не знає про тестування фреймворків тощо, а значить, вам доведеться написати власну систему побудови за допомогою Tup. Якщо ви плануєте робити TDD, Tup - це, мабуть, шлях.

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