¿Cómo decirle a distutils que usen gcc?

Quiero envolver un proyecto de prueba que contenga código C ++ y OpenMP con Cython, y comstackrlo con distutils a través de un archivo setup.py . El contenido de mi archivo se ve así:

 from distutils.core import setup from distutils.extension import Extension from Cython.Build import cythonize from Cython.Distutils import build_ext modules = [Extension("Interface", ["Interface.pyx", "Parallel.cpp"], language = "c++", extra_compile_args=["-fopenmp"], extra_link_args=["-fopenmp"])] for e in modules: e.cython_directives = {"embedsignature" : True} setup(name="Interface", cmdclass={"build_ext": build_ext}, ext_modules=modules) 

El indicador -fopenmp se usa con gcc para comstackr y vincular contra OpenMP. Sin embargo, si acabo de invocar

 cls ~/workspace/CythonOpenMP/src $ python3 setup.py build 

esta bandera no se reconoce, porque el comstackdor es clang:

 running build running build_ext skipping 'Interface.cpp' Cython extension (up-to-date) building 'Interface' extension cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Interface.cpp -o build/temp.macosx-10.8-x86_64-3.3/Interface.o -fopenmp clang: warning: argument unused during comstacktion: '-fopenmp' cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Parallel.cpp -o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -fopenmp clang: warning: argument unused during comstacktion: '-fopenmp' Parallel.cpp:24:10: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma omp parallel for ^ 1 warning generated. c++ -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/local/opt/sqlite/lib build/temp.macosx-10.8-x86_64-3.3/Interface.o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -o build/lib.macosx-10.8-x86_64-3.3/Interface.so -fopenmp ld: library not found for -lgomp clang: error: linker command failed with exit code 1 (use -v to see invocation) error: command 'c++' failed with exit status 1 

He intentado sin éxito especificar gcc:

 cls ~/workspace/CythonOpenMP/src $ python3 setup.py build --compiler=g++-4.7 running build running build_ext error: don't know how to compile C/C++ code on platform 'posix' with 'g++-4.7' compiler 

¿Cómo puedo decirle a distutils que usen gcc?

Intente configurar la variable de entorno “CC” desde dentro de setup.py con os.environ.

En caso de que otros estén enfrentando el mismo problema en Windows (donde la variable de entorno CC no tendría ningún efecto):

  • Crea el archivo “C: \ Python27 \ Lib \ distutils \ distutils.cfg” y escribe esto dentro:

Código:

 [build] compiler = mingw32 
  • Elimine todas las instancias de la opción gcc “-mno-cygwin” del archivo “C: \ Python27 \ Lib \ distutils \ cygwinccompiler.py”:

Esta :

  self.set_executables(compiler='gcc -mno-cygwin -O -Wall', compiler_so='gcc -mno-cygwin -mdll -O -Wall', compiler_cxx='g++ -mno-cygwin -O -Wall', linker_exe='gcc -mno-cygwin', linker_so='%s -mno-cygwin %s %s' % (self.linker_dll, shared_option, entry_point)) 

Se convierte en esto:

 self.set_executables(compiler='gcc -O -Wall', compiler_so='gcc -mdll -O -Wall', compiler_cxx='g++ -O -Wall', linker_exe='gcc', linker_so='%s %s %s' % (self.linker_dll, shared_option, entry_point)) 

El segundo punto puede ser necesario en caso de que esté utilizando una versión reciente de gcc, donde se ha eliminado la opción obsoleta -mno-cygwin .

Espero que esto ayude, incluso si no está directamente relacionado con las necesidades reales del OP (pero aún está relacionado con el título de la pregunta …)

Simplemente eché un vistazo a la fuente distutils , y la opción --compiler espera “unix”, “msvc”, “cygwin”, “mingw32”, “bcpp” o “emx”. Comprueba el nombre del comstackdor que desea al verificar la variable de entorno CC . Intente llamar a construir de esta manera:

 CC=gcc python setup.py build 

No es necesario configurar CXX , no lo comprueba.

Prueba esto: http://mail.python.org/pipermail/distutils-sig/2002-August/002944.html

En resumen, parece que deberías probar: python setup.py build –compiler = g ++ primero.