__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.