Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

h2xs does not handle properly enum constants #9381

Open
p5pRT opened this issue Jun 16, 2008 · 7 comments
Open

h2xs does not handle properly enum constants #9381

p5pRT opened this issue Jun 16, 2008 · 7 comments

Comments

@p5pRT
Copy link

p5pRT commented Jun 16, 2008

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

Searchable as RT55896$

@p5pRT
Copy link
Author

p5pRT commented Jun 16, 2008

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
Copy link
Author

p5pRT commented Jun 20, 2008

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
Copy link
Author

p5pRT commented Jun 20, 2008

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

@p5pRT
Copy link
Author

p5pRT commented Aug 11, 2008

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

@p5pRT
Copy link
Author

p5pRT commented Nov 8, 2008

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
Copy link
Author

p5pRT commented Nov 8, 2008

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

@p5pRT
Copy link
Author

p5pRT commented Aug 26, 2013

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants