Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.9k stars 540 forks source link

h2xs does not handle properly enum constants #9381

Open p5pRT opened 16 years ago

p5pRT commented 16 years ago

Migrated from rt.perl.org#55896 (status was 'open')

Searchable as RT55896$

p5pRT commented 16 years ago

From domi@komarr.gre.hp.com

Created by domi@komarr.gre.hp.com

Hello

I've used h2xs (hence ExtUtils​::Constant) to generate bindings for Augeas [1] library. Augeas header file includes constants defined with enums​:

enum aug_flags {   AUG_NONE = 0\,   AUG_SAVE_BACKUP = (1 \<\< 0)\, /* Keep the original file with a   .augsave extension */   AUG_SAVE_NEWFILE = (1 \<\< 1)\, /* Save changes into a file with   extension .augnew\, and do not   overwrite the original file. Takes   precedence over AUG_SAVE_BACKUP */   AUG_TYPE_CHECK = (1 \<\< 2) /* Typecheck lenses; since it can be very   expensive it is not done by default */ };

h2xs correctly detects these constants\, but it will generate a C code that expects these constants to be #defined. See the generated const-c.inc​:   case 8​:   if (memEQ(name\, "AUG_NONE"\, 8)) { #ifdef AUG_NONE   *iv_return = AUG_NONE;   return PERL_constant_ISIV; #else   return PERL_constant_NOTDEF; #endif   }   break;

This code does not work as the constants are not known to cpp.

In itself\, it not a big problem\, but finding out what's wrong is a pain when you're beginning to learn XS :-/

There's a workaround suggested on Sun's blogs [2] which works fine. (This blog also feature a fine explanation of the enum problem)

HTH

[1] http​://augeas.net/ [2] http​://blogs.sun.com/akolb/entry/pitfals_of_the_perl_xs

Perl Info ``` Flags: category=library severity=low Site configuration information for perl 5.10.0: Configured by Debian Project at Thu May 8 13:32:42 UTC 2008. Summary of my perl5 (revision 5 version 10 subversion 0) configuration: Platform: osname=linux, osvers=2.6.24.4, archname=i486-linux-gnu-thread-multi uname='linux ninsei 2.6.24.4 #1 smp preempt fri apr 18 15:36:09 pdt 2008 i686 gnulinux ' config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.0 -Dsitearch=/usr/local/lib/perl/5.10.0 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.0 -Dd_dosuid -des' hint=recommended, useposix=true, d_sigaction=define useithreads=define, usemultiplicity=define useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef use64bitint=undef, use64bitall=undef, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', optimize='-O2 -g', cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include' ccversion='', gccversion='4.2.3 (Debian 4.2.3-5)', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=4, prototype=define Linker and Libraries: ld='cc', ldflags =' -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib /usr/lib64 libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt perllibs=-ldl -lm -lpthread -lc -lcrypt libc=/lib/libc-2.7.so, so=so, useshrplib=true, libperl=libperl.so.5.10.0 gnulibc_version='2.7' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib' Locally applied patches: @INC for perl 5.10.0: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl . Environment for perl 5.10.0: HOME=/home/domi LANG=en_US.UTF-8 LANGUAGE=en_FR:en_US:en_GB:en LC_ALL=en_US.utf8 LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/opt/OC PERL_BADLANG (unset) SHELL=/bin/bash ```
p5pRT commented 16 years ago

From @smpeters

Hello

I've used h2xs (hence ExtUtils​::Constant) to generate bindings for Augeas [1] library. Augeas header file includes constants defined with enums​:

enum aug_flags { AUG_NONE = 0\, AUG_SAVE_BACKUP = (1 \<\< 0)\, /* Keep the original file with a .augsave extension */ AUG_SAVE_NEWFILE = (1 \<\< 1)\, /* Save changes into a file with extension .augnew\, and do not overwrite the original file. Takes precedence over AUG_SAVE_BACKUP */ AUG_TYPE_CHECK = (1 \<\< 2) /* Typecheck lenses; since it can be very expensive it is not done by default */ };

h2xs correctly detects these constants\, but it will generate a C code that expects these constants to be #defined. See the generated const-c.inc​: case 8​: if (memEQ(name\, "AUG_NONE"\, 8)) { #ifdef AUG_NONE *iv_return = AUG_NONE; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break;

This code does not work as the constants are not known to cpp.

In itself\, it not a big problem\, but finding out what's wrong is a pain when you're beginning to learn XS :-/

There's a workaround suggested on Sun's blogs [2] which works fine. (This blog also feature a fine explanation of the enum problem)

HTH

[1] http​://augeas.net/ [2] http​://blogs.sun.com/akolb/entry/pitfals_of_the_perl_xs

As a side note\, there have been several fixes that have gone into h2xs since that blog entry was created\, so I'm not sure how relevant it may still be. Setting the precedent for --skip-ppport is a bit troubling.

I had thought that all the enum problems had been nailed down though. Is there a particular .h that is causing problems. What was the exact command line you were using?

Steve Peters steve@​fisharerojo.org

p5pRT commented 16 years ago

The RT System itself - Status changed from 'new' to 'open'

p5pRT commented 16 years ago

p5p@spam.wizbit.be - Status changed from 'open' to 'stalled'

p5pRT commented 15 years ago

From jeffrey.ratcliffe@gmail.com

As a side note\, there have been several fixes that have gone into h2xs since that blog entry was created\, so I'm not sure how relevant it may still be. Setting the precedent for --skip-ppport is a bit troubling.

I had thought that all the enum problems had been nailed down though. Is there a particular .h that is causing problems. What was the exact command line you were using?

If you try the example in the blog[1]\, the only bug that has been fixed in 5.10 is

  870c868   \< my ($key\, $declared_val) = $item =~ /(\w*)\s*=\s*(.*)/;   ---   > my ($key\, $declared_val) = $item =~ /(\w+)\s*[=\,]*\s*(.*)/;

all of the others remain. The .h in question is​:

#define XST_DEFINE 1

typedef enum xst_enum {   XST_ENUM_1\,   XST_ENUM_2\, } xst_enum_t;

typedef enum xst_enum_val {   XST_ENUM_VAL_1 = 1\,   XST_ENUM_VAL_2 = 2\, } xst_enum_val_t;

The command was​:

h2xs --skip-ppport --overwrite-ok --autogen-xsubs --name=XS​::Test xs_test.h

Regards

Jeff

[1] http​://blogs.sun.com/akolb/entry/pitfals_of_the_perl_xs

p5pRT commented 15 years ago

The RT System itself - Status changed from 'stalled' to 'open'

p5pRT commented 11 years ago

From @nwc10

[1] http​://blogs.sun.com/akolb/entry/pitfals_of_the_perl_xs

Sigh. "your blog" is not the place to report bugs. (To be clear\, I believe that all entries in this ticket have been made by helpful third parties attempting to relay the findings of the blog author to the *right* place to report bugs)

Moreover\, "your blog" (or any third party hosted URL) can go away. I've retrieved the blog post from the Wayback machine and attached it here before its content is lost forever.

(I don't know if the dodgy HTML a side effect of the Wayback machine or an accurate reflection of what the now defunct blogs.sun.org generated)

Nicholas Clark