2011-11-10 18 views
20

В процессе создания пакета RPM я должен указать BuildRoot, а позже будет использоваться в% install, который вызывает $ RPM_BUILD_ROOT. Я всегда думаю, что $ RPM_BUILD_ROOT - это поддельная установка для RPM для упаковки. Затем, во время установки с использованием пакета RPM, он будет установлен в фактическое местоположение. Например:

$RPM_BUILD_ROOT/usr/bin 

Я думал, что $ RPM_BUILD_ROOT только для процесса упаковки, а в некоторых отношениях RPM можно выделить $ RPM_BUILD_ROOT и фактическое место установки, когда пользователь выполняет «оборотов в минуту -ivh package.rpm» будет be/usr/bin.

Но в последнее время при чтении некоторых документов предполагается, что $ RPM_BUILD_ROOT - это фактическое место, которое будет установлено, и $ RPM_BUILD_ROOT задается пользователем с настройкой переменной среды $ RPM_BUILD_ROOT, чтобы пользователи могли установить пакет в местах их желания. В противном случае $ RPM_BUILD_ROOT будет null, и он будет установлен в местоположение по умолчанию. В приведенном выше случае это/usr/bin. Таким образом, $ RPM_BUILD_ROOT предназначен не только для процесса упаковки или «поддельной установки», но и для пользователя, чтобы определить местоположение установки, аналогично выбору местоположения папки в Windows.

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

ответ

27

$RPM_BUILD_ROOT (или эквивалент макрофайл %{buildroot} SPEC) всегда держит каталог, в котором RPM будет искать любые файлы в пакет. Скрипты RPM (например, сценарий, который сжимает страницы руководства) также будут использовать это значение, чтобы знать, где искать только что установленные файлы. Обычно это значение будет непустым и содержать место вдали от системных каталогов - обычно где-то ниже /tmp или /var/tmp.

Автор файла SPEC, как ожидается, чтобы убедиться, что make install (или любой другой программы установки программного обеспечения в вопросе использования) будет размещать любые файлы в $RPM_BUILD_ROOT, с одной и той же иерархии, которые должны быть использованы, когда программное обеспечение окончательно установлена. Например. чтобы установить RPM ls в /bin/ls, раздел файла %install SPEC должен убедиться, что ls размещен в $RPM_BUILD_ROOT/bin/ls.

Предполагается, что файл SPEC также использует тег BuildRoot:, чтобы указать правильное местоположение. В качестве альтернативы, система сборки может иметь конфигурационный файлRPM с соответствующей записью. В any case корень сборки должен быть установлен, так что:

  • Обычные пользователи смогут создавать исходный пакет.

  • Если суперпользователь когда-либо создавал исходный пакет, процесс сборки не будет клонировать любые системные файлы, если суперпользователь не установит полученный двоичный пакет. И да, может быть веская причина, чтобы построить некоторые пакетов как root - например, для запуска полного glibc testsuite требует root привилегий для некоторых тестов.

При этом RPM может и будет строить пакет с пустой переменной корня. В этом случае как установка сборки, так и конечные места назначения совпадут. Потенциальный вызов, например, make install будет использовать местоположения по умолчанию, таким образом, сбивая системные файлы, например, /usr/lib при запуске с достаточными привилегиями.Кроме того, если /usr/bin/* в вашем разделе %files с удовольствием вытащит все содержимое каталога сборки /usr/bin/ в ваш двоичный пакет.

Итог:

  • Никогда не используйте пустой корень сборки.

  • Не создавайте пакеты как root, если нет абсолютно другого способа.

+0

Таким образом, в end, $ RPM_BUILD_RooT - это просто значение, используемое для процесса построения, и для RPM для подделки установить файлы в корневой каталог сборки, чтобы он мог получить структуру каталогов для конечных мест установки. Я думаю, что мое первоначальное понимание корня сборки правильное. – Amumu

+0

Как мы можем передать настраиваемый корневой каталог для 'make install'? – Jeroen

+0

Рекомендовать уникальный $ RPM_BUILD_ROOT для поддержки параллельных сборок на одном хосте, используя примерно следующее: 'BuildRoot:% {_ tmppath} /% {name} -buildroot -% {version} -% {release}' – MarkHu

7

файл ~/.rpmmacros определяет пути для каждого пользователя:

%_topdir %(echo $HOME)/rpmbuild 
%_tmppath %{_topdir}/tmp 

и можно также определить их с параметрами командной строки rpmbuild:

rpmbuild --define '_topdir /home/username/rpmbuild' 
Смежные вопросы