Bug 37433 - Не находит загружаемые библиотеки
Summary: Не находит загружаемые библиотеки
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: ruby-sassc (show other bugs)
Version: unstable
Hardware: all Linux
: P3 major
Assignee: majioa@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-11-06 15:02 MSK by Ivan A. Melnikov
Modified: 2019-11-10 12:40 MSK (History)
11 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ivan A. Melnikov 2019-11-06 15:02:30 MSK
ruby-sassc из Сизифа не работает вообще потому что не может найти нужные динамические библиотеки. Минималистичный пример:

$ cat test.rb
require "sassc"
$ ruby test.rb
Traceback (most recent call last):
        12: from test.rb:1:in `<main>'
        11: from /usr/lib/ruby/rubygems/core_ext/kernel_require.rb:39:in `require'
        10: from /usr/lib/ruby/rubygems/core_ext/kernel_require.rb:135:in `rescue in require'
         9: from /usr/lib/ruby/rubygems/core_ext/kernel_require.rb:135:in `require'
         8: from /usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/lib/sassc.rb:31:in `<top (required)>'
         7: from /usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/lib/sassc.rb:31:in `require_relative'
         6: from /usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/lib/sassc/native.rb:5:in `<top (required)>'
         5: from /usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/lib/sassc/native.rb:6:in `<module:SassC>'
         4: from /usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/lib/sassc/native.rb:10:in `<module:Native>'
         3: from /usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/lib/sassc/native.rb:13:in `rescue in <module:Native>'
         2: from /usr/lib/ruby/gems/2.5.0/gems/ffi-1.11.1/lib/ffi/library.rb:99:in `ffi_lib'
         1: from /usr/lib/ruby/gems/2.5.0/gems/ffi-1.11.1/lib/ffi/library.rb:99:in `map'
/usr/lib/ruby/gems/2.5.0/gems/ffi-1.11.1/lib/ffi/library.rb:145:in `block in ffi_lib': Could not open library '/usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/ext/libsass.so': /usr/lib/ruby/gems/2.5.0/gems/sassc-2.2.1/ext/libsass.so: cannot open
shared object file: No such file or directory (LoadError)

При этом libsass.so в Сизифе есть только в %_libdir, а libsassc (который тоже необходим этому гему) вообще, похоже, отсутствует.
Comment 1 Repository Robot 2019-11-08 18:16:26 MSK
ruby-sassc-2.2.1-alt2 -> sisyphus:

Fri Nov 08 2019 Pavel Skrylev <majioa@altlinux> 2.2.1-alt2
- changed (*) spec to use build requires
- fixed (!) lost link to system's .so lib (closes #37433)
- fixed (!) requires
Comment 2 mikhailnov 2019-11-09 09:48:30 MSK
Разрешите немного придраться к http://git.altlinux.org/gears/r/ruby-sassc.git?p=ruby-sassc.git;a=commitdiff;h=46abb8e801831e202077176615ab1f8fa854caaf ...

> ln -s $(find /usr -name libsass.so.1 2>/dev/null) %ruby_gemlibdir/ext/libsass.so

А если libsass сменить so name, например, на 2? Т.к. уже есть "BuildRequires: libsass-devel", то есть и симлинк libsass.so -> libsass.so.1, а значит можно узнавать значение N в libass.so.N динамически, либо через realpath, либо через readelf -a <...> | grep name. Его также часто можно узнать, грепнув /usr/inlude от нужной библиотеки.

"+BuildRequires: libsass" в таком случае тоже лишнее, т.к. -devel пакет обязан гарантированно подтянуть не devel пакет, а вот если упаковка libsass будет приведена в соответствие с Shared Libs Policy, чего сейчас нет, зависимость от "libass" может сломаться.

В целом не критично.
Comment 3 mikhailnov 2019-11-10 12:40:30 MSK
Т.е. я бы сделал примерно так:

Сначала узнаем путь к целевому файлу для симлинка:
%define libsass_file_path %(find %_libdir -maxdepth 1 -name 'libsass.so.*' | head -n 1 | grep . || echo 0)

"grep ." ничего не делает, но делает ненулевой код возврата, если find ничего не нашел, а если код возврата ненулевой, то делаем echo 0, чтобы в первом проходе парсера спека, когда еще не установлены сборочные зависимости, не получилось пустой переменной.

Далее узнаем имя пакета, которому принадлежит файл библиотеки:

%define libassess_pkg_name %(rpm -qf --queryformat='%{NAME}' %libsass_file_path || echo libsass)

"|| echo libsass" аналогично на случай ненулевого кода возврата rpm -qf, чтобы не получилось пустой переменной (не присвоенного макроса), которая приведет к ошибке.

<...>
Requires: %libassess_pkg_name
<...>
ln -s %libsass_file_pathlibsass_file_path %ruby_gemlibdir/ext/libsass.so