__name__ python gcc command-line compilation distutils

__name__ - main python



Obtenga los comandos que distutils pasa al compilador (1)

Digamos que tengo este código Python en un script setup.py para construir una extensión C:

from distutils.core import setup, Extension module1 = Extension(''demo'', sources = [''demo.c'']) setup (name = ''PackageName'', version = ''1.0'', description = ''This is a demo package'', ext_modules = [module1])

Suficientemente fácil. Ahora llamo al script setup.py con esta línea:

C:/> python setup.py build_ext --compiler=mingw32

Ok, pero ¿cuál es la pregunta?

Cuando distutils llama a mingw32 y le pasa todos los indicadores y opciones independientes necesarios del sistema operativo y las opciones, ¿cómo se representan esos indicadores?

¿Dónde guarda distutils los comandos relacionados con cada plataforma y cómo puedo acceder a ellos?


No es tan simple como un conjunto de opciones, pero puedes ver cómo funciona. En su directorio de origen python, busque esto

distutils/ccompiler.py

En ese archivo, cada compilador tiene una entrada como esta

# Map compiler types to (module_name, class_name) pairs -- ie. where to # find the code that implements an interface to this compiler. (The module # is assumed to be in the ''distutils'' package.) compiler_class = { ''unix'': (''unixccompiler'', ''UnixCCompiler'', "standard UNIX-style compiler"), ''msvc'': (''msvccompiler'', ''MSVCCompiler'', "Microsoft Visual C++"), ''cygwin'': (''cygwinccompiler'', ''CygwinCCompiler'', "Cygwin port of GNU C Compiler for Win32"), ''mingw32'': (''cygwinccompiler'', ''Mingw32CCompiler'', "Mingw32 port of GNU C Compiler for Win32"), ''bcpp'': (''bcppcompiler'', ''BCPPCompiler'', "Borland C++ Compiler"), ''emx'': (''emxccompiler'', ''EMXCCompiler'', "EMX port of GNU C Compiler for OS/2"), }

Puede encontrar el código que está buscando en

distutils/cygwinccompiler.py

Si edita su script setup.py y agrega esto

from distutils.core import setup,Extension from distutils.cygwinccompiler import Mingw32CCompiler from pprint import pprint module1 = Extension(''demo'', sources = [''demo.c'']) m32 = Mingw32CCompiler() pprint (vars(m32)) setup (name = ''PackageName'', version = ''1.0'', description = ''This is a demo package'', ext_modules = [module1])

Puedes ver bastantes de las opciones disponibles ...

{''archiver'': [''ar'', ''-cr''], ''compiler'': [''gcc'', ''-O'', ''-Wall''], ''compiler_cxx'': [''g++'', ''-O'', ''-Wall''], ''compiler_so'': [''gcc'', ''-mdll'', ''-O'', ''-Wall''], ''dll_libraries'': None, ''dllwrap_version'': None, ''dry_run'': 0, ''force'': 0, ''gcc_version'': LooseVersion (''4.2.1''), ''include_dirs'': [], ''ld_version'': None, ''libraries'': [], ''library_dirs'': [], ''linker_dll'': ''dllwrap'', ''linker_exe'': [''gcc''], ''linker_so'': [''dllwrap'', ''-mdll'', ''-static''], ''macros'': [], ''objects'': [], ''output_dir'': None, ''preprocessor'': None, ''ranlib'': [''ranlib''], ''runtime_library_dirs'': [], ''verbose'': 0}

Para acceder a las opciones individuales, puede usarlas de la siguiente manera ...

print m32.compile [''gcc'', ''-O'', ''-Wall'']

No hay un simple conjunto de banderas. Muchos de los indicadores están configurados en tiempo de ejecución y el código anterior muestra que debe mirar para ver cómo se generan, etc.