ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] I: perl.req vs BEGIN
@ 2008-08-15 12:00 Alexey Gladkov
  2008-08-15 12:12 ` Alexey Tourbin
  2008-08-18  7:01 ` Stanislav Ievlev
  0 siblings, 2 replies; 10+ messages in thread
From: Alexey Gladkov @ 2008-08-15 12:00 UTC (permalink / raw)
  To: ALT Devel discussion list

Приветствую!

Пишу сюда, чтобы разметить возможную граблю. Нарвался тут при сборке
пакета с такой ошибкой:

/usr/lib/groff/groffer is not an existing directory; at /tmp/groff-buildroot/usr/bin/groffer line 145.
BEGIN failed--compilation aborted at /tmp/groff-buildroot/usr/bin/groffer line 167.
# perl(func.pl) at line 157 (depth 5) not loaded at BEGIN SKIP
# perl(man.pl) at line 158 (depth 5) not loaded at BEGIN SKIP
/tmp/groff-buildroot/usr/bin/groffer: deparse failed. isPerl=0.0409154403404476.
find-requires: ERROR: /usr/lib/rpm/perl.req failed

Ошибка несколько интересная. Смотрим в код утилиты groffer:

BEGIN {
...
    die "$groffer_libdir is not an existing directory;"
      unless -d $groffer_libdir;

    unshift(@INC, $groffer_libdir);
...
    require 'func.pl';
    require 'man.pl';
...
}

Как видно во время проверки зависимостей реально отработал код скрипта и
разумеется вышел с ошибкой, и этим завалил сборку пакета.

После консультаций с at@, выяснилось, что блок BEGIN отрабатывает в perl
*всегда*... даже при syntax check.

Таким образом, хочу предостеречь всех кто пакует перловые скрипты: если 
у вас в скрипте есть блок BEGIN, то будьте готовы, что он выполнится нашим 
rpm во время сборки.

Как варианты обхода:
1) Заменить BEGIN на обычный блок (если в нём есть проверки, как
   в моём случае).
2) Отключить поиск зависимостей в перл скриптах :)

-- 
Rgrds, legion



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 12:00 [devel] I: perl.req vs BEGIN Alexey Gladkov
@ 2008-08-15 12:12 ` Alexey Tourbin
  2008-08-15 12:26   ` Alexey Gladkov
  2008-08-18  7:01 ` Stanislav Ievlev
  1 sibling, 1 reply; 10+ messages in thread
From: Alexey Tourbin @ 2008-08-15 12:12 UTC (permalink / raw)
  To: ALT Devel discussion list

[-- Attachment #1: Type: text/plain, Size: 2955 bytes --]

On Fri, Aug 15, 2008 at 04:00:14PM +0400, Alexey Gladkov wrote:
> Пишу сюда, чтобы разметить возможную 
> граблю. Нарвался тут при сборке
> пакета с такой ошибкой:
> 
> /usr/lib/groff/groffer is not an existing directory; at 
> /tmp/groff-buildroot/usr/bin/groffer line 145.
> BEGIN failed--compilation aborted at /tmp/groff-buildroot/usr/bin/groffer 
> line 167.
> # perl(func.pl) at line 157 (depth 5) not loaded at BEGIN SKIP
> # perl(man.pl) at line 158 (depth 5) not loaded at BEGIN SKIP
> /tmp/groff-buildroot/usr/bin/groffer: deparse failed. 
> isPerl=0.0409154403404476.
> find-requires: ERROR: /usr/lib/rpm/perl.req failed
> 
> Ошибка несколько интересная. Смотрим в 
> код утилиты groffer:
> 
> BEGIN {
> ...
>    die "$groffer_libdir is not an existing directory;"
>      unless -d $groffer_libdir;
> 
>    unshift(@INC, $groffer_libdir);
> ...
>    require 'func.pl';
>    require 'man.pl';
> ...
> }
> 
> Как видно во время проверки зависимостей 
> реально отработал код скрипта и
> разумеется вышел с ошибкой, и этим 
> завалил сборку пакета.
> 
> После консультаций с at@, выяснилось, что 
> блок BEGIN отрабатывает в perl
> *всегда*... даже при syntax check.

Блок BEGIN выполняется всегда и ASAP (прямо во время чтения кода),
потому что одно из его назначений -- повлиять на синтаксис последующего
кода.  Например, в перле можно вызывать функции без скобок.  Для этого
до того, как прел начал парсить вызов функции без скобок, он уже должен
знать, какие названия функций существуют.

Директива "use" импортирует названия функций на стадии BEGIN.

$ perl -e 'use Carp qw(croak); croak "oh my"'                 
oh my at -e line 1
$

Вызов без скобок возможен только за счёт того, что когда перл парсил
croak, то он уже знал, что существует такая функция croak (которая была
импортирована с помощью use), и поэтому он "понял", что это на самом
деле вызов функции.

$ perl -e 'require Carp; Carp->import("croak"); croak "oh my"' 
String found where operator expected at -e line 1, near "croak "oh my""
        (Do you need to predeclare croak?)
syntax error at -e line 1, near "croak "oh my""
Execution of -e aborted due to compilation errors.
$ perl -e 'require Carp; Carp->import("croak"); croak("oh my")'
oh my at -e line 1
$ 

> Таким образом, хочу предостеречь всех 
> кто пакует перловые скрипты: если у вас в 
> скрипте есть блок BEGIN, то будьте готовы, 
> что он выполнится нашим rpm во время 
> сборки.
> 
> Как варианты обхода:
> 1) Заменить BEGIN на обычный блок (если в нём 
> есть проверки, как
>   в моём случае).
> 2) Отключить поиск зависимостей в перл 
> скриптах :)

Обычно не следует выполнять прикладной код в BEGIN.
BEGIN зарезервирован для всяких хитрых штук.

Одна из таких хитрых штук называется use.
Согласно 'perldoc -f use', выражение
	use Module LIST;
полностью эквивалентно
	BEGIN { require Module; Module->import( LIST ); }

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 12:12 ` Alexey Tourbin
@ 2008-08-15 12:26   ` Alexey Gladkov
  2008-08-15 12:32     ` Alexey Tourbin
  2008-08-15 13:08     ` Alexey I. Froloff
  0 siblings, 2 replies; 10+ messages in thread
From: Alexey Gladkov @ 2008-08-15 12:26 UTC (permalink / raw)
  To: ALT Linux Team development discussions

Alexey Tourbin wrote:
> Обычно не следует выполнять прикладной код в BEGIN.
> BEGIN зарезервирован для всяких хитрых штук.

То что грабля(с точки зрения запаковщика rpm пакета) имеет красивую 
ручку, не делает её удар менее болезненным.

В моём случае, этот скрипт при обычном исполнении нормально работает, 
а при запаковке умирает с криками.

Я не знал про такие тонкости в обработке BEGIN, как и автор скрипта. 
Поэтому я решил предупредить, если кто ещё не знает.

-- 
Rgrds, legion



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 12:26   ` Alexey Gladkov
@ 2008-08-15 12:32     ` Alexey Tourbin
  2008-08-15 13:08     ` Alexey I. Froloff
  1 sibling, 0 replies; 10+ messages in thread
From: Alexey Tourbin @ 2008-08-15 12:32 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 1075 bytes --]

On Fri, Aug 15, 2008 at 04:26:13PM +0400, Alexey Gladkov wrote:
> Alexey Tourbin wrote:
> >Обычно не следует выполнять прикладной 
> >код в BEGIN.
> >BEGIN зарезервирован для всяких хитрых 
> >штук.
> 
> То что грабля(с точки зрения запаковщика 
> rpm пакета) имеет красивую ручку, не делает 
> её удар менее болезненным.
> 
> В моём случае, этот скрипт при обычном 
> исполнении нормально работает, а при 
> запаковке умирает с криками.

Запаковка сводится к syntax check (syntax check строит дерево байткода,
но не исполняет его, кроме блоков BEGIN; perl.req потом вклинивается
в самом конце и ищет байткоды, которые означают загрузку модулей).

Корень проблемы в том, что файлы лежат в RPM_BUILD_ROOT, а не там,
где они будут лежать после установки пакета.  Но это не единственная
проблема такого рода.  Например, RPATH, зашитиый в бинарик, может дать
неправильный результат, потому что игнорирует RPM_BUILD_ROOT.

> Я не знал про такие тонкости в обработке 
> BEGIN, как и автор скрипта. Поэтому я решил 
> предупредить, если кто ещё не знает.

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 12:26   ` Alexey Gladkov
  2008-08-15 12:32     ` Alexey Tourbin
@ 2008-08-15 13:08     ` Alexey I. Froloff
  2008-08-15 13:17       ` Alexey Gladkov
  1 sibling, 1 reply; 10+ messages in thread
From: Alexey I. Froloff @ 2008-08-15 13:08 UTC (permalink / raw)
  To: ALT Devel discussion list

[-- Attachment #1: Type: text/plain, Size: 357 bytes --]

* Alexey Gladkov <legion@> [080815 16:37]:
> В моём случае, этот скрипт при обычном исполнении нормально
> работает, а при запаковке умирает с криками.
Думается мне, что подобные "перестраховки" с проверкой наличия
каталога надо отрывать.  Это "защита от дурака" при запуске на
любой системе, но у нас система не "любая".

-- 
Regards,
Sir Raorn.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 13:08     ` Alexey I. Froloff
@ 2008-08-15 13:17       ` Alexey Gladkov
  2008-08-15 13:33         ` Led
  0 siblings, 1 reply; 10+ messages in thread
From: Alexey Gladkov @ 2008-08-15 13:17 UTC (permalink / raw)
  To: ALT Linux Team development discussions

Alexey I. Froloff wrote:
> Думается мне, что подобные "перестраховки" с проверкой наличия
> каталога надо отрывать.  Это "защита от дурака" при запуске на
> любой системе, но у нас система не "любая".

Эта "перестраховка" совершенно не причём. Она только выявила проблему. 
Даже без "перестраховки" скрипт вывалился на require.

-- 
Rgrds, legion



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 13:17       ` Alexey Gladkov
@ 2008-08-15 13:33         ` Led
  2008-08-15 13:42           ` Alexey Gladkov
  0 siblings, 1 reply; 10+ messages in thread
From: Led @ 2008-08-15 13:33 UTC (permalink / raw)
  To: ALT Linux Team development discussions

В сообщении от Friday 15 August 2008 16:17:11 Alexey Gladkov написал(а):
> Alexey I. Froloff wrote:
> > Думается мне, что подобные "перестраховки" с проверкой наличия
> > каталога надо отрывать.  Это "защита от дурака" при запуске на
> > любой системе, но у нас система не "любая".
>
> Эта "перестраховка" совершенно не причём. Она только выявила проблему.

ИМХО она выявила проблему в скрипте, а не в проверке.

> Даже без "перестраховки" скрипт вывалился на require.

-- 
Led

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 13:33         ` Led
@ 2008-08-15 13:42           ` Alexey Gladkov
  2008-08-15 13:51             ` Led
  0 siblings, 1 reply; 10+ messages in thread
From: Alexey Gladkov @ 2008-08-15 13:42 UTC (permalink / raw)
  To: ALT Linux Team development discussions

Led wrote:
> ИМХО она выявила проблему в скрипте, а не в проверке.

Вы дочитали моё первое письмо до конца? Я не говорил ничего про то что 
нужно исправлять проверку. Моя цель обратить внимание тех, кто не знал 
про BEGIN.

-- 
Rgrds, legion



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 13:42           ` Alexey Gladkov
@ 2008-08-15 13:51             ` Led
  0 siblings, 0 replies; 10+ messages in thread
From: Led @ 2008-08-15 13:51 UTC (permalink / raw)
  To: ALT Linux Team development discussions

В сообщении от Friday 15 August 2008 16:42:09 Alexey Gladkov написал(а):
> Led wrote:
> > ИМХО она выявила проблему в скрипте, а не в проверке.
>
> Вы дочитали моё первое письмо до конца? Я не говорил ничего про то что
> нужно исправлять проверку. Моя цель обратить внимание тех, кто не знал
> про BEGIN.

А я не говорил, что вы говорили, что нужно исправлять проверку:)

-- 
Led

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [devel] I: perl.req vs BEGIN
  2008-08-15 12:00 [devel] I: perl.req vs BEGIN Alexey Gladkov
  2008-08-15 12:12 ` Alexey Tourbin
@ 2008-08-18  7:01 ` Stanislav Ievlev
  1 sibling, 0 replies; 10+ messages in thread
From: Stanislav Ievlev @ 2008-08-18  7:01 UTC (permalink / raw)
  To: ALT Linux Team development discussions

On Fri, Aug 15, 2008 at 04:00:14PM +0400, Alexey Gladkov wrote:
> После консультаций с at@, выяснилось, что 
> блок BEGIN отрабатывает в perl
> *всегда*... даже при syntax check.
> 
> Таким образом, хочу предостеречь всех 
> кто пакует перловые скрипты: если у вас в 
> скрипте есть блок BEGIN, то будьте готовы, 
> что он выполнится нашим rpm во время 
> сборки.
Хороший способ сделать трояна ;)



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2008-08-18  7:01 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-08-15 12:00 [devel] I: perl.req vs BEGIN Alexey Gladkov
2008-08-15 12:12 ` Alexey Tourbin
2008-08-15 12:26   ` Alexey Gladkov
2008-08-15 12:32     ` Alexey Tourbin
2008-08-15 13:08     ` Alexey I. Froloff
2008-08-15 13:17       ` Alexey Gladkov
2008-08-15 13:33         ` Led
2008-08-15 13:42           ` Alexey Gladkov
2008-08-15 13:51             ` Led
2008-08-18  7:01 ` Stanislav Ievlev

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git