Bug 43041

Summary: find-lang и языко-зависимая установка
Product: Sisyphus Reporter: Stanislav Levin <slev>
Component: rpm-buildAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: arseny, glebfm, imz, ldv, placeholder, vt
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description Stanislav Levin 2022-06-22 14:24:57 MSK
Собираю Docker образ из library/alt:sisyphus.

Для значительного уменьшения размера этого образа ограничиваю список устанавливаемых i18n, например, fr_FR:

[root@cf2717cdcd7d /]# cat /etc/rpm/macros
%_install_langs fr_FR:
%_rpmscript_werror 1

Директория при этом /usr/share/locale/en_GB отсутствует:

[root@36121e2f67cd /]# ls -la /usr/share/locale/en_GB
ls: cannot access '/usr/share/locale/en_GB': No such file or directory

Безуспешно пытаюсь установить glibc-locales:

[root@cf2717cdcd7d /]# rpm -ivvv  ~/glibc-locales_6%3a2.35.0.6.491f2e-alt1%3asisyphus+295115.100.1.1\@1644420165_x86%5f64.rpm
...
D: skipnstate 040755  1 (   0,   0)     0 /usr/share/locale/en_GB
D: skipnstate 040755  1 (   0,   0)     0 /usr/share/locale/en_GB/LC_MESSAGES
D: create     100644  1 (   0,   0)  1433 /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;62b2f492
fdio:   20740 reads, 166612160 total bytes in 1.618491 secs
error: unpacking of archive failed on file /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;62b2f492: cpio: open
ufdio:       6 reads,   793160 total bytes in 0.000589 secs
error: glibc-locales-6:2.35.0.6.491f2e-alt1.x86_64: install failed

Убеждаемся, что /usr/share/locale/en_GB/LC_MESSAGES/libc.mo языко-независимый файл и соответственно будет установлен независимо от заданного %_install_langs:
 
[root@cf2717cdcd7d /]# rpm -q --qf='[%{FILENAMES}:%{FILELANGS}\n]' -p  ~/glibc-locales_6%3a2.35.0.6.491f2e-alt1%3asisyphus+295115.100.1.1\@1644420165_x86%5f64.rpm | awk -F":" '{if (length($2) <= 0 && substr($1, length($1) - 2) == ".mo") print $1}'
/usr/share/locale/en_GB/LC_MESSAGES/libc.mo


Данный список генерируется %find_lang во время сборки пакета:
[builder@localhost glibc-2.35.0.6.491f2e-alt1]$ cat libc.lang
%defattr(644,root,root,755)
%lang(zh) /usr/share/locale/zh_CN/LC_MESSAGES/libc.mo
...
%lang(eo) /usr/share/locale/eo/LC_MESSAGES/libc.mo
/usr/share/locale/en_GB/LC_MESSAGES/libc.mo


lang(en) выседичивается find-lang'ом:

https://git.altlinux.org/gears/r/rpm-build.git?p=rpm-build.git;a=blob;f=scripts/find-lang.in;h=2699a1817ac03d1f850fb78dc7afa9af49b2eb24;hb=HEAD#l191

с очень давних пор:
https://git.altlinux.org/gears/r/rpm-build.git?p=rpm-build.git;a=commit;h=b0a478061a959c977d3cc87062363e5b14d9e0b4

Наверное, en_* i18n должна быть доступна всегда?

Если это так, то и весь путь к устанавливаемой en_* i18n должен маркироваться как языко-независимый, в противном случае, приходится создавать все требуемые директории вручную в зависимости от устанавливаемого приложения.

Пример некорректной(?) генерации для glibc-locales:
%lang(en_GB) %dir /usr/share/locale/en_GB
%lang(en_GB) %dir /usr/share/locale/en_GB/LC_MESSAGES
%lang(en_GB) %dir /usr/share/locale/en_GB/LC_TIME