Bug 41688

Summary: Пути в $LOAD_PATH и %ruby_sitearchdir версионированы по PATCH
Product: Sisyphus Reporter: Vitaly Chikunov <vt>
Component: rubyAssignee: majioa <majioa>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: 3aHyga, cas, imz, iv, ldv, led, majioa, mike, nbr, pav, rider, stalker
Version: unstable   
Hardware: x86   
OS: Linux   
See Also: https://bugzilla.altlinux.org/show_bug.cgi?id=44173

Description Vitaly Chikunov 2022-01-11 07:38:01 MSK
Макрос %ruby_sitearchdir определён как /usr/lib/ruby/site_ruby/2.7.5/x86_64-linux то есть содержит версию ruby "2.7.5", а не MAJOR.MINOR.0 т.е. "2.7.0" как принято в других дистрибутивах, чтоб модуль не пропадал и не требовал обновления при каждом бинарно-совместимом PATCH апдейте ruby). $LOAD_PATH так же содержит пути с такой версией:

irb(main):001:0> pp$:
["/usr/lib/ruby/gems/2.7.0/gems/rake-13.0.5/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/did_you_mean-1.4.0/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/io-console-0.5.6/lib",
 "/usr/lib/ruby/gems/2.7.0/extensions/x86_64-linux/2.7.0/io-console-0.5.6",
 "/usr/lib/ruby/gems/2.7.0/gems/reline-0.1.5/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/irb-1.2.6/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/uri-0.10.0/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/timeout-0.1.0/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/forwardable-1.3.1/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/delegate-0.1.0/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/fileutils-1.4.1/lib",
 "/usr/lib/ruby/gems/2.7.0/gems/etc-1.1.0/lib",
 "/usr/lib/ruby/gems/2.7.0/extensions/x86_64-linux/2.7.0/etc-1.1.0",
 "/usr/lib/ruby/site_ruby/2.7.0",
 "/usr/lib/ruby/site_ruby/2.7.5/x86_64-linux",
 "/usr/lib/ruby/site_ruby",
 "/usr/lib/ruby/vendor_ruby/2.7.0",
 "/usr/lib/ruby/vendor_ruby/2.7.5/x86_64-linux",
 "/usr/lib/ruby/vendor_ruby",
 "/usr/lib/ruby",
 "/usr/lib/ruby/x86_64-linux"]

Для сравнения пример из Ubuntu:

root@ubuntu-impish:~# irb
irb(main):001:0> RUBY_VERSION
=> "2.7.4"
irb(main):002:0> pp$:
["/usr/local/lib/site_ruby/2.7.0",
 "/usr/local/lib/x86_64-linux-gnu/site_ruby",
 "/usr/local/lib/site_ruby",
 "/usr/lib/ruby/vendor_ruby/2.7.0",
 "/usr/lib/x86_64-linux-gnu/ruby/vendor_ruby/2.7.0",
 "/usr/lib/ruby/vendor_ruby",
 "/usr/lib/ruby/2.7.0",
 "/usr/lib/x86_64-linux-gnu/ruby/2.7.0"]

AFAIK, в opensгse, debian, fedora такая же схема как в Ubuntu (с путями где PATCH=0).

Для контраста -- пути к gems и макрос %ruby_gemsextdir определен правильно в смысле версионирования: /usr/lib/ruby/gems/2.7.0/extensions/x86_64-linux/2.7.0

То есть собираемые gems не будут требовать обновления при каждом обновлении PATCH версии ruby.

ps. Версия ещё раз в конце пути %ruby_gemsextdir - это ошибка?
Comment 1 Vitaly Chikunov 2022-01-11 07:49:07 MSK
Да, кстати, макрос %ruby_version сейчас определен как 2.7.0.
Comment 2 Малъ Скрылевъ 2022-01-18 18:09:41 MSK
(Ответ для Vitaly Chikunov на комментарий #0)
> Макрос %ruby_sitearchdir определён как
> /usr/lib/ruby/site_ruby/2.7.5/x86_64-linux то есть содержит версию ruby
> "2.7.5", а не MAJOR.MINOR.0 т.е. "2.7.0" как принято в других дистрибутивах,

> AFAIK, в opensгse, debian, fedora такая же схема как в Ubuntu (с путями где
> PATCH=0).
> 
> Для контраста -- пути к gems и макрос %ruby_gemsextdir определен правильно в
> смысле версионирования:
> /usr/lib/ruby/gems/2.7.0/extensions/x86_64-linux/2.7.0
> 
> То есть собираемые gems не будут требовать обновления при каждом обновлении
> PATCH версии ruby.
 
Само предложение выглядит здраво, rvm скажем собирает в правильными путями, т.е. c 2.7.0, хотя ссылка на другие дистрибутивы выглядит странно. Думаю, стоит ориентироваться тут на rvm.

> ps. Версия ещё раз в конце пути %ruby_gemsextdir - это ошибка?

Не должно быть в %ruby_gemsextdir лишнего.
Comment 3 Vitaly Chikunov 2022-01-20 19:12:52 MSK
i. Полагаю, что пути с site_ruby (ни при каких условиях) не должны использоваться (со времен ruby 1.9), а нужно использовать пути с vendor_ruby. Соответственно, чтоб сохранить обратную-совместимость spec'ов нужно

1. Завести макросы %ruby_vendor{archdir,libdir,dir} - для новых пользователей.
2. Соответствующие им %ruby_site* макросы перенаправить на %ruby_vendor*

Видимо эти:

  %ruby_sitearchdir       %(%ruby_rubyconf_func sitearchdir)
  %ruby_sitelibdir        %(%ruby_rubyconf_func sitelibdir)
  %ruby_sitearchdir       %(%ruby_rubyconf_func sitearchdir)


Тогда новые пакеты будут собираться в vendor_ruby, где они и должны быть, а старые спеки продолжат работать. (Нужно спросить мнение ldv на этот счёт.)

ii. Или, если это нельзя сделать, то просто завести макросы %ruby_vendor* чтоб новые пакеты можно было вручную исправлять на правильные пути.
Comment 4 Vitaly Chikunov 2022-01-20 19:44:25 MSK
По поводу путей к vendor_ruby. Сейчас они такие

builder@x86_64:~$ ruby -rrubygems -rrbconfig -e 'pp RbConfig::CONFIG'|grep vendor
 "vendorarchhdrdir"=>"/usr/include/vendor_ruby/x86_64-linux",
 "vendorhdrdir"=>"/usr/include/vendor_ruby",
  " ... '--with-vendorarchdir=/usr/lib/ruby/vendor_ruby/2.7.5/x86_64-linux' ... ",
 "vendorarchdir"=>"/usr/lib/ruby/vendor_ruby/2.7.5/x86_64-linux",
 "vendorlibdir"=>"/usr/lib/ruby/vendor_ruby",
 "vendordir"=>"/usr/lib/ruby/vendor_ruby",

Архитектурно зависимые пути (vendorarchdir) выглядят неправильно. Суффикс "x86_64-linux" это скорее всего что-то из дебиана где вместо /lib64 используется /lib/x86_64-linux. Полагаю, что нужно сделать путь /usr/%_lib/ruby/vendor_ruby/2.7.0, где %_lib это (наш макрос раскрывающийся в) lib или lib64 в зависимости от платформы.
Comment 5 Vitaly Chikunov 2022-01-20 19:48:12 MSK
Вот я сейчас увидел коммит с

-        --with-vendorarchdir=%libdir/vendor_ruby/%_version/%ruby_arch \
+        --with-vendorarchdir=%libdir/vendor_ruby/%ruby_version/%ruby_arch \

а хотелось бы

+        --with-vendorarchdir=%_libdir/ruby/vendor_ruby/%ruby_version \
Comment 6 Малъ Скрылевъ 2022-01-20 20:19:26 MSK
(Ответ для Vitaly Chikunov на комментарий #4)
> По поводу путей к vendor_ruby. Сейчас они такие
> 
> builder@x86_64:~$ ruby -rrubygems -rrbconfig -e 'pp RbConfig::CONFIG'|grep
> vendor
>  "vendorarchhdrdir"=>"/usr/include/vendor_ruby/x86_64-linux",
>  "vendorhdrdir"=>"/usr/include/vendor_ruby",
>   " ... '--with-vendorarchdir=/usr/lib/ruby/vendor_ruby/2.7.5/x86_64-linux'
> ... ",
>  "vendorarchdir"=>"/usr/lib/ruby/vendor_ruby/2.7.5/x86_64-linux",
>  "vendorlibdir"=>"/usr/lib/ruby/vendor_ruby",
>  "vendordir"=>"/usr/lib/ruby/vendor_ruby",
> 
> Архитектурно зависимые пути (vendorarchdir) выглядят неправильно. Суффикс
> "x86_64-linux" это скорее всего что-то из дебиана где вместо /lib64
> используется /lib/x86_64-linux. Полагаю, что нужно сделать путь
> /usr/%_lib/ruby/vendor_ruby/2.7.0, где %_lib это (наш макрос раскрывающийся
> в) lib или lib64 в зависимости от платформы.

по хорошему вообще все *.so нужно пихать в lib64, а *.rb в lib, но это много возни, не для этой задачи, поэтому vendorarchdir пока, думаю, оставлю как есть.
Comment 7 Малъ Скрылевъ 2022-01-20 20:22:43 MSK
Хотя возможно это не так сложно вделать....
Comment 8 Vitaly Chikunov 2022-01-20 20:42:07 MSK
Я ещё заметил в $: путь /usr/lib/ruby/x86_64-linux/ (который использует только ruby-stdlib), видимо, должно быть /usr/%_lib/ruby/.
Comment 9 Vitaly Chikunov 2022-02-09 19:29:23 MSK
Any news?
Comment 10 Repository Robot 2022-03-01 16:21:35 MSK
ruby-2.7.5-alt1.1 -> sisyphus:

 Tue Jan 18 2022 Pavel Skrylev <majioa@altlinux> 2.7.5-alt1.1
 - ! %ruby_sitearchdir path (ALT #41688)
Comment 11 Vitaly Chikunov 2022-03-22 10:49:14 MSK
Спасибо!