DESTDIR и PREFIX производителя

120

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

  1. ./configure --prefix=***
  2. make install DESTDIR=***
  3. make install prefix=***

Я запутался в функциях этих трех. Достигают ли они одной и той же цели?

Шон
источник

Ответы:

185

./configure --prefix=***

Номер 1 определяет, куда пойдет пакет при установке и где он будет искать связанные с ним файлы при запуске. Это то, что вам следует использовать, если вы просто компилируете что-то для использования на одном хосте.


make install DESTDIR=***

Номер 2 предназначен для установки во временный каталог, из которого не будет запускаться пакет. Например, это используется при сборке debпакетов. Человек, создающий пакет, на самом деле не устанавливает все на конечное место в своей собственной системе. У него может быть уже установлена ​​другая версия и он не хочет мешать ей, или он может даже не иметь root-права. Поэтому он использует

./configure --prefix=/usr

поэтому программа будет ожидать, что ее установят /usrпри запуске, тогда

make install DESTDIR=debian/tmp

чтобы фактически создать структуру каталогов.


make install prefix=***

Номер 3 собирается установить его в другое место, но не создает все каталоги, как это DESTDIR=/foo/bar/bazбыло бы. Обычно он используется с загрузкой GNU через

./configure --prefix=/usr/local && make && sudo make install prefix=/usr/local/stow/foo

, который установит двоичные файлы в /usr/local/stow/foo/bin. По сравнению,

make install DESTDIR=/usr/local/stow/foo

установит двоичные файлы в /usr/local/stow/foo/usr/local/bin.

Алан Карри
источник
8
Как бы то ни было, в сборке на основе cmake вы можете эмулировать «case 4» (для хранения и т.д.), запустив его cmake -DCMAKE_INSTALL_PREFIX=/foo/bar/baz -P cmake_install.cmakeв каталоге сборки.
Райан Павлик,
@JackKelly: Спасибо! Я использовал DESTDIR с GNU stow, и мне пришлось исправить структуру каталогов с помощью обычного mv usr/local/* . && rmdir usr/local && rmdir usrиспользования prefix=- намного лучше!
thinkski
Примечание: некоторое программное обеспечение не поддерживает DESTDIR=/tmp/foo make install; для проектов на основе cmake мне больше повезло с cmake -DCMAKE_INSTALL_PREFIX=/tmp/test1 -P cmake_install.cmakeустановкой /tmp/foo/{bin,...}; см. пример на github.com/opencv/opencv/issues/11833#issuecomment-401164056 .
timotheecour
Еще одно замечание: DESTDIRи prefixможет быть использовано на make installвместе, то есть make install DESTDIR=/foo/bar/tmp perfix=/local.
Альберт
1

Это может помочь проиллюстрировать использование DESTDIRи --prefix( отсюда ):

Множественные установки с использованием --prefix и DESTDIR:

Укажите другое расположение / параметр --prefix для каждой сборки - во время настройки. Например:

untar petsc tar ball
./configure --prefix=/opt/petsc/petsc-3.9.0-mpich --with-mpi-dir=/opt/mpich
make
make install DESTDIR=/tmp/petsc-pkg
untar petsc tar ball
./configure --prefix=/opt/petsc/petsc-3.9.0-openmpi --with-mpi-dir=/opt/openmpi
make
make install DESTDIR=/tmp/petsc-pkg
sancho.s ReinstateMonicaCellio
источник
В случае, если файл ./configure не предоставлен, все равно можно выполнить установку в каталог, специфичный для пользователя, используя: make prefix = / path / to / your / lib / libaio install
Good Will
0

Из openssl/INSTALL

Создатели пакетов, которые хотят настроить библиотеку для стандартных расположений, но установили пакет в другом месте, чтобы его можно было легко упаковать, могут использовать

$ make INSTALL_PREFIX=/tmp/package-root install

(или укажите "--install_prefix = / tmp / package-root" в качестве параметра конфигурации). Указанный префикс будет добавлен ко всем именам файлов цели установки.

Это нестандартно, но INSTALL_PREFIX используется в некоторых других программах.

Это работает для версий OpenSSL до 1.1.x. OpenSSL 1.1.x и выше умеют распознавать обычные DESTDIR.

KYB
источник