A menudo, no es posible escribir cada cosa necesaria para construir una distribución a priori: puede que necesites obtener información del usuario o de su sistema para proseguir. Siempre que tal información sea simple (una lista de directorios en los que buscar cabeceras o bibliotecas de C, por ejemplo) resulta sencillo proporcionar un fichero de configuración, setup.cfg, y dejar que lo edite el usuario. Los ficheros de configuración también permiten proporcionar valores por omisión de cualquier opción de línea de órdenes que el usuario puede forzar mediante opciones en la línea de órdenes o mediante la edición de dichos ficheros..
Si las necesidades son más avanzadas, como, por ejemplo, determinar qué extensiones se han de construir dependiendo de las propiedades de la instalación del sistema, se necesita usar los servicios de ``auto-configuración'' de las Distutils. Empezaron a aparecer en la versión 0.9, pero, en el momento en que se escribe esto, no son suficientemente estables o maduras para su uso en entornos de producción.
** should reference description of distutils config files in ``Installing'' manual here **
El fichero de configuración de la instalación es un término medio entre el guion de instalación (que idealmente es transparente para el instalador2) y la línea de órdenes del guion de instalación, que queda totalmente fuera de tu control y al albedrío del instalador. De hecho, setup.cfg (y otros ficheros de configuración de Distutils presentes en el sistema final) se procesan tras el contenido del guion de instalación, pero antes de la línea de órdenes. Esto supone varias consecuencias favorables:
La sintaxis básica del fichero de configuración es simple:
[orden] opción=valor ...
build_py
o install
) y opción es una
de las opciones válidas para dicha orden. En el fichero se puede proporcionar cualquier
número de opciones para cada orden y se puede incluir cualquier número
de secciones de orden. Se pasan por alto las líneas en blanco y los comentarios
(desde el carácter #
hasta el fin de la línea). Se puede dividir
los valores de opciones largos sangrando las líneas posteriores a la primera.
Se puede obtener la lista de opciones válidas para una orden particular con la opción universal --help (ayuda), por ejemplo:
> python setup.py --help build_ext [...] Options for 'build_ext' command: --build-lib (-b) directory for compiled extension modules --build-temp (-t) directory for temporary files (build by-products) --inplace (-i) ignore build-lib and put compiled extensions into the source directory alongside your pure Python modules --include-dirs (-I) list of directories to search for header files --define (-D) C preprocessor macros to define --undef (-U) C preprocessor macros to undefine [...]
Observa que una opción que se escriba --pis-pas en la línea de órdenes se escribe pis_pas en los ficheros de configuración.
Supón, por ejemplo, que quieres que las extensiones se compilen ``en el sitio'': Hay una extensión pkg.ext y quieres que el fichero de la extensión compilada, ext.so en Unix, se genere en el mismo directorio de fuentes que los módulos de Python puro pkg.mod1 y pkg.mod2. Siempre puedes usar la opción --inplace de la línea de órdenes para asegurarlo:
python setup.py build_ext --inplace
build_ext
y recordar proporcionar --inplace.
Es más sencillo ``ajustar y olvidar'' esta opción incluyéndola en
setup.cfg, el fichero de configuración de esta distribución:
[build_ext] inplace=1
build_ext
como si no.
Si incluyes setup.cfg en la distribución de fuentes, también afectará a
las compilaciones del usuario final, lo que puede no resultar adecuado para
esta opción, ya que compilar siempre ``en el sitio'' las extensiones
dañaría la instalación de distribución de módulos. En ciertos casos concretos,
sin embargo, se construyen en su mismo directorio de instalación, así
que es una posibilidad que puede resultar útil (distribuir extensiones que
se han de compilar en el directorio de instalación casi siempre es inconveniente,
sin embargo).
Otro ejemplo: ciertas órdenes requieren muchas opciones que no cambian
de una ejecución a la siguiente, por ejemplo, bdist_rpm
requiere todo lo necesario para generar un fichero spec para generar
una distribución RPM. Parte de esta información viene del guion de instalación
y parte es generada automáticamente por las Distutils (la lista de ficheros
instalados, por ejemplo). Sin embargo, otra parte debe ser proporcionada
en forma de opciones de bdist_rpm
, tediosas de repetir
en la línea de órdenes para cada ejecución. Por ello, he aquí un fragmento
del propio setup.cfg de las Distutils:
[bdist_rpm] release = 1 packager = Greg Ward <gward@python.net> doc_files = CHANGES.txt README.txt USAGE.txt doc/ examples/