2011-05-11 20 views
6

Estoy intentando compilar un paquete en Mac OS X 10.6.5. La secuencia de comandos de instalación del paquete se basa en distutils. El problema es que el gcc predeterminado de la computadora es la versión 4.2 (lo determiné simplemente ejecutando gcc --version en una ventana de terminal) pero cuando ejecuto 'python setup.py build', veo en la salida que el distutils está eligiendo gcc -4.0 en lugar de 4.2 Este es un gran problema porque el código que estoy usando requiere gcc> = 4.2. No tengo derechos de administrador en esta máquina, así que como workaroud, creé algunos enlaces simbólicos que envían gcc-4.0 a gcc-4.2. El resultado es que el código se compila, pero los archivos .so generados no funcionan (cuando trato de importarlos en python, recibo errores quejándose sobre la falta de una función init en el objeto compartido).distutils Python no usar la versión correcta de gcc

He intentado compilar este código en un mac diferente (10.6.6) y funciona a las mil maravillas: distutils elige 4.2 sin ser forzado a hacerlo y puedo importar el objeto compartido generado sin ningún problema. Entonces, lo que me gustaría hacer es compilar el código en mi computadora sin tener que hacer este engaño simbólico ... Solo quiero que distutils elija 4.2 automáticamente como debería. He intentado tomar los archivos .so que compilan correctamente y transferirlos a mi computadora, pero eso falla por varias razones (están vinculados con bibliotecas que no están presentes en mi máquina/son una versión diferente a las instaladas).

¿Alguien tiene algún consejo aquí?

Gracias, Josh

Respuesta

1

Usted puede ajustar su distutils.cfg (ver here) o se puede pasar argumentos de línea de comandos como --compiler = gcc42 (no estoy seguro sobre el último).

+0

Esto no parece funcionar. El compilador válido es solo 'gcc'. Lanzar la versión no funciona, arroja un error al decir que no sabe cómo compilar con gcc42. –

+0

Probablemente debería ser '--compiler = gcc-4.2' – cdarke

+0

Lamentablemente, eso todavía no ayuda. Si marca distutils.ccompiler, las opciones disponibles son cosas como "unix" o "minwg". No parece notar cosas como la versión. –

16

Para forzar distutils utilizar un compilador separado, puede volver a definir algunas variables través del medio ambiente. En primer lugar, averiguar qué distutils está utilizando como valores por defecto:

>>> from distutils import sysconfig 
>>> sysconfig.get_config_var('LDSHARED') 
'gcc-4.0 -Wl,-F. -bundle -undefined dynamic_lookup' 
>>> sysconfig.get_config_var('CC') 
'gcc-4.0' 

continuación, tiene que redefinir los, sustituyendo en la versión de gcc desea utilizar:

% LDSHARED="gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup" CC=gcc-4.2 \ 
    /usr/bin/python setup.py build_ext 

Tenga en cuenta que la sysconfig valores predeterminados se extraen del Makefile que se utilizó originalmente para compilar Python, por lo que esquivar con ellos puede producir resultados no deseados:

>>> path = sysconfig.get_python_lib(plat_specific=1, standard_lib=1) 
>>> os.path.join(path, 'config', 'Makefile') 
'/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config/Makefile' 
3

usted no dice qué versiones de Python que una reutilizando pero lo más probable es que el Python predeterminado en la máquina que está utilizando no sea el Python 2.6.1 suministrado por Apple, más probablemente uno instalado desde python.org. Intente ejecutar el script de compilación con /usr/bin/python2.6 que debería ser el Python 2.6 suministrado por Apple; que usa gcc-4.2.

Cuando se utiliza Distutils de Python (por lo general mediante la ejecución de un script setup.py o el uso de easy_install), Distutils trata de asegurarse de que todos los módulos de extensión de C en el paquete va a instalar serán compilados con la misma versión del compilador y con opciones de compilación compatibles (CPU arch, ABI, etc.) como se usó para construir Python. Tradicionalmente, la mayoría de los instaladores de python.org para OS X proporcionan un Python universal que funciona en múltiples versiones de OS X y múltiples archios de CPU. Es por eso que están construidos con gcc-4.0. Si necesita usar gcc-4.2 para alguna otra biblioteca, lo más seguro es usar un Python que fue construido con gcc-4.2. El sistema suministrado por Apple Pythons en OS X 10.6 está construido así. Además, para las versiones más recientes de Python (2.7.1 y 3.2), python.org proporciona una segunda variante de instalador de OS X para OS X 10.6 que también está construida con gcc-4.2. Pero si no tiene acceso de administrador a su máquina, esa no es una opción de todos modos.

Puede ver qué pitón está siendo utilizado por defecto por:

which python 
4

¿Ha intentado establecer una variable de entorno CC personalizada?

CC=gcc-4.2 python setup.py build 
Cuestiones relacionadas