publican-4.3.2-alt3_9 у меня на e2k вылетает при сборке docs-alt-workstation: make: Entering directory `/usr/src/RPM/BUILD/docs-alt-workstation-8.2-alt3' publican build --config publican.cfg --brand_dir ru-RU/Common_Content/altlinux-brand --langs ru-RU --formats html-single --publish && touch tmp/ru-RU/html-single publican only accepts one action you supplied '10': build & --config & publican.cfg & --brand_dir & ru-RU/Common_Content/altlinux-brand & --langs & ru-RU & --formats & html-single & --publish at /usr/bin/publican line 396. make: *** [tmp/ru-RU/html-single] Error 2 ...при этом publican-4.3.2-alt3_11 на сизифе не видит никаких проблем с аргументами (помнится, аналогично обстояло в сентябре и вроде бы в мае тоже). От обычного вызова строка выше отличается "--brand_dir " вместо "--brand_dir=" -- на аэродинамику не влияет. Проблема воспроизводится и автономно на самом publican: x86_64$ $ publican build --help build Transform XML to other formats (pdf, html, html-single, drupal-book, etc) [...] e2k$ publican build --help publican only accepts one action you supplied '2': build & --help at /usr/bin/publican line 396.
Один добрый человек взялся посмотреть; пока докопались до того, что в Getopt::Long не матчится регэксп в utf8, что попытались объехать добавлением utf8::encode $_ for @ARGV; перед GetOptions( \%opts, @optns, ) в /usr/bin/publican, после чего текущая картинка сдвинулась в сторону FATAL ERROR: ru-RU/Book_Info.xml: No such file or directory at /usr/lib64/perl5/XML/Parser/Expat.pm line 466. at /usr/bin/publican line 1010. -- т.е. по крайней мере опции были разобраны верно. Начали с вставки между GetOptions и croak в /usr/bin/publican: use Data::Dumper; $Data::Dumper::Sortkeys=1; warn Dumper \%opts, \@optns; и заметили разницу между e2k и x86: http://paste.org.ru/?jf1356 Дальше дошли до отладки Long.pm (похаченая версия из hasher chroot прилагается вместе с diff), в итоге текущее предположение -- надо проверить на perl, собранном с -O0, вдруг это miscompilation (но тогда он происходит и на lcc-1.21.24, и на lcc-1.23.12 с одинаковым эффектом, это проверил). Проверка -- попыткой пересборки docs-alt-workstation-8.2-alt3.src.rpm (можно брать сизифный пакет).
Created attachment 7922 [details] publican.diff "как есть"
Created attachment 7923 [details] модифицированный /usr/bin/publican (изначально из publican-4.3.2-alt3_9)
Created attachment 7924 [details] Long.pm.diff "как есть"
Created attachment 7925 [details] модифицированный /usr/share/perl5/Getopt/Long.pm (изначально из perl-base-5.26.2-alt3) Т.е. объезд совсем исходной проблемы в добуквенной формулировке найден (--help отрабатывает штатно), но сборка документации всё-таки валится.
PS: ещё приборы и материалы: http://paste.org.ru/?z0np29 -- тест, отрабатывает одинаково на e2k/x86; http://paste.org.ru/?nmggwk -- publican debug на e2k, не разобрал опции; http://paste.org.ru/?hccr38 -- publican debug на x86, _разобрал_ опции; http://paste.org.ru/?mpfzl2 -- Match failed; http://paste.org.ru/?xr3pn6 -- Match failed (в чруте, собранном lcc-1.23); http://paste.org.ru/?5q5t08 -- utf8::encode $_ for @ARGV; и Match successful!.
можно еще попробовать собирать с LANG=C, тогда @ARGV не должен быть заюникоденным... хотя use Encode в начале всеравно смущает
Created attachment 8165 [details] воспроизводилка проблемы Получили воспроизведение проблемы (5.26.2, собранный 1.23.12): $ LANG=POSIX perl repro.pl --config фыв $VAR1 = [ "--config", "\321\204\321\213\320\262" ]; --config: 1 фыв: 0 $VAR1 = {}; $VAR2 = [ "config=s" ]; _Без_ upgrade получаем разобранные опции.
Created attachment 8166 [details] суженная воспроизводилка В случае юникодности .* обламывается на втором символе при наличии /s: $ perl repro2.pl a 1 1 1 $ perl repro2.pl aa 1 1 0 $ perl repro2.pl aaa 1 1 0 $ _
use re 'debug'; показал, что проблема в SANY смотрим код regexec.c: case SANY: if (utf8_target) { while (scan < loceol && hardcount < max) { scan += UTF8SKIP(scan); hardcount++; } } else scan = loceol; break; возможность проблемы в UTF8SKIP utf8.h: #ifdef DOINIT EXTCONST unsigned char PL_utf8skip[] = { /* 0x00 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */ [...] #else EXTCONST unsigned char PL_utf8skip[]; #endif Гипотеза: на эльбрусе при сборке не выставлен DOINIT
(В ответ на комментарий №10) > Гипотеза: на эльбрусе при сборке не выставлен DOINIT Да, не выставлен в config.h!
(In reply to comment #11) > (В ответ на комментарий №10) > > Гипотеза: на эльбрусе при сборке не выставлен DOINIT > Да, не выставлен в config.h! DOINIT выставляется в INTERN.h а если выбирается EXTERN.h, то нужен внешний сгенерированный файл
Было подозрение на массив PL_utf8skip в плане различной инициализации на e2k и x86_64 -- не подтвердилось, таблица одинаково верно заполнена и там, и там: $ objdump -s -j .rodata globals.o [...] 0400 01010101 01010101 01010101 01010101 ................ 0410 01010101 01010101 01010101 01010101 ................ 0420 01010101 01010101 01010101 01010101 ................ 0430 01010101 01010101 01010101 01010101 ................ 0440 01010101 01010101 01010101 01010101 ................ 0450 01010101 01010101 01010101 01010101 ................ 0460 01010101 01010101 01010101 01010101 ................ 0470 01010101 01010101 01010101 01010101 ................ 0480 01010101 01010101 01010101 01010101 ................ 0490 01010101 01010101 01010101 01010101 ................ 04a0 01010101 01010101 01010101 01010101 ................ 04b0 01010101 01010101 01010101 01010101 ................ 04c0 02020202 02020202 02020202 02020202 ................ 04d0 02020202 02020202 02020202 02020202 ................ 04e0 03030303 03030303 03030303 03030303 ................ 04f0 04040404 04040404 05050505 0606070d ................ [...]
В общем, publican собирается perl, собранным с вот таким патчиком на спек: make +%ifarch %e2k +# http://bugzilla.altlinux.org/35523 workaround +rm -f regexec.o libperl-%ver.so ext/re/re_exec.o +make OPTIMIZE+='%optflags -O1' regexec.o +make libperl-%ver.so +make -C ext/re OPTIMIZE+='%optflags -O1' re_exec.o +make -C ext/re all +%endif + %check ...и дальше собирает, скажем, docs-alt-workstation. Похоже, это в силе как минимум для lcc 1.23.12 и 1.21.24. Игорь, Андрей, спасибо!
Created attachment 8167 [details] perl.spec: ALT #35523 workaround (-O1 for regexec, re_exec)
(In reply to comment #15) > Created an attachment (id=8167) [details] > perl.spec: ALT #35523 workaround (-O1 for regexec, re_exec) приложил.
Спасибо!