This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: Compile
- From: Brian Dessent <brian at dessent dot net>
- To: r <r dot trev_ at inwind dot it>
- Cc: cygwin at cygwin dot com
- Date: Sat, 02 Aug 2008 09:46:08 -0700
- Subject: Re: Compile
- References: <g70f8q$jiu$1@ger.gmane.org>
- Reply-to: cygwin at cygwin dot com
r wrote:
> I'm trying to compile a wonderful program ( command line ) to grab
> videoes from youtube. It needs newt, a little utility. But when I try to
> compile this utility I have the follewing errors :
> ...
> snackmodule.c:126: error: initializer element is not constant
> snackmodule.c:126: error: (near initialization for `snackGridType.ob_type')
> snackmodule.c:168: error: initializer element is not constant
> snackmodule.c:168: error: (near initialization for `snackFormType.ob_type')
> snackmodule.c:255: error: initializer element is not constant
> snackmodule.c:255: error: (near initialization for `snackWidgetType.ob_type')
> make: *** [_snackmodule_la-snackmodule.lo] Error 1
>
> Do you know if it is an unrecoverable error ( a limitation of cygwin )
> that will not permit to install this utility ?
In the future, you could save a lot of time on the part of people that
might wish to help you by either pasting the contents of the above
mentioned lines or providing a link to the source tarball. Or at the
very least specify the version you're trying to build. Also, a proper
subject usually helps.
The offending construct is this:
static PyTypeObject snackFormType = {
PyObject_HEAD_INIT(&PyType_Type)
PyType_Type is an object declared dllimport in Python.h as it's provided
by the main python DLL. This is one of those differences between ELF
and PE, the address of a symbol from a shared library cannot be used as
a constant initializer in PE. The testcase boils down to this:
$ cat >tc.c <<EOF
extern __attribute__((dllimport)) int fromdll;
typedef struct { int *foo; } foo_t;
static foo_t foo = { &fromdll };
EOF
$ gcc -c tc.c
tc.c:5: error: initializer element is not constant
tc.c:5: error: (near initialization for `foo.foo')
A little googling shows that apparently you can supply 0 to this
HEAD_INIT macro and the field will be initialized with the proper value
at runtime. Google code search shows some instances where they define a
macro for this for documentation purposes:
#define DEFERRED_ADDRESS(ADDR) 0
...
static PyTypeObject foo = {
PyObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type))
So, that would probably be the first workaround I'd try for porting this
library to PE.
Brian
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/