[sisyphus] Re: rpm --bb ./specfile не пашет

Vladimir Lettiev =?iso-8859-1?q?crux_=CE=C1_syktsu=2Eru?=
Пн Май 17 08:00:18 MSD 2004


Dmitry V. Levin пишет:
>>>>>>$rpm -bb ./samba.spec
>>>>>>./samba.spec: No such file or directory 
>>>>>
>>>>>rpm-build не установлен
>>>>
>>>>В конце концов надо что-нибудь тяжёлое повесить на rpm, чтобы
>>>>он это не писал. А писал что-нибудь вразумительное.
>>>
>>>Да висит уже давно,
>>>http://bugzilla.altlinux.ru/show_bug.cgi?id=1928
>>>Вот бы исправил тот, кому это действительно мешает.
>>>А то так и будет висеть.
>>
>>А тебя так и будут долбать.  И вешать дубли.  И тратить на все
>>это кучу времени...
> 
> Ничего страшного.
> 
>>Кто может исправить -- тот в курсе и ему непосредственно не
>>мешает.  А мешает тем, кто не в курсе и, как правило, не будет
>>копать, но в лучшем случае спросит.
> 
> Это не исправляется за 5 минут, а больше у меня на это нет.
> 

Да, действительно, дело не 5 минут... Но может коллективными усилиями 
что-то можно сделать? Я вот пробовал копаться, но понял, что мне это не 
под силам (в условиях ограниченного времени и знаний С). Но у меня есть 
кое-что, что могу рассказать по проблеме. Может кого-нибудь это наведёт 
на правильное решение?

1. Сообщение "No such file or directory", судя по strace, относится к 
/usr/lib/rpm/rpmb, который rpm пытается запустить, обнаружив параметр 
'-bb', но т.к. этот бинарник лежит в пакете rpm-build, то...
В исходниках rpm я не нашёл место, где происходит этот самый execve, но 
если найти, то это может прояснить ситуацию...

2. Участок кода, который выдаёт такое странное сообщение, находится в 
rpmqv.c, строки 602-607 (rpm-4.0.4-alt37):
    if (arg < -1) {
         fprintf(stderr, "%s: %s\n",
                 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
                 poptStrerror(arg));
         exit(EXIT_FAILURE);
     }

Переменная arg получает своё значение из цикла (строка 451) :
while ((arg = poptGetNextOpt(optCon)) > 0) {
..
}

Функции popt* идут из пакета libpopt и возможно ошибка даже не в rpm, а 
этом самом libpopt... Это надо ракапывать.


Если вставить такой код (я не проверял, пишу на вскидку):

    if (arg < -1) {
	if (!strcmp(poptStrerror(arg), "No such file or directory")) {
	        fprintf(stderr, "error: rpm-build not installed\n");
	} else {
	        fprintf(stderr, "%s: %s\n",
         	        poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
                 	poptStrerror(arg));
	}
         exit(EXIT_FAILURE);
     }

То по идее будет писать "error: rpm-build not installed", т.к. сообщение 
"No such file directory" уникально и в базе libpopt такого не 
предусмотрено (т.е. срабатывать будет только при отсутствии rpmb). Но 
это workaround в стиле "костыль" :)

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

-- 
С уважением, Владимир Леттиев aka crux <crux на syktsu.ru>



Подробная информация о списке рассылки Sisyphus