3. Escrevendo o arquivo de configuração de instalação

Frequentemente, não é possível escrever tudo o que é necessário para construir uma distribuição a priori: você pode precisar obter algumas informações do usuário, ou do sistema do usuário, para prosseguir. Contanto que essa informação seja bastante simples – uma lista de diretórios para pesquisar arquivos de cabeçalho C ou bibliotecas, por exemplo – então fornecer um arquivo de configuração, setup.cfg, para os usuários editarem é um maneira pouco custosa e fácil de solicitá-la. Os arquivos de configuração também permitem fornecer valores padrão para qualquer opção de comando, que o instalador pode então substituir na linha de comando ou editando o arquivo de configuração.

O arquivo de configuração de instalação é um meio-termo útil entre o script de instalação – que, idealmente, deveria ser utilizado sem que os instaladores se preocupem com seu conteúdo 1 – e a linha de comando para o script de instalação, que está fora do seu controle e inteiramente a cargo do instalador. Na verdade, setup.cfg (e quaisquer outros arquivos de configuração Distutils presentes no sistema de destino) são processados após o conteúdo do script de instalação, mas antes da linha de comando. Isso tem várias consequências úteis:

  • os instaladores podem substituir parte do que você colocou em setup.py editando setup.cfg

  • você pode fornecer valores iniciais fora do padrão para opções que não são facilmente definidas em setup.py

  • os instaladores podem substituir qualquer coisa em setup.cfg usando as opções de linha de comando para setup.py

A sintaxe básica do arquivo de configuração é simples:

[command]
option=value
...

sendo command um dos comandos Distutils (por exemplo build_py, install) e option uma das opções as quais o comando tem suporte. Qualquer número de opções pode ser fornecido para cada comando e qualquer número de seções de comando pode ser incluído no arquivo. As linhas em branco são ignoradas, assim como os comentários, que vão de um caractere '#' até o final da linha. Valores de opção longas podem ser divididos em várias linhas simplesmente identando as linhas de continuação.

Você pode descobrir a lista de opções suportadas por um comando específico com a opção universal --help, por exemplo.

$ 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
  --swig-opts          list of SWIG command line options
[...]

Note que uma opção escrita --foo-bar na linha de comando é escrita foo_bar nos arquivos de configuração.

Por exemplo, digamos que você queira que suas extensões sejam construídas “no local” – isto é, você tem uma extensão pkg.ext, e deseja o arquivo de extensão compilado (ext.so no Unix, digamos) para serem colocados no mesmo diretório fonte de seus módulos Python puros pkg.mod1 e pkg.mod2. Você sempre pode usar a opção --inplace na linha de comando para garantir isso:

python setup.py build_ext --inplace

Mas isso requer que você sempre especifique o comando build_ext explicitamente, e que lembre-se de fornecer --inplace. Uma maneira mais fácil é “definir e esquecer” esta opção, codificando-a em setup.cfg, o arquivo de configuração para esta distribuição:

[build_ext]
inplace=1

Isso afetará todas as construções desta distribuição de módulo, quer você especifique explicitamente ou não build_ext. Se você incluir um setup.cfg em sua distribuição fonte, isso também afetará as construções do usuário final – o que provavelmente é uma má ideia para esta opção, já que sempre construir extensões no local interromperia a instalação da distribuição de módulo. Em certos casos peculiares, porém, os módulos são construídos diretamente em seu diretório de instalação, portanto, esta é uma capacidade útil. (Distribuir extensões que esperam ser construídas em seu diretório de instalação é quase sempre uma má ideia, no entanto.)

Outro exemplo: certos comandos aceitam muitas opções que não mudam de execução para execução; por exemplo, bdist_rpm precisa saber tudo o que é necessário para gerar um arquivo “spec” para criar uma distribuição RPM. Algumas dessas informações vêm do script de configuração e outras são geradas automaticamente pelo Distutils (como a lista de arquivos instalados). Mas algumas delas devem ser fornecidas como opções para bdist_rpm, o que seria muito tedioso de fazer na linha de comando para cada execução. Portanto, aqui está um trecho de código do setup.cfg do próprio Distutils:

[bdist_rpm]
release = 1
packager = Greg Ward <gward@python.net>
doc_files = CHANGES.txt
            README.txt
            USAGE.txt
            doc/
            examples/

Note que a opção doc_files é simplesmente uma string separada por espaços em branco dividida em várias linhas para facilitar a leitura.

Ver também

Sintaxe dos arquivos de configuração em “Instalando Módulos Python”

Mais informações sobre os arquivos de configuração estão disponíveis no manual para administradores de sistema.

Notas de rodapé

1

Este ideal provavelmente não será alcançado até que a configuração automática seja totalmente suportada pelo Distutils.