[Cython] --embed on windows? Probably not the FAQ issue

2009-12-29 Thread Dan Stromberg
I'm trying to create a little standalone executable to help troubleshoot a
problem on a windows system.  The intent is not (necessarily) to have a fast
program, but rather to have a single .exe without a bunch of dll's, so we
don't have to copy more than one new file onto this production server.

Here's my (cygwin) Makefile:

CFLAGS=-Ic:/Python26/include
#LDFLAGS=-static -Lc:/Python26/libs -lpython26
LDFLAGS=-Lc:/Python26/libs -lpython26
CC=/cygdrive/c/MinGW/bin/gcc
PYTHON=/cygdrive/c/Python26/python
CYTHON=c:/Python26/Scripts/cython.py
V=python26

#CFLAGS=-Ic:/Python26/include
#LDFLAGS=-static -L. -lpython26
##LDFLAGS=-L. -lpython26
#CC=/cygdrive/c/MinGW/bin/gcc
#PYTHON=/cygdrive/c/Python26/python
#CYTHON=c:/Python26/Scripts/cython.py
#V=python26

#lib$V.a: /cygdrive/c/Python26/libs/$V.lib
#   $(HOME)/bin/pexports c:/Python26/libs/$V.dll  $V.def
#   dlltool --dllname $V.dll --def $V.def --output-lib lib$V.a

seconds.exe: seconds.o # lib$V.a
$(CC) $(LDFLAGS) -o seconds.exe seconds.o

seconds.o: seconds.c
$(CC) -c $(CFLAGS) seconds.c

seconds.c: seconds.pyx
$(PYTHON) $(CYTHON) --embed seconds.pyx

clean:
rm -f *.o *.exe *.c

Things are OK until the link is attempted, at which point I get:
/cygdrive/c/MinGW/bin/gcc -Lc:/Python26/libs -lpython26 -o seconds.exe
seconds.o

seconds.o:seconds.c:(.text+0x6f): undefined reference to
`_imp__PyInt_FromLong'
seconds.o:seconds.c:(.text+0x124): undefined reference to
`_imp__PyTuple_New'
seconds.o:seconds.c:(.text+0x1b8): undefined reference to
`_imp__Py_InitModule4'
seconds.o:seconds.c:(.text+0x200): undefined reference to
`_imp__PyImport_AddMod
ule'
seconds.o:seconds.c:(.text+0x253): undefined reference to
`_imp__PyObject_SetAtt
rString'
seconds.o:seconds.c:(.text+0x2a5): undefined reference to
`_imp__PyObject_SetAtt
rString'

It goes on like that for quite a while, about a bunch of _imp__ functions
being missing.

Do I need to build my program with the same C compiler that my Python
distribution was built with?

I saw the FAQ about needing to build a libpython26.a, but 1) I have one
already, and 2) pexports errored.  I also googled quite a bit and didn't
find anything that looked quite relevant.

I'm using Python 2.6.4 from python.org on Windows XP SP3, Dave Cournapeau's
Cython 0.11.2 installer for Python26, and MinGW (native gcc) 5.1.6.  I'm
using Cygwin make, but the rest is intended to be non-cygwin (though if a
static cygwin executable will run without cygwin, that might work for me
too).

BTW, does distutils support building a --embed executable?

Any suggestions?

TIA!

-- 
Dan Stromberg
___
Cython-dev mailing list
Cython-dev@codespeak.net
http://codespeak.net/mailman/listinfo/cython-dev


Re: [Cython] --embed on windows? Probably not the FAQ issue

2009-12-29 Thread Lisandro Dalcín
On Tue, Dec 29, 2009 at 5:20 PM, Dan Stromberg strom...@gmail.com wrote:

 I'm trying to create a little standalone executable to help troubleshoot a
 problem on a windows system.  The intent is not (necessarily) to have a fast
 program, but rather to have a single .exe without a bunch of dll's, so we
 don't have to copy more than one new file onto this production server.


Take all my comments with care, I have very littly Win experience.

1) If you want a self-contained exe without any dependency on Python's
DLL, then you definitely need to use a static library.

2) But if you use a static library, then I bet you have to #define
Py_NO_ENABLE_SHARED or something like that (better to pass an
appropriate option on the command line adding stuff to CFLAGS at your
makefile), in order to make PyAPI_FUNC and PyAPI_DATA macros (in
pyport.h) to adjust for the static library case. Other way could be to
use a custom pyport.h, but IMHO #define Py_NO_ENABLE_SHARED is by far
cleaner and easier


Hope that help. Please let all as know about your success/failure.

 Here's my (cygwin) Makefile:

 CFLAGS=-Ic:/Python26/include
 #LDFLAGS=-static -Lc:/Python26/libs -lpython26
 LDFLAGS=-Lc:/Python26/libs -lpython26
 CC=/cygdrive/c/MinGW/bin/gcc
 PYTHON=/cygdrive/c/Python26/python
 CYTHON=c:/Python26/Scripts/cython.py
 V=python26

 #CFLAGS=-Ic:/Python26/include
 #LDFLAGS=-static -L. -lpython26
 ##LDFLAGS=-L. -lpython26
 #CC=/cygdrive/c/MinGW/bin/gcc
 #PYTHON=/cygdrive/c/Python26/python
 #CYTHON=c:/Python26/Scripts/cython.py
 #V=python26

 #lib$V.a: /cygdrive/c/Python26/libs/$V.lib
 #   $(HOME)/bin/pexports c:/Python26/libs/$V.dll  $V.def
 #   dlltool --dllname $V.dll --def $V.def --output-lib lib$V.a

 seconds.exe: seconds.o # lib$V.a
     $(CC) $(LDFLAGS) -o seconds.exe seconds.o

 seconds.o: seconds.c
     $(CC) -c $(CFLAGS) seconds.c

 seconds.c: seconds.pyx
     $(PYTHON) $(CYTHON) --embed seconds.pyx

 clean:
     rm -f *.o *.exe *.c

 Things are OK until the link is attempted, at which point I get:
 /cygdrive/c/MinGW/bin/gcc -Lc:/Python26/libs -lpython26 -o seconds.exe
 seconds.o

 seconds.o:seconds.c:(.text+0x6f): undefined reference to
 `_imp__PyInt_FromLong'
 seconds.o:seconds.c:(.text+0x124): undefined reference to
 `_imp__PyTuple_New'
 seconds.o:seconds.c:(.text+0x1b8): undefined reference to
 `_imp__Py_InitModule4'
 seconds.o:seconds.c:(.text+0x200): undefined reference to
 `_imp__PyImport_AddMod
 ule'
 seconds.o:seconds.c:(.text+0x253): undefined reference to
 `_imp__PyObject_SetAtt
 rString'
 seconds.o:seconds.c:(.text+0x2a5): undefined reference to
 `_imp__PyObject_SetAtt
 rString'

 It goes on like that for quite a while, about a bunch of _imp__ functions
 being missing.

 Do I need to build my program with the same C compiler that my Python
 distribution was built with?

 I saw the FAQ about needing to build a libpython26.a, but 1) I have one
 already, and 2) pexports errored.  I also googled quite a bit and didn't
 find anything that looked quite relevant.

 I'm using Python 2.6.4 from python.org on Windows XP SP3, Dave Cournapeau's
 Cython 0.11.2 installer for Python26, and MinGW (native gcc) 5.1.6.  I'm
 using Cygwin make, but the rest is intended to be non-cygwin (though if a
 static cygwin executable will run without cygwin, that might work for me
 too).

 BTW, does distutils support building a --embed executable?

 Any suggestions?

 TIA!

 --
 Dan Stromberg

 ___
 Cython-dev mailing list
 Cython-dev@codespeak.net
 http://codespeak.net/mailman/listinfo/cython-dev





-- 
Lisandro Dalcín
---
Centro Internacional de Métodos Computacionales en Ingeniería (CIMEC)
Instituto de Desarrollo Tecnológico para la Industria Química (INTEC)
Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET)
PTLC - Güemes 3450, (3000) Santa Fe, Argentina
Tel/Fax: +54-(0)342-451.1594
___
Cython-dev mailing list
Cython-dev@codespeak.net
http://codespeak.net/mailman/listinfo/cython-dev