Are you all aware of CWrap? It goes a long way to generating pxd files for a C libary. It can, for example, generate valid pxd files for the whole of the Intel IPP library.<div><br></div><div>This would likely be a good launching point for a GSOC project, unless you really want to start from scratch.</div>
<div><br><a href="https://github.com/enthought/cwrap">https://github.com/enthought/cwrap</a></div><div><br></div><div>It&#39;s BSD licensed.</div><div><br></div><div><br><div class="gmail_quote">On Thu, Mar 29, 2012 at 5:10 AM, mark florisson <span dir="ltr">&lt;<a href="mailto:markflorisson88@gmail.com">markflorisson88@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 29 March 2012 04:28, Dag Sverre Seljebotn &lt;<a href="mailto:d.s.seljebotn@astro.uio.no">d.s.seljebotn@astro.uio.no</a>&gt; wrote:<br>

&gt; On 03/28/2012 07:58 PM, Philip Herron wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hey all<br>
&gt;&gt;<br>
&gt;&gt; I am implemented a very crude and simplistic and very badly programmed<br>
&gt;&gt; version of a pxd generator i think i understand what were after now<br>
&gt;&gt; but i would appreciate if you look over what i did to make sure i have<br>
&gt;&gt; grasped the basic idea for now:<br>
&gt;&gt;<br>
&gt;&gt; So if i have:<br>
&gt;&gt;<br>
&gt;&gt; #include &quot;test.h&quot;<br>
&gt;&gt;<br>
&gt;&gt; int add (int x, int y)<br>
&gt;&gt; {<br>
&gt;&gt;   return x + y;<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; #ifndef __TEST_H__<br>
&gt;&gt; #define __TEST_H__<br>
&gt;&gt;<br>
&gt;&gt; extern int add (int, int);<br>
&gt;&gt;<br>
&gt;&gt; struct foobar {<br>
&gt;&gt;   int a;<br>
&gt;&gt;   unsigned char * b;<br>
&gt;&gt; };<br>
&gt;&gt;<br>
&gt;&gt; #endif //__TEST_H_<br>
&gt;&gt;<br>
&gt;&gt; We run gcc -fplugin=./python.so -fplugin-arg-python-script=walk.py test.c<br>
&gt;&gt;<br>
&gt;&gt; And i output out.pxd:<br>
&gt;&gt;<br>
&gt;&gt; cdef extern from &quot;test.h&quot;:<br>
&gt;&gt;        int add (int, int)<br>
&gt;&gt;<br>
&gt;&gt;        ctypedef struct foobar:<br>
&gt;&gt;                int a<br>
&gt;&gt;                unsigned char * b<br>
&gt;<br>
&gt;<br>
&gt; Nice. But please use 4 spaces (see PEP 8) :-)<br>
&gt;<br>
&gt; More ideas for project proposal:<br>
&gt;<br>
&gt; Another slight complication is that you should ideally turn<br>
&gt;<br>
&gt; #define FOO 3<br>
&gt; #define BAR 4<br>
&gt;<br>
&gt; into<br>
&gt;<br>
&gt; cdef extern from &quot;foo.h&quot;:<br>
&gt;    enum:<br>
&gt;        FOO<br>
&gt;        BAR<br>
&gt;<br>
&gt; so you need to hook in before the preprocessor and after the preprocessor<br>
&gt; and dig out different stuff.<br>
<br>
</div></div>David, I&#39;m CCing you as this might be of interest to you.<br>
<br>
I think the current GCC plugin support doesn&#39;t allow you to do much<br>
with te preprocessor, it operates entirely after the C preprocessor<br>
has run. So to support macros we have to consider that for this to<br>
work the gcc plugin may have to be extended, which uses C to extend<br>
GCC and Python, so it also requires knowledge of the CPython C API.<br>
David, would you mind elaborating why C was used for this project and<br>
not (partially) Cython, and would it be possible to extend the plugin<br>
with Cython?<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; Then what happens if you have<br>
&gt;<br>
&gt; #ifdef FOO<br>
&gt; #define BAR 3<br>
&gt; #else<br>
&gt; #define BAR 4<br>
&gt; #endif<br>
&gt;<br>
&gt; ?? I&#39;m not saying it is hard, but perhaps no longer completely trivial :-)<br>
&gt;<br>
&gt; And like Robert hinted at, supporting all the aspects of C++ might take a<br>
&gt; little more work, there&#39;s just so much different syntax in C++, and there&#39;s<br>
&gt; several C++ features Cython just does not support and must be either ignored<br>
&gt; or hacked around (e.g., &quot;const&quot;).<br>
&gt;<br>
&gt; Supporting stuff like<br>
&gt;<br>
&gt; #define MACRO(x) ((x)-&gt;field*2)<br>
&gt;<br>
&gt; probably belongs in the category of &quot;must be done manually&quot;.<br>
&gt;<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; So far in a very crude way it understands structs and functions but<br>
&gt;&gt; nothing else i can see how it could all work but i see now why you see<br>
&gt;&gt; it could be a very small project David&#39;s plugin system has mostly<br>
&gt;&gt; everything done for you but i would like to add to his plugin for some<br>
&gt;&gt; tree access code etc...<br>
&gt;&gt;<br>
&gt;&gt; Adding a config file for telling the plugin to not care about certain<br>
&gt;&gt; things would be a nice addition. It seems interesting the clang idea,<br>
&gt;&gt; it could be interesting porting this to other front-ends of gcc like<br>
&gt;&gt; gccgo.<br>
&gt;<br>
&gt;<br>
&gt; Does gccgo use the C ABI so that Cython could call it? If so, go for it!<br>
&gt;<br>
&gt; (Fortran is actually very much in use in the Cython userbase and would get a<br>
&gt; lot more &quot;customers&quot; than Go, but if you have more of a CS background or<br>
&gt; similar I can see why you wouldn&#39;t be so interested in Fortran. I didn&#39;t<br>
&gt; believe people were still using Fortran either until I started doing<br>
&gt; astrophysics, and suddenly it seems to be the default tool everybody uses<br>
&gt; for everything.)<br>
&gt;<br>
&gt; Dag<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; cython-devel mailing list<br>
&gt; <a href="mailto:cython-devel@python.org">cython-devel@python.org</a><br>
&gt; <a href="http://mail.python.org/mailman/listinfo/cython-devel" target="_blank">http://mail.python.org/mailman/listinfo/cython-devel</a><br>
_______________________________________________<br>
cython-devel mailing list<br>
<a href="mailto:cython-devel@python.org">cython-devel@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/cython-devel" target="_blank">http://mail.python.org/mailman/listinfo/cython-devel</a><br>
</div></div></blockquote></div><br></div>