Чи автоматичне автоматичне налаштування та автоматичне підключення є стандартним способом компіляції коду?


22

Я іноді компілюю програми з джерела і я або використовую:

./configure
make
sudo make install

Але нещодавно я натрапив на те, ./autogen.shщо генерує конфігурацію та робить сценарії для мене та виконує їх.

Які ще існують методи оптимізації компіляції C / C ++ / C # (mono)? Зробити здається трохи старим. Чи є нові інструменти там? З огляду на вибір, який я повинен використовувати?


немає нічого подібного просто до коду. Наприклад, якщо ви отримуєте код Java, ви, ймовірно, будете створювати його за допомогою maven або ant, якщо ви отримаєте Python, хороший вибір - це setuptools. Не існує стандартних способів скласти що-небудь. Можливо, вам слід переформулювати питання.
дієга

Влучне зауваження. Я фактично кодую в C # з моно, але моє питання стосується і C / C ++.
Луї Салін

Невелика примітка: autogen.sh не виконує створення для вас, просто налаштуйте.
Сенді

@Sandy - autogen.shце переважно спеціальні сценарії, які зазвичай викликають, autoreconfале також можуть викликати ./configureі навіть make. Я не думаю, що його поведінка ні в якому разі не стандартизована; головна мета полягає у наявності в проекті файлу, який можна виконати, який люди можуть запускати (а не знати, що їм потрібно autoreconf
розмовляти

Відповіді:


42

Autoconf та Automake були розроблені для вирішення еволюційної проблеми Unix.

По мірі того, як Unix розвивався в різні напрямки, розробники, які хотіли, щоб портативний код писали так:

#if RUNNING_ON_BSD
Set things up in the BSD way
#if RUNNING_ON_SYSTEMV
Set things up in the SystemV way
#endif

Оскільки Unix був роздвоєний у різних реалізаціях (BSD, SystemV, багато виробничих виделок, а пізніше Linux та інших Unix-подібних систем), розробникам, які хотіли написати переносний код, стало важливо писати код, який залежав не від конкретної марки операційної системи , але щодо функцій, які піддаються операційній системі. Це важливо, тому що версія Unix вводить нову функцію, наприклад, системний виклик "відправити", а пізніше інші операційні системи приймають її. Замість того, щоб мати спагеті з кодом, який перевіряв на бренди та версії, розробники почали досліджувати функції, тому код став:

#if HAVE_SEND
Use Send here
#else
Use something else
#endif

Більшість файлів README для компіляції вихідного коду ще в 90-х роках загострені розробниками для редагування файлу config.h та зауважують, що належні функції доступні в системі, або вони доставлять стандартні файли config.h для кожної тестованої конфігурації операційної системи.

Цей процес був як громіздким, так і схильним до помилок, і таким чином став Autoconf. Ви повинні думати про Autoconf як про мову, що складається з команд оболонки зі спеціальними макросами, які змогли замінити людський процес редагування config.h інструментом, який перевіряв операційну систему на функціональність.

Зазвичай ви записуєте код зондування у файл configure.ac, а потім запускаєте команду autoconf, яка збирала б цей файл у виконувану команду налаштування, яку ви бачили використаною.

Отже, коли ви запускаєте, ./configure && makeви перевіряли функції, наявні у вашій системі, а потім будували виконуваний файл із встановленою конфігурацією.

Коли проекти з відкритим кодом почали використовувати системи управління вихідним кодом, було доцільно перевірити файл configure.ac, але не результат компіляції (налаштування). Autogen.sh - це лише невеликий скрипт, який викликає компілятор autoconf з потрібними для вас аргументами команд.

-

Автоматика виросла також із існуючої практики у громаді. Проект GNU стандартизував звичайний набір цілей для Makefiles:

  • make all створив би проект
  • make clean видалить усі зібрані файли з проекту
  • make install встановив би програмне забезпечення
  • такі речі, як make distі make distcheckпідготували б джерело до розповсюдження та підтвердили, що результатом був повний пакет вихідного коду
  • і так далі...

Побудова сумісних грифів стала обтяжливою, оскільки було багато плит, які повторювались знову і знову. Тож Automake був новим компілятором, який інтегрувався з autoconf та обробив "вихідний" Makefile's (з ім'ям Makefile.am) у Makefiles, який потім може подаватися до Autoconf.

Ланцюжок інструментів automake / autoconf фактично використовує ряд інших допоміжних інструментів, і вони доповнюються іншими компонентами для виконання інших конкретних завдань. У міру того, як складність виконання цих команд зростала, потреба в готовому для запуску скрипті народилася, і саме звідси походить autogen.sh.

Наскільки мені відомо, Gnome був проектом, який представив використання цього помічника скрипта autogen.sh


Лише незначна нитка: стандарти GNU зобов’язують відправляти генеровані файли в тарболи, щоб зменшити залежності побудови до мінімуму універсально доступних інструментів. Якщо ви отримаєте сировину (наприклад, із системи контролю версій), згенерованих файлів там не буде.
фонбранд

14

У цій галузі є два "великі гравці"; Cmake та GNU Autotools.

  • GNU Autotools - це спосіб GNU робити речі і орієнтований на * nix. Це свого роду система мета-збирання, що надає набір інструментів, які генерують конкретні конфігурації та створюють файли для того, що ви намагаєтесь зробити. Це допомагає вам вносити більше змін у свій код без необхідності безпосередньо маніпулювати системою збирання, а також допомагає іншим будувати ваш код таким чином, який ви не розробляли для цього - під * nix.

  • Cmake - це крос-платформний спосіб робити речі. Команда Cmake будує програмне забезпечення на безлічі багатьох різних способів: GCC, Visual Studio, XCode, Windows, OSX, Solaris, BSD, GNU / Linux. Якщо ви взагалі переймаєтесь переносимістю кодової бази, це шлях.

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

У Ruby також є така система мета-побудови під назвою Rake, яка досить крута сама по собі, і дуже зручна для тих, хто вже знайомий з Ruby.


6

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


2
Переносність не є проблемою, оскільки Python зараз практично скрізь. Основна скарга на SCON поки що - це неприпустимо повільно. Є кілька хитрощів, щоб принести в жертву точність побудови на користь швидкості, але я не впевнений, чи це все ще нарівні з Make.
Алекс Б

3

Якщо ви використовуєте C # / Mono, ви можете використовувати msbuild (файли .sln / .csproj, які використовуються MonoDevelop та Visual Studio) для управління всім процесом збирання.

Потім можна або створити з MonoDevelop, або запустити xbuildкоманду в улюбленому терміналі (найкраще працює в Mono> = 2.6). Це надзвичайно просто і вимагає майже ніякої роботи з вашого боку, тому що MonoDevelop буде обробляти файли msbuild для вас, і вам не потрібно буде їх редагувати, якщо ви не хочете налаштувати речі, що перевищують те, що інтерфейс MonoDevelop може зробити для вас.

Я не знайомий з тим, як люди, які залежать від msbuild, обробляють установки для своїх проектів, але ви завжди можете це запитати. ;-)


Так, я знаю про xbuild, але я намагаюся відлучити себе від IDE, які просто хочуть тримати мене за руку. Плюс Mono складається за допомогою Mono і використовує autoconf, тому я хотів дізнатися трохи більше. Спасибі!
Луї Салін

1
Цікаво, що багато проектів Mono намагаються перейти на msbuild зараз, коли xbuild працює так добре. Це робить підтримку Windows / Mac трохи простішою. У Mono є стільки C-коду, що я не впевнений, наскільки практичним було б їх перейти на xbuild. Але autoconf чудово працює, тому робіть все, що працює для вас. :-)
Сенді

0

Для C # ви можете використовувати xbuild (та msbuild на windows), який будуватиме проект з ваших файлів проекту.

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