Иногда самая безобидная на первый взгляд операция - комментирование строки ,- может вылиться в целую последовательность мучительных поисков концов дальнейших проблем.
Углубимся в тематику и рассмотрим следующую вырезку из
.spec файла:
%install
%{__make} DESTDIR=%{buildroot} install
#%makeinstall \
# incdir="%{buildroot}%{_includedir}/ffmpeg" \
# shlibdir="%{buildroot}%{_libdir}" \
# libdir="%{buildroot}%{_libdir}"
Как видно макрос
%makeinstall закомментирован и все последующие параметры тоже. Данная конструкция успешно собирается
rpmbuild. Однако на этапе выполнения
mock-сборки вылезают артефакты в виде следующих ошибок:
+ /usr/bin/make prefix=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr exec_prefix=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr bindir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/bin sbindir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/sbin sysconfdir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/etc datadir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/share includedir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/include libdir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/lib64 libexecdir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/libexec localstatedir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/var sharedstatedir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/com mandir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/share/man infodir=/var/tmp/ffmpeg-0.5-1-root-mockbuild/usr/share/info install
install -d "/usr/lib64"
install: cannot change permissions of `/usr/lib64': Operation not permitted
make: *** [install-libpostproc-static] Error 1
error: Bad exit status from /var/tmp/rpm-tmp.60290 (%install)
На каком основании скрипт полез в
/usr/lib64, когда ему четко была задана переменная
DESTDIR и вся установка должна была протекать в окрестности директории
%{buildroot}, оставалось загадкой на протяжении нескольких часов исследования всего процесса сборки. В полном отчаянии начал просматривать весь листинг сборки
rpmbuild. И заметил, что
make install на выполняется дважды.
+ /usr/bin/make DESTDIR=/var/tmp/ffmpeg-0.5-1-root-root install
...[skipped]
+ /usr/bin/make prefix=/var/tmp/ffmpeg-0.5-1-root-root/usr exec_prefix=/var/tmp/ffmpeg-0.5-1-root-root/usr bindir=/var/tmp/ffmpeg-0.5-1-root-root/usr/bin sbindir=/var/tmp/ffmpeg-0.5-1-root-root/usr/sbin sysconfdir=/var/tmp/ffmpeg-0.5-1-root-root/etc datadir=/var/tmp/ffmpeg-0.5-1-root-root/usr/share includedir=/var/tmp/ffmpeg-0.5-1-root-root/usr/include libdir=/var/tmp/ffmpeg-0.5-1-root-root/usr/lib64 libexecdir=/var/tmp/ffmpeg-0.5-1-root-root/usr/libexec localstatedir=/var/tmp/ffmpeg-0.5-1-root-root/var sharedstatedir=/var/tmp/ffmpeg-0.5-1-root-root/usr/com mandir=/var/tmp/ffmpeg-0.5-1-root-root/usr/share/man infodir=/var/tmp/ffmpeg-0.5-1-root-root/usr/share/info install
Видно не вооруженным глазом, что второй вызов
make потерял переменную
DESTDIR. Более того, откуда второй вызов
make install?!
Оставшийся вариант,
rpmbuild создает второй вызов с неверными параметрами. Заглянув в shell-скрипт
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.78776
который создается на основе
spec-файла при вызове
rpmbuild, все стало на свои места. Первоначальный приведенный код с закомментированным макросом
%makeinstall разворачивается в следующий псевдокод:
/usr/bin/make DESTDIR=/var/tmp/ffmpeg-0.5-1-root-root install
#
/usr/bin/make \
prefix=/var/tmp/ffmpeg-0.5-1-root-root/usr \
exec_prefix=/var/tmp/ffmpeg-0.5-1-root-root/usr \
bindir=/var/tmp/ffmpeg-0.5-1-root-root/usr/bin \
sbindir=/var/tmp/ffmpeg-0.5-1-root-root/usr/sbin \
sysconfdir=/var/tmp/ffmpeg-0.5-1-root-root/etc \
datadir=/var/tmp/ffmpeg-0.5-1-root-root/usr/share \
includedir=/var/tmp/ffmpeg-0.5-1-root-root/usr/include \
libdir=/var/tmp/ffmpeg-0.5-1-root-root/usr/lib64 \
libexecdir=/var/tmp/ffmpeg-0.5-1-root-root/usr/libexec \
localstatedir=/var/tmp/ffmpeg-0.5-1-root-root/var \
sharedstatedir=/var/tmp/ffmpeg-0.5-1-root-root/usr/com \
mandir=/var/tmp/ffmpeg-0.5-1-root-root/usr/share/man \
infodir=/var/tmp/ffmpeg-0.5-1-root-root/usr/share/info \
install \
# incdir="/var/tmp/ffmpeg-0.5-1-root-root/usr/include/ffmpeg" \
# shlibdir="/var/tmp/ffmpeg-0.5-1-root-root/usr/lib64" \
# libdir="/var/tmp/ffmpeg-0.5-1-root-root/usr/lib64"
Соответственно мы получаем два прогона
make install. Причем второй вызов ошибочен.
Итого: неиспользуемые макросы подлежат удалению из строчек
spec-файла.