[devel] что делать с h2ph (perl-1:5.8.8-alt4: rebuild failed)

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пн Окт 9 00:44:03 MSD 2006


On Mon, Oct 09, 2006 at 12:02:38AM +0400, Dmitry V. Levin wrote:
> On Sun, Oct 08, 2006 at 11:43:24PM +0400, Alexey Tourbin wrote:
> > On Wed, Oct 04, 2006 at 10:11:57PM +0400, QA Team Robot wrote:
> > > syntax error at /usr/src/tmp/perl-buildroot/usr/lib/perl5/i386-linux/bits/syslog.ph line 9, near ", ..."
> > > # /usr/src/tmp/perl-buildroot/usr/lib/perl5/i386-linux/bits/syslog.ph: deparse failed, trying to recover with -Mbits
> > 
> > h2ph не понимает макросов с перменным списокм аргументов, а с
> > FORTIFY_SOURCE теперь в /usr/include/bits/syslog.h вижу:
> > 
> >     25	extern void __syslog_chk (int __pri, int __flag, __const char *__fmt, ...)
> >     26	     __attribute__ ((__format__ (__printf__, 3, 4)));
> >     27	
> >     28	#define syslog(pri, ...) \
> >     29	  __syslog_chk (pri, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
> > 
> > Научить h2ph понимать такие макросы мне слабо.  Впрочем он и так такие
> > простыни на свет производит, что спасать мне его и не хочется.  В общем
> > во время фриза непонятно что со всем этим делать.  Удалю-ка я все эти
> > *.ph и будь что будет.
> 
> А зачем эти *.ph нужны?  Что делают другие перловоды?

Они нужны для очень старого софта, за одним маленьким исключением.

h2ph пытается распарсить *.h файлы и представить их в эквивалентном
перловом синтаксисе, чтобы были доступны константы из enum и define.
Это константы типа LOG_* из sys/syslog.h и A[PF]_ из sys/socket.h.
При более современном подходе эти константы компилируются вместе с
функциями-обертками (в *.so файлах).  Так, в perl-base есть модули
Sys::Syslog и Socket.  Можно создать фиктивные *.ph файлы и все эти
констант импортировать из модулей.

(Константы это функции с пустым прототипом; в некоторых случаях перл
умеет такие константы "инлайнить", избегая собственно вызова функции.)

h2ph плох тем что там не GLR parser какой-нибудь а чисто детский лепет
на уровне if (/^#\s*define\s*(\w+)) или if (/^enum\s*{/).  И там уже и
так хак на хаке сидит.

Маленькое исключение о котором я сказал это номера системных вызовов.
В перле есть встроенная функция syscall -- обертка к либсишно-ядерному
вызову, она в качестве первого аргумента берет номер системного вызова,
а calling conventions там как раз до некоторой степени учитываются.
Всё ещё распространена практика, хотя и не сильно, добираться до
некоторых не очень хорошо портируемых системных вызовов за счет syscall.
См. например perl-MDK-Common.  Ну на пальцах

	require 'sys/syscall.ph'; # номера вызовов &SYS_*
	sub sync {
		return syscall(&SYS_sync) == 0;
	}

Я попробовал сделать syscall.ph в обход h2ph за счет "cpp -dM" и
последующего cpp уже без -dM.  В случае с syscall.ph это ёщё работает
(см. аттач), хотя уже видно, что cpp не полностью проводит eval'юацию
выражений и из-за этого могут быть проблемы.

sub SYS_chroot () { 61 }
sub SYS_clock_getres () { (259 +7) }

Случай с syscall.ph не единственный.  В перле есть ещё встроенная
функция ioctl(), а со вторым его аргументом такая же история, как с
первым аргументом у syscall.  То есть предполагается, что ты сделаешь
ioctl.ph и сможешь взять оттуда номера запросов.  Но ioctl.ph сделать
столь же простым макаром уже не удается, там появляются выражения типа

sub TIOCGPTN () { (((2U) << (((0 +8)+8)+14)) | ((('T')) << (0 +8)) | (((0x30)) << 0) | (((sizeof(unsigned int))) << ((0 +8)+8))) }

которые перл вычислить уже не может.  Значит идея с cpp -dM в случае с
ioctl.ph накрывается медным тазом.  То есть становится ясно, что подход
опять же ненадежный.

В дистре ioctl.ph и syscall.ph должны быть.  Насчет остального можно
покрутить пальцем у виска, а это пока нет.

Если на перле не понтяно что я там делаю тогда вот скетч на шелле

$ cpp -dM -include sys/syscall.h </dev/null |grep -Poh '\bSYS_\w+' |head
SYS_statfs
SYS_getuid32
SYS_ftruncate
SYS_time
SYS_sendfile
SYS_rt_sigpending
SYS_getuid
SYS_umount
SYS_get_mempolicy
SYS_fstatat64
$ cpp -dM -include sys/syscall.h </dev/null |grep -Poh '\bSYS_\w+' |awk '{print "PERL__"$1"\t"$1}' |head
PERL__SYS_statfs        SYS_statfs
PERL__SYS_getuid32      SYS_getuid32
PERL__SYS_ftruncate     SYS_ftruncate
PERL__SYS_time  SYS_time
PERL__SYS_sendfile      SYS_sendfile
PERL__SYS_rt_sigpending SYS_rt_sigpending
PERL__SYS_getuid        SYS_getuid
PERL__SYS_umount        SYS_umount
PERL__SYS_get_mempolicy SYS_get_mempolicy
PERL__SYS_fstatat64     SYS_fstatat64
$ cpp -dM -include sys/syscall.h </dev/null |grep -Poh '\bSYS_\w+' |awk '{print "PERL__"$1"\t"$1}' |cpp -include sys/syscall.h - |grep ^PERL__ |head
PERL__SYS_statfs 99
PERL__SYS_getuid32 199
PERL__SYS_ftruncate 93
PERL__SYS_time 13
PERL__SYS_sendfile 187
PERL__SYS_rt_sigpending 176
PERL__SYS_getuid 24
PERL__SYS_umount 22
PERL__SYS_get_mempolicy 275
PERL__SYS_fstatat64 300
$
----------- следующая часть -----------
#!perl
use strict;
use Config;
use File::Temp;

my $SYS_re = qr/\bSYS_\w+|\bNR_syscalls\b/;
my @SYS_names;
{
    my $tmp = File::Temp->new;
    print $tmp "#include <sys/syscall.h>\n";
    my $cmd = "$Config{cpp} -dM $Config{cppflags} $tmp";
    open my $pipe, "$cmd |" or die "failed: $cmd";
    local $_;
    while (<$pipe>) {
	next unless s/^\s*#\s*define\s+//;
	my ($sym) = split;
	next unless $sym =~ $SYS_re;
	push @SYS_names, $sym;
    }
    close $pipe or die "failed: $cmd";
}

die "No $SYS_re names in <sys/syscall.h>"
    unless @SYS_names;

my $SYS_prefix = "PERL_syscall__";
my %SYS_kv;
{
    my $tmp = File::Temp->new;
    print $tmp "#include <sys/syscall.h>\n";
    for (@SYS_names) {
	print $tmp "$SYS_prefix$_ $_\n";
    }
    my $cmd = "$Config{cpp} $Config{cppflags} $tmp";
    open my $pipe, "$cmd |" or die "failed: $cmd";
    local $_;
    while (<$pipe>) {
	next unless s/^$SYS_prefix//;
	/^($SYS_re)\s+(\S.*)/ or die "bad cpp output: $_\n";
	$SYS_kv{$1} = $2;
    }
    close $pipe or die "failed: $cmd";
}

die "No $SYS_re names in <sys/syscall.h>"
    unless %SYS_kv;

unlink "sys_syscall.ph";
open my $fh, ">sys_syscall.ph" or die "Cannot open sys_syscall.ph: $!";
print $fh "# Automatically generated, do not edit.\n";
print $fh "use strict;\n";
for my $k (sort keys %SYS_kv) {
    my $v = $SYS_kv{$k};
    print $fh "sub $k () { $v }\n";
}
print $fh "1;\n";
close $fh or die "Cannot close sys_syscall.ph: $!";
require "./sys_syscall.ph";
----------- следующая часть -----------
# Automatically generated, do not edit.
use strict;
sub NR_syscalls () { 317 }
sub SYS__llseek () { 140 }
sub SYS__newselect () { 142 }
sub SYS__sysctl () { 149 }
sub SYS_access () { 33 }
sub SYS_acct () { 51 }
sub SYS_add_key () { 286 }
sub SYS_adjtimex () { 124 }
sub SYS_afs_syscall () { 137 }
sub SYS_alarm () { 27 }
sub SYS_bdflush () { 134 }
sub SYS_break () { 17 }
sub SYS_brk () { 45 }
sub SYS_capget () { 184 }
sub SYS_capset () { 185 }
sub SYS_chdir () { 12 }
sub SYS_chmod () { 15 }
sub SYS_chown () { 182 }
sub SYS_chown32 () { 212 }
sub SYS_chroot () { 61 }
sub SYS_clock_getres () { (259 +7) }
sub SYS_clock_gettime () { (259 +6) }
sub SYS_clock_nanosleep () { (259 +8) }
sub SYS_clock_settime () { (259 +5) }
sub SYS_clone () { 120 }
sub SYS_close () { 6 }
sub SYS_creat () { 8 }
sub SYS_create_module () { 127 }
sub SYS_delete_module () { 129 }
sub SYS_dup () { 41 }
sub SYS_dup2 () { 63 }
sub SYS_epoll_create () { 254 }
sub SYS_epoll_ctl () { 255 }
sub SYS_epoll_wait () { 256 }
sub SYS_execve () { 11 }
sub SYS_exit () { 1 }
sub SYS_exit_group () { 252 }
sub SYS_faccessat () { 307 }
sub SYS_fadvise64 () { 250 }
sub SYS_fadvise64_64 () { 272 }
sub SYS_fchdir () { 133 }
sub SYS_fchmod () { 94 }
sub SYS_fchmodat () { 306 }
sub SYS_fchown () { 95 }
sub SYS_fchown32 () { 207 }
sub SYS_fchownat () { 298 }
sub SYS_fcntl () { 55 }
sub SYS_fcntl64 () { 221 }
sub SYS_fdatasync () { 148 }
sub SYS_fgetxattr () { 231 }
sub SYS_flistxattr () { 234 }
sub SYS_flock () { 143 }
sub SYS_fork () { 2 }
sub SYS_fremovexattr () { 237 }
sub SYS_fsetxattr () { 228 }
sub SYS_fstat () { 108 }
sub SYS_fstat64 () { 197 }
sub SYS_fstatat64 () { 300 }
sub SYS_fstatfs () { 100 }
sub SYS_fstatfs64 () { 269 }
sub SYS_fsync () { 118 }
sub SYS_ftime () { 35 }
sub SYS_ftruncate () { 93 }
sub SYS_ftruncate64 () { 194 }
sub SYS_futex () { 240 }
sub SYS_futimesat () { 299 }
sub SYS_get_kernel_syms () { 130 }
sub SYS_get_mempolicy () { 275 }
sub SYS_get_robust_list () { 312 }
sub SYS_get_thread_area () { 244 }
sub SYS_getcwd () { 183 }
sub SYS_getdents () { 141 }
sub SYS_getdents64 () { 220 }
sub SYS_getegid () { 50 }
sub SYS_getegid32 () { 202 }
sub SYS_geteuid () { 49 }
sub SYS_geteuid32 () { 201 }
sub SYS_getgid () { 47 }
sub SYS_getgid32 () { 200 }
sub SYS_getgroups () { 80 }
sub SYS_getgroups32 () { 205 }
sub SYS_getitimer () { 105 }
sub SYS_getpgid () { 132 }
sub SYS_getpgrp () { 65 }
sub SYS_getpid () { 20 }
sub SYS_getpmsg () { 188 }
sub SYS_getppid () { 64 }
sub SYS_getpriority () { 96 }
sub SYS_getresgid () { 171 }
sub SYS_getresgid32 () { 211 }
sub SYS_getresuid () { 165 }
sub SYS_getresuid32 () { 209 }
sub SYS_getrlimit () { 76 }
sub SYS_getrusage () { 77 }
sub SYS_getsid () { 147 }
sub SYS_gettid () { 224 }
sub SYS_gettimeofday () { 78 }
sub SYS_getuid () { 24 }
sub SYS_getuid32 () { 199 }
sub SYS_getxattr () { 229 }
sub SYS_gtty () { 32 }
sub SYS_idle () { 112 }
sub SYS_init_module () { 128 }
sub SYS_inotify_add_watch () { 292 }
sub SYS_inotify_init () { 291 }
sub SYS_inotify_rm_watch () { 293 }
sub SYS_io_cancel () { 249 }
sub SYS_io_destroy () { 246 }
sub SYS_io_getevents () { 247 }
sub SYS_io_setup () { 245 }
sub SYS_io_submit () { 248 }
sub SYS_ioctl () { 54 }
sub SYS_ioperm () { 101 }
sub SYS_iopl () { 110 }
sub SYS_ioprio_get () { 290 }
sub SYS_ioprio_set () { 289 }
sub SYS_ipc () { 117 }
sub SYS_kexec_load () { 283 }
sub SYS_keyctl () { 288 }
sub SYS_kill () { 37 }
sub SYS_lchown () { 16 }
sub SYS_lchown32 () { 198 }
sub SYS_lgetxattr () { 230 }
sub SYS_link () { 9 }
sub SYS_linkat () { 303 }
sub SYS_listxattr () { 232 }
sub SYS_llistxattr () { 233 }
sub SYS_lock () { 53 }
sub SYS_lookup_dcookie () { 253 }
sub SYS_lremovexattr () { 236 }
sub SYS_lseek () { 19 }
sub SYS_lsetxattr () { 227 }
sub SYS_lstat () { 107 }
sub SYS_lstat64 () { 196 }
sub SYS_madvise () { 219 }
sub SYS_madvise1 () { 219 }
sub SYS_mbind () { 274 }
sub SYS_migrate_pages () { 294 }
sub SYS_mincore () { 218 }
sub SYS_mkdir () { 39 }
sub SYS_mkdirat () { 296 }
sub SYS_mknod () { 14 }
sub SYS_mknodat () { 297 }
sub SYS_mlock () { 150 }
sub SYS_mlockall () { 152 }
sub SYS_mmap () { 90 }
sub SYS_mmap2 () { 192 }
sub SYS_modify_ldt () { 123 }
sub SYS_mount () { 21 }
sub SYS_mprotect () { 125 }
sub SYS_mpx () { 56 }
sub SYS_mq_getsetattr () { (277 +5) }
sub SYS_mq_notify () { (277 +4) }
sub SYS_mq_open () { 277 }
sub SYS_mq_timedreceive () { (277 +3) }
sub SYS_mq_timedsend () { (277 +2) }
sub SYS_mq_unlink () { (277 +1) }
sub SYS_mremap () { 163 }
sub SYS_msync () { 144 }
sub SYS_munlock () { 151 }
sub SYS_munlockall () { 153 }
sub SYS_munmap () { 91 }
sub SYS_nanosleep () { 162 }
sub SYS_nfsservctl () { 169 }
sub SYS_nice () { 34 }
sub SYS_oldfstat () { 28 }
sub SYS_oldlstat () { 84 }
sub SYS_oldolduname () { 59 }
sub SYS_oldstat () { 18 }
sub SYS_olduname () { 109 }
sub SYS_open () { 5 }
sub SYS_openat () { 295 }
sub SYS_pause () { 29 }
sub SYS_personality () { 136 }
sub SYS_pipe () { 42 }
sub SYS_pivot_root () { 217 }
sub SYS_poll () { 168 }
sub SYS_ppoll () { 309 }
sub SYS_prctl () { 172 }
sub SYS_pread64 () { 180 }
sub SYS_prof () { 44 }
sub SYS_profil () { 98 }
sub SYS_pselect6 () { 308 }
sub SYS_ptrace () { 26 }
sub SYS_putpmsg () { 189 }
sub SYS_pwrite64 () { 181 }
sub SYS_query_module () { 167 }
sub SYS_quotactl () { 131 }
sub SYS_read () { 3 }
sub SYS_readahead () { 225 }
sub SYS_readdir () { 89 }
sub SYS_readlink () { 85 }
sub SYS_readlinkat () { 305 }
sub SYS_readv () { 145 }
sub SYS_reboot () { 88 }
sub SYS_remap_file_pages () { 257 }
sub SYS_removexattr () { 235 }
sub SYS_rename () { 38 }
sub SYS_renameat () { 302 }
sub SYS_request_key () { 287 }
sub SYS_restart_syscall () { 0 }
sub SYS_rmdir () { 40 }
sub SYS_rt_sigaction () { 174 }
sub SYS_rt_sigpending () { 176 }
sub SYS_rt_sigprocmask () { 175 }
sub SYS_rt_sigqueueinfo () { 178 }
sub SYS_rt_sigreturn () { 173 }
sub SYS_rt_sigsuspend () { 179 }
sub SYS_rt_sigtimedwait () { 177 }
sub SYS_sched_get_priority_max () { 159 }
sub SYS_sched_get_priority_min () { 160 }
sub SYS_sched_getaffinity () { 242 }
sub SYS_sched_getparam () { 155 }
sub SYS_sched_getscheduler () { 157 }
sub SYS_sched_rr_get_interval () { 161 }
sub SYS_sched_setaffinity () { 241 }
sub SYS_sched_setparam () { 154 }
sub SYS_sched_setscheduler () { 156 }
sub SYS_sched_yield () { 158 }
sub SYS_select () { 82 }
sub SYS_sendfile () { 187 }
sub SYS_sendfile64 () { 239 }
sub SYS_set_mempolicy () { 276 }
sub SYS_set_robust_list () { 311 }
sub SYS_set_thread_area () { 243 }
sub SYS_set_tid_address () { 258 }
sub SYS_setdomainname () { 121 }
sub SYS_setfsgid () { 139 }
sub SYS_setfsgid32 () { 216 }
sub SYS_setfsuid () { 138 }
sub SYS_setfsuid32 () { 215 }
sub SYS_setgid () { 46 }
sub SYS_setgid32 () { 214 }
sub SYS_setgroups () { 81 }
sub SYS_setgroups32 () { 206 }
sub SYS_sethostname () { 74 }
sub SYS_setitimer () { 104 }
sub SYS_setpgid () { 57 }
sub SYS_setpriority () { 97 }
sub SYS_setregid () { 71 }
sub SYS_setregid32 () { 204 }
sub SYS_setresgid () { 170 }
sub SYS_setresgid32 () { 210 }
sub SYS_setresuid () { 164 }
sub SYS_setresuid32 () { 208 }
sub SYS_setreuid () { 70 }
sub SYS_setreuid32 () { 203 }
sub SYS_setrlimit () { 75 }
sub SYS_setsid () { 66 }
sub SYS_settimeofday () { 79 }
sub SYS_setuid () { 23 }
sub SYS_setuid32 () { 213 }
sub SYS_setxattr () { 226 }
sub SYS_sgetmask () { 68 }
sub SYS_sigaction () { 67 }
sub SYS_sigaltstack () { 186 }
sub SYS_signal () { 48 }
sub SYS_sigpending () { 73 }
sub SYS_sigprocmask () { 126 }
sub SYS_sigreturn () { 119 }
sub SYS_sigsuspend () { 72 }
sub SYS_socketcall () { 102 }
sub SYS_splice () { 313 }
sub SYS_ssetmask () { 69 }
sub SYS_stat () { 106 }
sub SYS_stat64 () { 195 }
sub SYS_statfs () { 99 }
sub SYS_statfs64 () { 268 }
sub SYS_stime () { 25 }
sub SYS_stty () { 31 }
sub SYS_swapoff () { 115 }
sub SYS_swapon () { 87 }
sub SYS_symlink () { 83 }
sub SYS_symlinkat () { 304 }
sub SYS_sync () { 36 }
sub SYS_sync_file_range () { 314 }
sub SYS_sysfs () { 135 }
sub SYS_sysinfo () { 116 }
sub SYS_syslog () { 103 }
sub SYS_tee () { 315 }
sub SYS_tgkill () { 270 }
sub SYS_time () { 13 }
sub SYS_timer_create () { 259 }
sub SYS_timer_delete () { (259 +4) }
sub SYS_timer_getoverrun () { (259 +3) }
sub SYS_timer_gettime () { (259 +2) }
sub SYS_timer_settime () { (259 +1) }
sub SYS_times () { 43 }
sub SYS_tkill () { 238 }
sub SYS_truncate () { 92 }
sub SYS_truncate64 () { 193 }
sub SYS_ugetrlimit () { 191 }
sub SYS_ulimit () { 58 }
sub SYS_umask () { 60 }
sub SYS_umount () { 22 }
sub SYS_umount2 () { 52 }
sub SYS_uname () { 122 }
sub SYS_unlink () { 10 }
sub SYS_unlinkat () { 301 }
sub SYS_unshare () { 310 }
sub SYS_uselib () { 86 }
sub SYS_ustat () { 62 }
sub SYS_utime () { 30 }
sub SYS_utimes () { 271 }
sub SYS_vfork () { 190 }
sub SYS_vhangup () { 111 }
sub SYS_vm86 () { 166 }
sub SYS_vm86old () { 113 }
sub SYS_vmsplice () { 316 }
sub SYS_vserver () { 273 }
sub SYS_wait4 () { 114 }
sub SYS_waitid () { 284 }
sub SYS_waitpid () { 7 }
sub SYS_write () { 4 }
sub SYS_writev () { 146 }
1;
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20061009/f0d26a07/attachment-0001.bin>


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