CastXML / pygccxml

pygccxml is a specialized XML reader that reads the output from CastXML or GCCXML. It provides a simple framework to navigate C++ declarations, using Python classes.
Boost Software License 1.0
129 stars 44 forks source link

More control over the xml_generator command ? #96

Open teto opened 6 years ago

teto commented 6 years ago

I am trying to parse the libC library, I had it working on Ubuntu. I've now switched to nixos but the working castxml command doesn't seem to be built from pygccxml.

My current python code has:

xml_generator_config = parser.xml_generator_configuration_t(
            xml_generator_path=generator_path,
            xml_generator=generator_name,
            include_paths=[
                "/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include",
                "/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include",
            ],
            cflags=" ",
            castxml_epic_version=1,
            )

with pygccxml 1.9.1 and castxml

castxml -v                                                                                                                                                                                                                                                     
clang version 4.0.1 (tags/RELEASE_401/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: 
Found candidate GCC installation: /nix/store/052l3p8a4m9iabs1smf1myj3g2w6rlij-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0
Found candidate GCC installation: /nix/store/052l3p8a4m9iabs1smf1myj3g2w6rlij-gcc-6.4.0/lib64/gcc/x86_64-unknown-linux-gnu/6.4.0
Selected GCC installation: /nix/store/052l3p8a4m9iabs1smf1myj3g2w6rlij-gcc-6.4.0/lib64/gcc/x86_64-unknown-linux-gnu/6.4.0
Candidate multilib: .;@m64
Selected multilib: .;@m64

pygccxml generates and calls the following command (which fails):

/nix/store/bgsr6clnq2ivppapayqdbzklkmqbd75b-CastXML-20171003/bin/castxml  -nostdinc -I/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include -I/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include   -I"." -I"/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include" -c -x c++ --castxml-cc-gnu /home/teto/.nix-profile/bin/clang++ --castxml-output=1 -o /run/user/1000/tmp6d6aac0v.xml test.h
/nix/store/bgsr6clnq2ivppapayqdbzklkmqbd75b-CastXML-20171003/bin/castxml  -nostdinc -I/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include -I/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include   -I"." -I"/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include"  -x c++ --castxml-cc-gnu /home/teto/.nix-profile/bin/clang++ --castxml-output=1 -o /run/user/1000/tmp6d6aac0v.xml test.h
In file included from test.h:3:
In file included from /nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/stdio.h:862:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:360:7: warning: use of logical '&&' with constant
      operand [-Wconstant-logical-operand]
      && __builtin_constant_p (__n)
      ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:360:7: note: use '&' for a bitwise operation
      && __builtin_constant_p (__n)
      ^~
      &
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:360:7: note: remove constant to silence this warning
      && __builtin_constant_p (__n)
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:43:8: error: redefinition of a 'extern inline'
      function 'vsprintf' is not supported in C++
__NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt,
       ^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:43:8: note: previous definition is here
__NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt,
       ^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:74:8: error: redefinition of a 'extern inline'
      function 'vsnprintf' is not supported in C++
__NTH (vsnprintf (char *__restrict __s, size_t __n,
       ^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:74:8: note: previous definition is here
__NTH (vsnprintf (char *__restrict __s, size_t __n,
       ^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:114:1: error: redefinition of a 'extern inline'
      function 'vprintf' is not supported in C++
vprintf (const char *__restrict __fmt, _G_va_list __ap)
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:114:1: note: previous definition is here
vprintf (const char *__restrict __fmt, _G_va_list __ap)
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:124:1: error: redefinition of a 'extern inline'
      function 'vfprintf' is not supported in C++
vfprintf (FILE *__restrict __stream,
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:124:1: note: previous definition is here
vfprintf (FILE *__restrict __stream,
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:150:1: error: redefinition of a 'extern inline'
      function 'vdprintf' is not supported in C++
vdprintf (int __fd, const char *__restrict __fmt, _G_va_list __ap)
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:150:1: note: previous definition is here
vdprintf (int __fd, const char *__restrict __fmt, _G_va_list __ap)
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:207:8: error: redefinition of a 'extern inline'
      function 'vasprintf' is not supported in C++
__NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt,
       ^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:207:8: note: previous definition is here
__NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt,
       ^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:214:8: error: redefinition of a 'extern inline'
      function 'obstack_vprintf' is not supported in C++
__NTH (obstack_vprintf (struct obstack *__restrict __obstack,
       ^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:214:8: note: previous definition is here
__NTH (obstack_vprintf (struct obstack *__restrict __obstack,
       ^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:232:1: error: redefinition of a 'extern inline'
      function 'gets' is not supported in C++
gets (char *__str)
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:232:1: note: previous definition is here
gets (char *__str)
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:252:1: error: redefinition of a 'extern inline'
      function 'fgets' is not supported in C++
fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:252:1: note: previous definition is here
fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:281:1: error: redefinition of a 'extern inline'
      function 'fread' is not supported in C++
fread (void *__restrict __ptr, size_t __size, size_t __n,
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:281:1: note: previous definition is here
fread (void *__restrict __ptr, size_t __size, size_t __n,
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:310:1: error: redefinition of a 'extern inline'
      function 'fgets_unlocked' is not supported in C++
fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream)
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:310:1: note: previous definition is here
fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream)
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:342:1: error: redefinition of a 'extern inline'
      function 'fread_unlocked' is not supported in C++
fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
^
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:342:1: note: previous definition is here
fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
^
In file included from test.h:11:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:360:7: warning: use of logical '&&' with constant
      operand [-Wconstant-logical-operand]
      && __builtin_constant_p (__n)
      ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:360:7: note: use '&' for a bitwise operation
      && __builtin_constant_p (__n)
      ^~
      &
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/stdio2.h:360:7: note: remove constant to silence this warning
      && __builtin_constant_p (__n)
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from test.h:13:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/wchar.h:325:47: warning: comparison of unsigned expression >= 0 is
      always true [-Wtautological-compare]
{ return (__builtin_constant_p (__wc) && __wc >= L'\0' && __wc <= L'\x7f'
                                         ~~~~ ^  ~~~~~
In file included from test.h:70:
In file included from /nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/math.h:711:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/bits/mathinline.h:152:64: warning: use of GNU old-style field
      designator extension [-Wgnu-designator]
  __extension__ union { long double __l; int __i[3]; } __u = { __l: __x };
                                                               ^~~~
                                                               .__l = 
4 warnings and 12 errors generated.

If I edit the command manually aka remove the -c -x c++ --castxml-cc-gnu it seems to work better :

/nix/store/bgsr6clnq2ivppapayqdbzklkmqbd75b-CastXML-20171003/bin/castxml  -nostdinc -I/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include -I/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include   -I"." -I"/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include"   --castxml-cc-gnu /home/teto/.nix-profile/bin/clang++ --castxml-output=1 -o /run/user/1000/tmp6d6aac0v.xml test.h
/nix/store/bgsr6clnq2ivppapayqdbzklkmqbd75b-CastXML-20171003/bin/castxml  -nostdinc -I/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include -I/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include   -I"." -I"/nix/store/c30dlkmiyrjxxjv6nv63igjkzcj1fzxi-gcc-6.4.0/lib/gcc/x86_64-unknown-linux-gnu/6.4.0/include"    /home/teto/.nix-profile/bin/clang++ --castxml-output=1 -o /run/user/1000/tmp6d6aac0v.xml test.h
warning: /home/teto/.nix-profile/bin/clang++: 'linker' input unused [-Wunused-command-line-argument]
In file included from test.h:10:
/nix/store/mqalq0v2laqblw00dp7pwwckj2ra6jyh-glibc-2.26-75-dev/include/setjmp.h:54:12: warning: declaration of built-in function
      '__sigsetjmp' requires inclusion of the header <setjmp.h> [-Wbuiltin-requires-header]
extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask) __THROWNL;
           ^
1 warning generated.

Looking at the code, the --castxml-cc-gnu seems always added on linux so I wonder if there is a way around.

iMichka commented 6 years ago

Hi. I’ll need to have a closer look to this.

One thing is that I would like to keep the cast mal command line setup as automatic as possible, so that a user does not have to fiddle too much with flags for castxml. This has always been like this in pygccxml, so I would like to keep that ease of use.

I thought that the —castxml-cc-gnu was needed for Linux. If I remember well it tells castxml that it will work with gcc. But I am unsure now. Maybe you could trace down what that flag does exactly in castxml.

Also, you may need to add a c++11 flag for gcc6, but I think it is not mandatory (but may help here)