Что означает «%{__install}» с точки зрения спецификации rpm?

#linux #rpm #rpmbuild #rpm-spec

#linux #rpm #rpmbuild #rpm-спецификация

Вопрос:

Возможно, это очень глупый вопрос, но я не могу найти ответ. Я никогда не пытался написать файл спецификации для пакета rpm до сегодняшнего дня. Я нашел пример спецификации и вижу много %{__install} мыслей в %install разделе. Насколько я понимаю по синтаксису, это король макросов. Но в файлах спецификации для этого нет определения. В моем примере это выглядит так:

 %install
%{__install} -pD -m 644 $RPM_BUILD_DIR/my-project-%{version}/deploy/my-project.service $RPM_BUILD_ROOT/usr/lib/systemd/system/my_project-emperor.service
  

Я также видел много примеров с этими макросами в других спецификациях, которые я нашел. Например
это или то. У них одинаковый синтаксис:

 %{__install} -s %{name} %{buildroot}%{_sbindir}/
%{__install} -c -m 644 examples/acl-content-sw.cfg %{buildroot}%{_sysconfdir}/%{name}/%{name}-acl-content-sw.cfg.example
%{__install} -c -m 644 examples/auth.cfg %{buildroot}%{_sysconfdir}/%{name}/%{name}-auth.cfg.example
  

Но что %{__install} на самом деле? Какие-то встроенные макросы для rpm builder? Это трудно погуглить или найти в официальных документах, но похоже, что это какая-то обычная вещь.

Ответ №1:

К сожалению, волшебного ответа нет. Макросы Rpm могут быть переопределены по-разному в разных ОС и даже могут быть переопределены впоследствии другими пакетами.

Определения по умолчанию можно найти в /usr/lib/rpm/macros , но другие пакеты могут устанавливать дополнительные макросы в /usr/lib/rpm/macros.d/ .

в моем /usr/lib/rpm/macros if найдено это определение:

 %__install              /usr/bin/install
  

итак, в этом случае макрос %__install на самом деле ничего не добавляет.

Но я нахожу %make_install макрос довольно удобным; который определяется как:

 %make_install %{__make} install DESTDIR=%{?buildroot} INSTALL="%{__install} -p"
  

итак, вместо того, чтобы поместить

 make install DESTDIR=%{?buildroot}
  

Я могу просто поместить

 %make_install
  

в моем файле спецификации… (и, объясняя это; я только что познакомился с -p опцией install 🙂 )

Ответ №2:

%__install это макрос.

Если вы хотите получить значение макроса, то используйте ‘rpm —eval’:

 $ rpm --eval '%__install'
/usr/bin/install
$ rpm --eval '%{__install} -s %{name} %{buildroot}%{_sbindir}/'
/usr/bin/install -s %{name} /home/msuchy/rpmbuild/BUILDROOT/%{NAME}-%{VERSION}-%{RELEASE}.x86_64/usr/sbin/
  

Во втором примере вы можете видеть, что %{name} не был расширен, потому что это не системный макрос, но он определен в файле спецификации с помощью Name тега.

Кроме того, rpm --showrc показывает вам список системных макросов, определенных в вашей системе. Он показывает определение, а не развернутые макросы.