После обновления rpm-build до 4.0.4.213-alt1 (коммит 1766d5f79213, "feat(fixup): add RPM_PREFIX to pkgconfig script") brp-скрипт /usr/lib/rpm/fixup-pkgconfig перестал вычищать стандартный библиотечный путь из pkg-config-файлов: Libs: -Wl,-rpath,/usr/lib64 -L${libdir} -l... вместо Libs: -L${libdir} -l... Причина - ошибка в кавычках. В sed-выражении переменная $PREFIX_ESCAPED оказалась внутри одинарных кавычек: sed -e 's#\(^\| \+\)\(-Wl,-rpath,\)"$PREFIX_ESCAPED"\(/local\)\?/...' Последствия Пакеты, которые линкуются через pkg-config, получают RPATH на стандартный путь /usr/lib64. Проверка verify-elf это запрещает: verify-elf: ERROR: ./usr/lib64/samba/pdb/ipasam.so: RPATH contains standard library path "/usr/lib64": /usr/lib64:/usr/lib64/samba Так сломалась сборка freeipa (ALT #60003), также пострадали vlc и ffmpeg. Пока пакет не пересобран после исправления rpm-build, его .pc-файлы остаются с rpath. Примеры: Сборка samba-4.22.10-alt1 (task 427214, rpm-build 4.0.4.212-alt1): /usr/lib64/pkgconfig/ndr_krb5pac.pc: Libs: '-Wl,-rpath,/usr/lib64 -L${libdir} -lndr-krb5pac' --> '-L${libdir} -lndr-krb5pac' Сборка samba-4.22.11-alt1 (task 427373, rpm-build 4.0.4.213-alt1): строк Libs: в логе нет, .pc остался с -Wl,-rpath,/usr/lib64. Как воспроизвести? cat > x.pc <<'EOF' prefix=/usr libdir=${prefix}/lib64 Name: x Description: x Version: 1 Libs: -Wl,-rpath,/usr/lib64 -L${libdir} -lx Cflags: -I${includedir} EOF mkdir -p root/usr/lib64/pkgconfig cp x.pc root/usr/lib64/pkgconfig/ RPM_BUILD_ROOT=$PWD/root RPM_BUILD_DIR=/usr/src/RPM/BUILD \ RPM_LIB=lib64 RPM_LIBDIR=/usr/lib64 RPM_PREFIX=/usr \ /usr/lib/rpm/fixup-pkgconfig root/usr/lib64/pkgconfig/x.pc grep Libs root/usr/lib64/pkgconfig/x.pc Ожидаемый результат: Libs: -L${libdir} -lx Фактический результат: Libs: -Wl,-rpath,/usr/lib64 -L${libdir} -lx __________ Дополнительно В том же скрипте есть вторая, латентная проблема: alternation \($RPM_BUILD_ROOT\|$RPM_BUILD_DIR\|/usr/lib[^/]*/gcc-lib\) при пустом RPM_BUILD_DIR содержит пустую ветку и вырезает любой rpath, включая /usr/lib64/samba. В реальной сборке переменная выставлена, поэтому не проявляется.
Подготовил сборку с исправлениями: #439179 EPERM #1 sisyphus rpm-build.git=4.0.4.217-alt1
(In reply to Evgeny Sinelnikov from comment #1) > Подготовил сборку с исправлениями: > #439179 EPERM #1 sisyphus rpm-build.git=4.0.4.217-alt1 спасибо, посмотрю!
(In reply to Evgeny Sinelnikov from comment #0) > Дополнительно > > В том же скрипте есть вторая, латентная проблема: alternation > > \($RPM_BUILD_ROOT\|$RPM_BUILD_DIR\|/usr/lib[^/]*/gcc-lib\) > > при пустом RPM_BUILD_DIR содержит пустую ветку и вырезает любой rpath, > включая /usr/lib64/samba. В реальной сборке переменная выставлена, поэтому > не проявляется. Этот RPM_BUILD_DIR вообще стоило бы проверять на непустоту в начале. Более того, не хватает "лаунчера" для тестирования всех этих brp-* и fixup-*, отдельного от rpmbuild -b$mode. Но в fixup-pkgconfig он встречается один раз, в качестве не обращения, а упоминания; я думаю сделать там "${RPM_BUILD_DIR-.}", всё равно ld -rpath . то ли линкер отказывается делать, то ли просто лишь мы должны вырезать.
(In reply to Evgeny Sinelnikov from comment #0) > Последствия > > Пакеты, которые линкуются через pkg-config, получают RPATH на стандартный > путь /usr/lib64. Проверка verify-elf это запрещает: > > verify-elf: ERROR: ./usr/lib64/samba/pdb/ipasam.so: > RPATH contains standard library path "/usr/lib64": > /usr/lib64:/usr/lib64/samba > > Так сломалась сборка freeipa (ALT #60003), также пострадали vlc и ffmpeg. > Пока пакет не пересобран после исправления rpm-build, его .pc-файлы > остаются с rpath. > > Как воспроизвести? > > cat > x.pc <<'EOF' > prefix=/usr > libdir=${prefix}/lib64 > Name: x > Description: x > Version: 1 > Libs: -Wl,-rpath,/usr/lib64 -L${libdir} -lx > Cflags: -I${includedir} > EOF > > mkdir -p root/usr/lib64/pkgconfig > cp x.pc root/usr/lib64/pkgconfig/ > RPM_BUILD_ROOT=$PWD/root RPM_BUILD_DIR=/usr/src/RPM/BUILD \ > RPM_LIB=lib64 RPM_LIBDIR=/usr/lib64 RPM_PREFIX=/usr \ > /usr/lib/rpm/fixup-pkgconfig root/usr/lib64/pkgconfig/x.pc > > grep Libs root/usr/lib64/pkgconfig/x.pc Спасибо за пример! Напишу про это тест.