Чому у makefiles має бути встановлена ​​мета "встановити"?


18

Походить із світу C та C ++, більшість систем побудови мають installціль, зокрема Makefiles (де, наприклад, рекомендує GNU ) або CMake . Ця мета копіює файли виконання (виконувані файли, бібліотеки, ...) в операційну систему (наприклад, в C:\Program Files\Windows).

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

У кращому випадку в системах побудови повинна бути releaseціль, яка виводить встановлену програму (наприклад, .debабо .msi), а потім люб'язно попросіть операційну систему встановити цю програму. Це також дозволить користувачу видалити без необхідності введення make uninstall.

Отже, моє запитання: чому система побудови зазвичай рекомендує мати installціль?


7
Ви стверджуєте, що "зробити встановлення" не підпадає під відповідальність за систему складання, але набагато більше пов'язана з платформою відповідальність за створення встановленого пакету.
pmf

2
У будь-якому випадку: іноді ви хочете встановити додаток, яким не керує ОС / менеджер пакунків (оскільки він має залежності, які можуть викликати конфлікти, неможливо вирішити за допомогою менеджера пакунків тощо). make installзазвичай встановлюється під /usr/local(або навіть /opt), які є каталогами, якими не керує "основна система управління ОС / пакетами". Не маю уявлення, чи має Windows подібне домовленості.
Бакуріу

11
"Це відчувається по-справжньому хакі". Ну що ви очікували від світу C / C ++? ;-)
Мейсон Уілер

1
Зауважте, що make installнемає сенсу, коли ми говоримо про перехресне складання
Хаген фон Ейтцен

1
@HagenvonEitzen це робить DESTDIR.
Nax 'vi-vim-nvim'

Відповіді:


23

Багато сценаріїв створення або Makefiles мають ціль встановлення тому, що вони були створені до існування менеджерів пакетів і тому, що навіть сьогодні багато систем не мають менеджерів пакетів. Крім того, існують системи, де make installнасправді є кращим способом управління пакетами.


Мені цікаво систем, де make installвіддано перевагу. Крім цього, я мав на увазі менеджера програм, коли я сказав, що makefiles повинні створювати встановлені пакети. Думаю, майже всі ОС мають спосіб управління встановленими програмами? Наприклад, Windows не має менеджера пакунків (крім магазину), але все ж є спосіб керувати встановленими програмами (через .msiпакети для прикладів)
Synxis

2
@Synxis BSD, Linux, Unix використовують усі файли. Переважно використовувати їх для встановлення, я не знаю, але ви часто маєте таку можливість використовувати make install.
Роб

1
В Debian по крайней мере , він вважає за краще використовувати checkinstallбільш make installз двох причин: «Ви можете легко видалити пакет з одного кроку.» та "Ви можете встановити отриманий пакет на декілька машин." - як checkinstall створює .deb та встановлює його, він використовує менеджер пакунків ...
Aaron Hall

1
@Synxis - Є кілька дистрибутивів Linux (часто їх називають вихідними дистрибутивами), де менеджер пакунків встановлює програми, завантажуючи файл tar, декомпресуйте його, а потім запустітьmake install
slebetman

1
@AaronHall Виправте мене, якщо я помиляюся, але у мене склалося враження, що checkinstallвиклик насправді використовуватиме make install та контролюватиме його дії зі створення пакунків.
cmaster - відновити моніку

5

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

Однак багато програм вимагають запуску зовнішніх ресурсів (наприклад: шрифти, бази даних, файли конфігурації тощо). І їх виконуваний файл часто робить певну гіпотезу щодо цих ресурсів. Наприклад, ваша bashоболонка, як правило, читає якийсь файл ініціалізації з /etc/bash.bashrcтощо. Ці ресурси, як правило, знаходяться у файловій системі (див. Hier (7) для угод про ієрархію файлів), а шлях до файлів за замовчуванням будується у вашому виконуваному файлі.

Спробуйте використовувати рядки (1) для більшості виконуваних файлів вашої системи. Ви дізнаєтеся, які шляхи до файлів відомі йому.

BTW, для багатьох програм GNU autoconfви можете запускати, make install DESTDIR=/tmp/destdir/не використовуючи root. Потім /tmp/destdir/заповнюються файли, які слід згодом упакувати.

FWIW, я схильний вважати, що мою програму bismon (GPLv3 + з ліцензією) (описану в моєму звіті bismon-chariot-doc.pdf ) не можна "встановити"; Я не впевнений, що зможу довести це, і не можу уявити, як я міг зробити цю програму інстальованою.


2
DESTDIR або інші префікси занадто часто забуваються. Як тільки залучаються зовнішні ресурси, такі як динамічні бібліотеки, неможливо скласти програмне забезпечення, не знаючи, де воно буде встановлено . Також чудово підходить для установки в нестандартні місця, наприклад, /optабо в $HOME. Єдиний спосіб уникнути різних префіксів - використовувати контейнери, але це, звичайно, специфічне для Linux рішення.
амон

2
Я бачив більше одного пакету, який, якщо ви спробували DESTDIR = / tmp / destdir, не працював пізніше при встановленні в звичайне місце, оскільки DESTDIR використовувався при генерації шляху.
Джошуа

@amon: Я не впевнений, що я б охарактеризував контейнери як специфічні для Linux. Linux може бути загальною цільовою платформою для контейнеризації, але певна форма технології контейнерів існує в більшості сучасних операційних систем.
Кевін

1
@Joshua Це не повинно, DESTDIR повинен бути актуальним лише під час кроку встановлення. Ви повинні мати можливість: ./configure --prefix="/opt/foo" && make && DESTDIR=/tmp/foo make install і мати змогу перенести пакет /opt/fooбез жодних проблем.
Nax 'vi-vim-nvim'

3

Є кілька причин, які приходять в голову.

  • Багато програмного забезпечення для створення пакетів - наприклад, система збирання Debian та, наприклад, IIRC rpm - вже очікують, що сценарій побудови "встановить" програму в якийсь спеціальний підкаталог. Таким чином, він рухається зворотною сумісністю в обох напрямках.
  • Користувач може захотіти встановити програмне забезпечення в локальний простір, наприклад, у $HOMEкаталозі. Не всі менеджери пакунків підтримують це.
  • Ще можуть існувати середовища, у яких немає пакетів.

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

1

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

Скажімо, ви використовуєте проект FOO з відкритим кодом, який наразі на версії 2.0.1, а ви використовуєте версію 1.3.0. Ви нічого не хочете використовувати вище, тому що версія 2.0.0 несумісна з тим, що ви зараз робите, але є одне виправлення помилок в 2.0.1, яке вам відчайдушно потрібно. Маючи make installможливість, ви зможете встановити модифіковане програмне забезпечення 1.3.0, не турбуючись про створення пакета та встановлення його у вашій системі.


1

Дистрибутиви Linux, як правило, відокремлюють підтримку програми від обслуговування пакетів. Система побудови, яка інтегрує генерацію пакунків, змусить утримувачів програм також виконувати обслуговування пакетів.

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

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

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

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

Менеджер пакунків стоїть посередині між системою збирання та сховищем тут і знаходиться в найкращому становищі, щоб добре інтегруватися з обома.

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

У моїй шапці Debian Developer ввімкнено: якщо ви випускаєте програмне забезпечення з відкритим кодом, залиште упаковку дистриб'юторам. Це економить і вам, і нам багато роботи.


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

1
@curiousdannii, між системою збирання та менеджером пакунків повинен бути деякий інтерфейс, і це, найчастіше, найпростіший, тому він виграв.
Саймон Ріхтер

1

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

Він може написати скрипт встановлення з довільним іменем або, можливо, зробити його частиною процедури якогось іншого сценарію. Однак, маючи стандартну команду встановлення make install(умова, що передує менеджерам пакетів), робити пакети стає дуже просто. Якщо ви подивитеся на шаблон PKGBUILD для створення пакетів Archlinux , ви можете побачити, що функція, яка насправді пакує, просто виконує a make DESTDIR="$pkgdir/" install. Це, ймовірно, працює для більшості пакетів і, можливо, більше з невеликою модифікацією. Завдяки make(і автоінструментам), які є стандартними, упаковка дійсно, дуже проста.

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