On Wed, Mar 19, 2008 at 02:12:37AM +0300, Dmitry V. Levin wrote: > On Wed, Mar 19, 2008 at 01:58:50AM +0300, Alexey Tourbin wrote: > > У меня перестал собираться перл, не может вычислить некоторые константы > > для ioctl в сгенерированном сишном коде. > Это багрепорт на свежий glibc-kernheaders. По привычке пишу в список, хотя в данном случае, наверное, следовало бы в багзиллу. > > $ cat /tmp/.private/at/bhap6ejYVA.c > > #include > > #include > > int main() { > > printf("TCGETS %ld\n", (long)(TCGETS)); > > printf("TCGETS2 %ld\n", (long)(TCGETS2)); > > return 0; > > } > > TCGETS2 раньше не было. Это я сделал генерат сишного кода для целочисленных констант, который заменяет старый генератор перлового кода h2ph, который вообще ужас что генерировал. На высоком уровне это выглядит очень просто: gen_h2ph( include => "sys/ioctl.h", regexp => qr/^FIO|^TC|^TIO|^SIO/, output => "ioctl.ph", ); Он работает в два прохода: сначала выгребает константы через 'cpp -dD', а потом генерирует сишную программу, которая печатает эти константы. Примерно вот такая идея: $ cpp -dD - <<<'#include ' |sed -n '/^#define TC/p' #define TCGETS 0x5401 #define TCSETS 0x5402 #define TCSETSW 0x5403 #define TCSETSF 0x5404 #define TCGETA 0x5405 #define TCSETA 0x5406 #define TCSETAW 0x5407 #define TCSETAF 0x5408 #define TCSBRK 0x5409 #define TCXONC 0x540A #define TCFLSH 0x540B #define TCSBRKP 0x5425 #define TCGETS2 _IOR('T',0x2A, struct termios2) #define TCSETS2 _IOW('T',0x2B, struct termios2) #define TCSETSW2 _IOW('T',0x2C, struct termios2) #define TCSETSF2 _IOW('T',0x2D, struct termios2) $ Соответственно мы считаем что все ^TC константы должны раскрываться в целочисленное значение на стадии компиляции сишного генерата. Это позволяет создать абсолютно корректный файл /usr/lib/perl5/*/ioctl.ph без крамольной конвертации сишных хедеров в перловый код.