3. Configurar o Python
**********************


3.1. Requisitos de construção
=============================

Recursos necessários para construir o CPython:

* Um compilador C11. Não são necessários recursos opcionais do C11.

* Suporte para números de ponto flutuante do IEEE 754 e Not-a-Number
  (NaN) de ponto flutuante.

* Suporte a threads.

* OpenSSL 1.1.1 ou mais novo para os módulos "ssl" e "hashlib".

* No Windows, é necessário o Microsoft Visual Studio 2017 ou
  posterior.

Alterado na versão 3.5: No Windows, é necessário o Visual Studio 2015
ou posterior.

Alterado na versão 3.6: Recursos selecionados do C99 agora são
necessários, como funções "<stdint.h>" e "static inline".

Alterado na versão 3.7: Suporte a threads e OpenSSL 1.0.2 agora são
necessários.

Alterado na versão 3.10: OpenSSL 1.1.1 agora é necessário.

Alterado na versão 3.11: Compilador C11, suporte a IEEE 754 e NaN
agora são necessários. No Windows, é necessário o Visual Studio 2017
ou posterior.

Veja também **PEP 7** "Guia de estilo para código C" e **PEP 11**
"Suporte do CPython a plataformas".


3.2. Arquivos gerados
=====================

Para reduzir as dependências de construção, o código-fonte do Python
contém vários arquivos gerados. Comandos para regenerar todos os
arquivos gerados:

   make regen-all
   make regen-stdlib-module-names
   make regen-limited-abi
   make regen-configure

O arquivo "Makefile.pre.in" documenta os arquivos gerados, suas
entradas e ferramentas usadas para regenerá-los. Procure por alvos
"regen-*" de make.


3.2.1. Script configure
-----------------------

O comando "make regen-configure" regera o arquivo "aclocal.m4" e o
script "configure" usando o shell script "Tools/build/regen-
configure.sh", o qual usa um contêiner Ubuntu para obter as mesmas
versões de ferramentas e ter uma saída reproduzível.

O contêiner é opcional, o seguinte comando pode ser executado
localmente:

   autoreconf -ivf -Werror

Os arquivos gerados podem mudar dependendo das versões exatas do
"autoconf-archive", "aclocal" e "pkg-config".


3.3. Opções de configuração
===========================

Liste todas as opções do "./configure" usando:

   ./configure --help

Veja também o "Misc/SpecialBuilds.txt" na distribuição de código-fonte
do Python.


3.3.1. Opções gerais
--------------------

--enable-loadable-sqlite-extensions

   Suporte a extensões carregáveis no módulo de extensão "_sqlite" (o
   padrão é não) do módulo "sqlite3".

   Veja o método "sqlite3.Connection.enable_load_extension()" do
   módulo "sqlite3".

   Adicionado na versão 3.6.

--disable-ipv6

   Desabilita suporte a IPv6 (habilitado por padrão se houver
   suporte), veja o módulo "socket".

--enable-big-digits=[15|30]

   Define o tamanho em bits dos dígitos de "int" do Python: 15 ou 30
   bits.

   Por padrão, o tamanho dos dígitos é 30.

   Define o "PYLONG_BITS_IN_DIGIT" para "15" ou "30".

   Veja "sys.int_info.bits_per_digit".

--with-suffix=SUFFIX

   Define o sufixo do executável do Python para *SUFFIX*.

   O sufixo padrão é ".exe" no Windows e macOS (executável
   "python.exe"), ".js" em nó Emscripten, ".html" em navegador
   Emscripten, ".wasm" em WASI e uma string vazia em outras
   plataformas (executável "python").

   Alterado na versão 3.11: O sufixo padrão na plataforma WASM é um
   entre ".js", ".html" ou ".wasm"

--with-tzpath=<list of absolute paths separated by pathsep>

   Seleciona o caminho de pesquisa de fuso horário padrão para
   "zoneinfo.TZPATH". Veja a Configuração de tempo de compilação do
   módulo "zoneinfo".

   Padrão: "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zone
   info:/etc/zoneinfo".

   Veja o separador de caminhos "os.pathsep".

   Adicionado na versão 3.9.

--without-decimal-contextvar

   Constrói o módulo de extensão "_decimal" usando um contexto local
   de thread ao invés de um contexto local de corrotina (padrão), veja
   o módulo "decimal".

   Veja "decimal.HAVE_CONTEXTVAR" e o módulo "contextvars".

   Adicionado na versão 3.9.

--with-dbmliborder=<list of backend names>

   Substitui a ordem de verificação de backends de banco de dados para
   o módulo "dbm"

   Um valor válido é uma string separada por dois pontos (":") com os
   nomes de backend:

   * "ndbm";

   * "gdbm";

   * "bdb".

--without-c-locale-coercion

   Desabilita a coerção de localidade C para uma localidade baseada em
   UTF-8 (ativada por padrão).

   Não define a macro "PY_COERCE_C_LOCALE".

   Consulte "PYTHONCOERCECLOCALE" e a **PEP 538**.

--without-freelists

   Desabilita todas as listas livres, exceto o singleton de tupla
   vazia.

   Adicionado na versão 3.11.

--with-platlibdir=DIRNAME

   Nome do diretório da biblioteca Python (o padrão é "lib").

   Fedora e SuSE usam "lib64" em plataformas de 64 bits.

   Veja "sys.platlibdir".

   Adicionado na versão 3.9.

--with-wheel-pkg-dir=PATH

   Diretório de pacotes de wheel usados pelo módulo "ensurepip"
   (nenhum por padrão).

   Algumas políticas de empacotamento de distribuição do Linux
   recomendam contra o empacotamento de dependências. Por exemplo, o
   Fedora instala pacotes wheel no diretório "/usr/share/python-
   wheels/" e não instala o pacote "ensurepip._bundled".

   Adicionado na versão 3.10.

--with-pkg-config=[check|yes|no]

   Se o configure deve usar **pkg-config** para detectar dependências
   de construção.

   * "check" (padrão): **pkg-config** é opcional

   * "yes": **pkg-config** é obrigatório

   * "no": configure não usa **pkg-config** mesmo quando presente

   Adicionado na versão 3.11.

--enable-pystats

   Ativa a coleta de estatísticas internas.

   As estatísticas serão despejadas em um arquivo arbitrário
   (provavelmente único) em "/tmp/py_stats/", ou "C:\temp\py_stats\"
   no Windows. Se aquele diretório não existir, os resultados serão
   enviados para stdout.

   Use "Tools/scripts/summarize_stats.py" para ler as estatísticas.

   Adicionado na versão 3.11.


3.3.2. Opções de WebAssembly
----------------------------

--with-emscripten-target=[browser|node]

   Define o "sabor" de construção para "wasm32-emscripten".

   * "browser" (padrão): pré-carrega stdlib mínima, MEMFS padrão.

   * "node": suporte a NODERAWFS e pthread.

   Adicionado na versão 3.11.

--enable-wasm-dynamic-linking

   Ativa o suporte de vinculação dinâmica para WASM.

   A vinculação dinâmica permite "dlopen". O tamanho do arquivo
   executável aumenta devido à eliminação limitada de código morto e
   recursos adicionais.

   Adicionado na versão 3.11.

--enable-wasm-pthreads

   Ativa o suporte a pthreads para WASM.

   Adicionado na versão 3.11.


3.3.3. Opções de instalação
---------------------------

--prefix=PREFIX

   Instala arquivos independentes de arquitetura em PREFIX. No Unix, o
   padrão é "/usr/local".

   Este valor pode ser recuperado em tempo de execução usando
   "sys.prefix".

   Como exemplo, pode-se usar "--prefix="$HOME/.local/"" para instalar
   um Python em seu diretório pessoal (home).

--exec-prefix=EPREFIX

   Instala arquivos dependentes de arquitetura no EPREFIX, o padrão é
   "--prefix".

   Este valor pode ser recuperado em tempo de execução usando
   "sys.exec_prefix".

--disable-test-modules

   Não constrói nem instala módulos de teste, como o pacote "test" ou
   o módulo de extensão "_testcapi" (construído e instalado por
   padrão).

   Adicionado na versão 3.10.

--with-ensurepip=[upgrade|install|no]

   Seleciona o comando "ensurepip" executado na instalação do Python:

   * "upgrade" (padrão): executa o comando "python -m ensurepip
     --altinstall --upgrade".

   * "install": executa o comando "python -m ensurepip --altinstall";

   * "no": não executa ensurepip;

   Adicionado na versão 3.6.


3.3.4. Opções de desempenho
---------------------------

Configurar o Python usando "--enable-optimizations --with-lto" (PGO +
LTO) é o recomendado para melhor desempenho. O sinalizador
experimental "--enable-bolt" também pode ser usado para melhorar o
desempenho.

--enable-optimizations

   Habilita a otimização guiada por perfil (PGO, do inglês Profile
   Guided Optimization) usando "PROFILE_TASK" (desabilitado por
   padrão).

   O compilador C Clang requer o programa "llvm-profdata" para PGO. No
   macOS, o GCC também exige: o GCC é apenas um apelido para o Clang
   no macOS.

   Desabilita também a interposição semântica no libpython se "--
   enable-shared" e GCC forem usados: adiciona "-fno-semantic-
   interposition" aos sinalizadores do compilador e do vinculador.

   Nota:

     Durante a construção, você poderá encontrar avisos do compilador
     sobre a indisponibilidade de dados de perfil para alguns arquivos
     fonte. Esses avisos são inofensivos, pois apenas um subconjunto
     do código é exercido durante a aquisição de dados de perfil. Para
     desativar esses avisos no Clang, suprima-os manualmente
     adicionando "-Wno-profile-instr-unprofiled" a "CFLAGS".

   Adicionado na versão 3.6.

   Alterado na versão 3.10: Usa "-fno-semantic-interposition" no GCC.

PROFILE_TASK

   Variável de ambiente usada no Makefile: argumentos de linha de
   comando do Python para a tarefa de geração de PGO.

   Padrão: "-m test --pgo --timeout=$(TESTTIMEOUT)".

   Adicionado na versão 3.8.

--with-lto=[full|thin|no|yes]

   Habilita o otimização em tempo de vinculação (LTO, do inglês Link
   Time Optimization) em qualquer compilação (desabilitado por
   padrão).

   O compilador C Clang requer "llvm-ar" para LTO ("ar" no macOS), bem
   como um vinculador compatível com LTO ("ld.gold" ou "lld").

   Adicionado na versão 3.6.

   Adicionado na versão 3.11: Para usar o recurso ThinLTO, use "--
   with-lto=thin" no Clang.

   Alterado na versão 3.12: Usa ThinLTO como política de otimização
   padrão no Clang se o compilador aceitar o sinalizador.

--enable-bolt

   Habilita o uso do otimizador binário pós-vinculação BOLT
   (desabilitado por padrão).

   BOLT faz parte do projeto LLVM, mas nem sempre está incluído em
   suas distribuições binárias. Este sinalizador requer que "llvm-
   bolt" e "merge-fdata" estejam disponíveis.

   BOLT ainda é um projeto relativamente novo, então este sinalizador
   deve ser considerado experimental por enquanto. Como esta
   ferramenta opera em código de máquina, seu sucesso depende de uma
   combinação do ambiente de construção + os outros argumentos de
   configuração de otimização + a arquitetura da CPU, e nem todas as
   combinações são suportadas. Versões do BOLT anteriores ao LLVM 16
   são conhecidas por travar o BOLT em alguns cenários. O uso do LLVM
   16 ou mais recente para otimização do BOLT é fortemente
   incentivado.

   As variáveis "BOLT_INSTRUMENT_FLAGS" e "BOLT_APPLY_FLAGS" do
   **configure** podem ser definidas para substituir o conjunto padrão
   de argumentos para **llvm-bolt** para instrumentar e aplicar dados
   BOLT aos binários , respectivamente.

   Adicionado na versão 3.12.

--with-computed-gotos

   Habilita "gotos" computados no laço de avaliação (habilitado por
   padrão em compiladores suportados).

--without-pymalloc

   Desabilita o alocador de memória especializado do Python pymalloc
   (habilitado por padrão).

   Veja também a variável de ambiente "PYTHONMALLOC".

--without-doc-strings

   Desabilita as strings de documentação estática para reduzir o
   consumo de memória (habilitado por padrão). As strings de
   documentação definidas em Python não são afetadas.

   Não define a macro "WITH_DOC_STRINGS".

   Veja a macro "PyDoc_STRVAR()".

--enable-profiling

   Habilita o perfil de código a nível C com "gprof" (desabilitado por
   padrão).

--with-strict-overflow

   Adiciona "-fstrict-overflow" aos sinalizadores do compilador C (por
   padrão adicionamos "-fno-strict-overflow").


3.3.5. Compilação de depuração do Python
----------------------------------------

Uma compilação de depuração é Python compilada com a opção de
configuração "--with-pydebug".

Efeitos de uma compilação de depuração:

* Exibe todos os avisos por padrão: a lista de filtros de aviso padrão
  está vazia no módulo "warnings".

* Adiciona "d" a "sys.abiflags".

* Adiciona a função "sys.gettotalrefcount()".

* Adiciona a opção de linha de comando "-X showrefcount".

* Adiciona a opção de linha de comando "-d" e a variável de ambiente
  "PYTHONDEBUG" para depurar o analisador sintático.

* Adiciona suporte para a variável "__lltrace__": habilita o
  rastreamento de baixo nível no laço de avaliação de bytecode se a
  variável estiver definida.

* Instala ganchos de depuração nos alocadores de memória para detectar
  estouro de buffer e outros erros de memória.

* Define as macros "Py_DEBUG" e "Py_REF_DEBUG".

* Adiciona verificações de tempo de execução: código cercado por
  "#ifdef Py_DEBUG" e "#endif". Habilita as asserções "assert(...)" e
  "_PyObject_ASSERT(...)": não define a macro "NDEBUG" (veja também a
  configuração "--with-assertions" opção). Principais verificações de
  tempo de execução:

  * Adiciona verificações de sanidade nos argumentos da função.

  * Objetos Unicode e int são criados com sua memória preenchida com
    um padrão para detectar o uso de objetos não inicializados.

  * Garante que as funções que podem limpar ou substituir a exceção
    atual não sejam chamadas com uma exceção levantada.

  * Verifica se as funções desalocadoras não alteram a exceção atual.

  * O coletor de lixo (função "gc.collect()") executa algumas
    verificações básicas na consistência dos objetos.

  * A macro "Py_SAFE_DOWNCAST()" verifica o underflow e o overflow de
    inteiros ao fazer o downcast de tipos largos para tipos estreitos.

Veja também o Modo de Desenvolvimento do Python e a opção de
configuração "--with-trace-refs".

Alterado na versão 3.8: Compilações de lançamento e compilações de
depuração agora são compatíveis com ABI: definir a macro "Py_DEBUG"
não implica mais na macro "Py_TRACE_REFS" (consulte a opção "--with-
trace-refs"), que apresenta a única incompatibilidade de ABI.


3.3.6. Opções de depuração
--------------------------

--with-pydebug

   Construção de depuração do Python: define a macro "Py_DEBUG"
   (desabilitada por padrão).

--with-trace-refs

   Habilita referências de rastreamento para fins de depuração
   (desabilitado por padrão).

   Efeitos:

   * Define a macro "Py_TRACE_REFS".

   * Adiciona a função "sys.getobjects()".

   * Adiciona a variável de ambiente "PYTHONDUMPREFS".

   Esta construção não é compatível com ABI com a construção de
   lançamento (construção padrão) ou construção de depuração (macros
   "Py_DEBUG" e "Py_REF_DEBUG").

   Adicionado na versão 3.8.

--with-assertions

   Constrói com asserções C habilitadas (o padrão é não):
   "assert(...);" e "_PyObject_ASSERT(...);".

   Se definido, a macro "NDEBUG" não é definida na variável do
   compilador "OPT".

   Veja também a opção "--with-pydebug" (construção de depuração) que
   também habilita asserções.

   Adicionado na versão 3.6.

--with-valgrind

   Habilita suporte ao Valgrind (o padrão é não).

--with-dtrace

   Habilita suporte ao DTrace (o padrão é não).

   Veja Instrumentando o CPython com DTrace e SystemTap.

   Adicionado na versão 3.6.

--with-address-sanitizer

   Habilita o detector de erros de memória AddressSanitizer, "asan" (o
   padrão é não).

   Adicionado na versão 3.6.

--with-memory-sanitizer

   Habilita o detector de erros de alocação do MemorySanitizer, "msan"
   (o padrão é não).

   Adicionado na versão 3.6.

--with-undefined-behavior-sanitizer

   Habilita o detector de comportamento indefinido
   UndefinedBehaviorSanitizer, "ubsan" (o padrão é não).

   Adicionado na versão 3.6.


3.3.7. Opções da ligação
------------------------

--enable-shared

   Habilita a construção de uma biblioteca Python compartilhada:
   "libpython" (o padrão é não).

--without-static-libpython

   Não constrói "libpythonMAJOR.MINOR.a" e não instala "python.o"
   (construído e habilitado por padrão).

   Adicionado na versão 3.10.


3.3.8. Opções da biblioteca
---------------------------

--with-libs='lib1 ...'

   Vincula bibliotecas adicionais (o padrão é não).

--with-system-expat

   Constrói o módulo "pyexpat" usando uma biblioteca "expat" instalada
   (o padrão é não).

--with-system-libmpdec

   Constrói o módulo de extensão "_decimal" usando uma biblioteca
   "mpdec" instalada, veja o módulo "decimal" (o padrão é não).

   Adicionado na versão 3.3.

--with-readline=editline

   Usa a biblioteca "editline" para backend do módulo "readline".

   Define a macro "WITH_EDITLINE".

   Adicionado na versão 3.10.

--without-readline

   Não constrói o módulo "readline" (construído por padrão).

   Não define a macro "HAVE_LIBREADLINE".

   Adicionado na versão 3.10.

--with-libm=STRING

   Substitui a biblioteca matemática "libm" por *STRING* (o padrão
   depende do sistema).

--with-libc=STRING

   Substitui a biblioteca C "libc" por *STRING* (o padrão depende do
   sistema).

--with-openssl=DIR

   Raiz do diretório OpenSSL.

   Adicionado na versão 3.7.

--with-openssl-rpath=[no|auto|DIR]

   Define o diretório da biblioteca de tempo de execução (rpath) para
   bibliotecas OpenSSL:

   * "no" (padrão): não define o rpath;

   * "auto": detecta automaticamente o rpath de "--with-openssl" e
     "pkg-config";

   * *DIR*: define um rpath explícito.

   Adicionado na versão 3.10.


3.3.9. Opções de segurança
--------------------------

--with-hash-algorithm=[fnv|siphash13|siphash24]

   Seleciona o algoritmo de hash para usar em "Python/pyhash.c":

   * "siphash13" (padrão);

   * "siphash24";

   * "fnv".

   Adicionado na versão 3.4.

   Adicionado na versão 3.11: "siphash13" é adicionado e é o novo
   padrão.

--with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2

   Módulos embutidos de hash

   * "md5";

   * "sha1";

   * "sha256";

   * "sha512";

   * "sha3" (com shake);

   * "blake2".

   Adicionado na versão 3.9.

--with-ssl-default-suites=[python|openssl|STRING]

   Substitui a string dos conjuntos de criptografia padrão do OpenSSL:

   * "python" (padrão): use a seleciona preferida do Python;

   * "openssl": mantém inalterados os padrões do OpenSSL;

   * *STRING*: usa uma string personalizada

   Veja o módulo "ssl".

   Adicionado na versão 3.7.

   Alterado na versão 3.10: As configurações "python" e *STRING*
   também definem TLS 1.2 como versão mínima do protocolo.


3.3.10. Opções do macOS
-----------------------

Veja "Mac/README.rst".

--enable-universalsdk

--enable-universalsdk=SDKDIR

   Cria uma construção binária universal. *SDKDIR* especifica qual SDK
   do macOS deve ser usado para executar a construção (o padrão é
   não).

--enable-framework

--enable-framework=INSTALLDIR

   Cria um Python.framework em vez de uma instalação tradicional do
   Unix. O *INSTALLDIR* opcional especifica o caminho de instalação (o
   padrão é não).

--with-universal-archs=ARCH

   Especifica o tipo de binário universal que deve ser criado. Esta
   opção só é válida quando "--enable-universalsdk" está definido.

   Opções:

   * "universal2" (x86-64 e arm64);

   * "32-bit" (PPC e i386);

   * "64-bit"  (PPC64 e x86-64);

   * "3-way" (i386, PPC e x86-64);

   * "intel" (i386 e x86-64);

   * "intel-32" (i386);

   * "intel-64" (x86-64);

   * "all"  (PPC, i386, PPC64 e x86-64).

   Observe que os valores para este item de configuração *não* são os
   mesmos que os identificadores usados para rodas binárias universais
   no macOS. Veja o Guia de Empacotamento do Python para detalhes
   sobre as tags de compatibilidade de plataforma de empacotamento
   usadas no macOS

--with-framework-name=FRAMEWORK

   Especifica o nome do framework python no macOS válido apenas quando
   "--enable-framework" está definido (padrão: "Python").


3.3.11. Opções de compilação cruzada
------------------------------------

A compilação cruzada, também conhecida como construção cruzada, pode
ser usada para construir Python para outra arquitetura ou plataforma
de CPU. A compilação cruzada requer um interpretador Python para a
plataforma de construção. A versão do Python para construção deve
corresponder à versão do Python da compilação cruzada do host.

--build=BUILD

   configura para construir em BUILD, geralmente adivinhado por
   **config.guess**.

--host=HOST

   faz compilação cruzada para construir programas para executar no
   HOST (plataforma de destino)

--with-build-python=path/to/python

   caminho para construir o binário "python" para compilação cruzada

   Adicionado na versão 3.11.

CONFIG_SITE=file

   Uma variável de ambiente que aponta para um arquivo com
   substituições de configuração.

   Exemplo de arquivo *config.site*:

      # config.site-aarch64
      ac_cv_buggy_getaddrinfo=no
      ac_cv_file__dev_ptmx=yes
      ac_cv_file__dev_ptc=no

Exemplo de compilação cruzada:

   CONFIG_SITE=config.site-aarch64 ../configure \
       --build=x86_64-pc-linux-gnu \
       --host=aarch64-unknown-linux-gnu \
       --with-build-python=../x86_64/python


3.4. Sistema de Construção Python
=================================


3.4.1. Arquivos principais do sistema de construção
---------------------------------------------------

* "configure.ac" => "configure";

* "Makefile.pre.in" => "Makefile" (criado por "configure");

* "pyconfig.h" (criado por "configure");

* "Modules/Setup": Extensões C construídas pelo Makefile usando o
  shell script "Module/makesetup";


3.4.2. Principais etapas de construção
--------------------------------------

* Arquivos C (".c") são construídos como arquivos objeto (".o").

* Uma biblioteca estática "libpython" (".a") é criada a partir de
  arquivos de objetos.

* "python.o" e a biblioteca estática "libpython" estão vinculadas ao
  programa final "python".

* Extensões C são construídas pelo Makefile (veja "Modules/Setup").


3.4.3. Alvos principais do Makefile
-----------------------------------

* "make": Build Python with the standard library.

* "make platform:": build the "python" program, but don't build the
  standard library extension modules.

* "make profile-opt": build Python using Profile Guided Optimization
  (PGO). You can use the configure "--enable-optimizations" option to
  make this the default target of the "make" command ("make all" or
  just "make").

* "make buildbottest": Build Python and run the Python test suite, the
  same way than buildbots test Python. Set "TESTTIMEOUT" variable (in
  seconds) to change the test timeout (1200 by default: 20 minutes).

* "make install": Build and install Python.

* "make regen-all": Regenerate (almost) all generated files; "make
  regen-stdlib-module-names" and "autoconf" must be run separately for
  the remaining generated files.

* "make clean": Remove built files.

* "make distclean": Same than "make clean", but remove also files
  created by the configure script.


3.4.4. Extensões C
------------------

Algumas extensões C são construídas como módulos embutidos, como o
módulo "sys". Eles são construídos com a macro "Py_BUILD_CORE_BUILTIN"
definida. Módulos embutidos não possuem nenhum atributo "__file__":

   >>> import sys
   >>> sys
   <module 'sys' (built-in)>
   >>> sys.__file__
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   AttributeError: module 'sys' has no attribute '__file__'

Outras extensões C são construídas como bibliotecas dinâmicas, como o
módulo "_asyncio". Eles são construídos com a macro
"Py_BUILD_CORE_MODULE" definida. Exemplo no Linux x86-64:

   >>> import _asyncio
   >>> _asyncio
   <module '_asyncio' from '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'>
   >>> _asyncio.__file__
   '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'

"Modules/Setup" é usado para gerar alvos Makefile para construir
extensões C. No início dos arquivos, as extensões C são construídas
como módulos embutidos. Extensões definidas após o marcador "*shared*"
são construídas como bibliotecas dinâmicas.

As macros "PyAPI_FUNC()", "PyAPI_DATA()" e "PyMODINIT_FUNC" de
"Include/exports.h" são definidas de forma diferente dependendo se a
macro "Py_BUILD_CORE_MODULE" está definida:

* Usa "Py_EXPORTED_SYMBOL" se "Py_BUILD_CORE_MODULE" estiver definido

* Do contrário, usa "Py_IMPORTED_SYMBOL".

Se a macro "Py_BUILD_CORE_BUILTIN" for usada por engano em uma
extensão C construída como uma biblioteca compartilhada, sua função
"PyInit_*xxx*()" não será exportada, causando um "ImportError" na
importação.


3.5. Sinalizadores do compilador e do vinculador
================================================

Opções definidas pelo script "./configure" e variáveis de ambiente e
usadas por "Makefile".


3.5.1. Sinalizadores do pré-processador
---------------------------------------

CONFIGURE_CPPFLAGS

   Valor da variável "CPPFLAGS" passado para o script "./configure".

   Adicionado na versão 3.6.

CPPFLAGS

   Sinalizadores de pré-processador C++ / (Objective) C, p.ex.
   "-I*include_dir*" se você tiver cabeçalhos em um diretório não
   padrão *include_dir*.

   Tanto "CPPFLAGS" quanto "LDFLAGS" precisam conter o valor do shell
   para poder construir módulos de extensão usando os diretórios
   especificados nas variáveis de ambiente.

BASECPPFLAGS

   Adicionado na versão 3.4.

PY_CPPFLAGS

   Sinalizadores extras de pré-processador adicionados para construir
   os arquivos de objeto do interpretador.

   Padrão: "$(BASECPPFLAGS) -I. -I$(srcdir)/Include
   $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)".

   Adicionado na versão 3.2.


3.5.2. Sinalizadores do compilador
----------------------------------

CC

   Comando do compilador C.

   Exemplo: "gcc -pthread".

CXX

   Comando do compilador C++.

   Exemplo: "g++ -pthread".

CFLAGS

   Sinalizadores do compilador C.

CFLAGS_NODIST

   "CFLAGS_NODIST" é usado para construir o interpretador e extensões
   C da stdlib. Use-o quando um sinalizador do compilador *não* deve
   fazer parte de "CFLAGS" depois que o Python estiver instalado
   (gh-65320).

   Em particular, "CFLAGS" não deve conter:

   * o sinalizador do compilador "-I" (para definir o caminho de
     pesquisa para arquivos incluídos). Os sinalizadores "-I" são
     processadas da esquerda para a direita, e quaisquer sinalizadores
     em "CFLAGS" terão precedência sobre os sinalizadores "-I"
     fornecidos pelo usuário e pelo pacote.

   * sinalizadores de segurança como "-Werror" porque as distribuições
     não podem controlar se os pacotes instalados pelos usuários estão
     em conformidade com esses padrões elevados.

   Adicionado na versão 3.5.

COMPILEALL_OPTS

   Opções passadas para a linha de comando "compileall" ao construir
   arquivos PYC em "make install". Padrão: "-j0".

   Adicionado na versão 3.12.

EXTRA_CFLAGS

   Sinalizadores extra do compilador C.

CONFIGURE_CFLAGS

   Valor da variável "CFLAGS" passado para o script "./configure".

   Adicionado na versão 3.2.

CONFIGURE_CFLAGS_NODIST

   Valor da variável "CFLAGS_NODIST" passado para o script
   "./configure".

   Adicionado na versão 3.5.

BASECFLAGS

   Sinalizadores base do compilador.

OPT

   Sinalizadores de otimização.

CFLAGS_ALIASING

   Sinalizadores de alias estritos ou não estritos usados para
   compilar "Python/dtoa.c".

   Adicionado na versão 3.7.

CCSHARED

   Sinalizadores de compilador usados para construir uma biblioteca
   compartilhada.

   Por exemplo, "-fPIC" é usado no Linux e no BSD.

CFLAGSFORSHARED

   Sinalizadores extras de C adicionados para construir os arquivos de
   objeto do interpretador.

   Padrão: "$(CCSHARED)" quando "--enable-shared" é usado, ou uma
   string vazia caso contrário.

PY_CFLAGS

   Padrão: "$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS)
   $(EXTRA_CFLAGS)".

PY_CFLAGS_NODIST

   Padrão: "$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST)
   -I$(srcdir)/Include/internal".

   Adicionado na versão 3.5.

PY_STDMODULE_CFLAGS

   Sinalizadores do C usados para construir os arquivos de objeto do
   interpretador.

   Padrão: "$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS)
   $(CFLAGSFORSHARED)".

   Adicionado na versão 3.7.

PY_CORE_CFLAGS

   Padrão: "$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE".

   Adicionado na versão 3.2.

PY_BUILTIN_MODULE_CFLAGS

   Sinalizadores do compilador para construir um módulo de extensão de
   biblioteca padrão como um módulo embutido, como o módulo "posix".

   Padrão: "$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN".

   Adicionado na versão 3.8.

PURIFY

   Comando de Purify. Purify é um programa depurador de memória.

   Padrão: string vazia (não usada).


3.5.3. Sinalizadores do vinculador
----------------------------------

LINKCC

   Comando do vinculador usado para construir programas como "python"
   e "_testembed".

   Padrão: "$(PURIFY) $(CC)".

CONFIGURE_LDFLAGS

   Valor da variável "LDFLAGS" passado para o script "./configure".

   Evite atribuir "CFLAGS", "LDFLAGS", etc. para que os usuários
   possam usá-los na linha de comando para anexar a esses valores sem
   pisotear os valores predefinidos.

   Adicionado na versão 3.2.

LDFLAGS_NODIST

   "LDFLAGS_NODIST" é usado da mesma maneira que "CFLAGS_NODIST".
   Use-o quando um sinalizador de vinculador *não* fizer parte de
   "LDFLAGS" depois que o Python estiver instalado (gh-65320).

   Em particular, "LDFLAGS" não deve conter:

   * o sinalizador do compilador "-L" (para definir o caminho de
     pesquisa para arquivos incluídos). Os sinalizadores "-L" são
     processadas da esquerda para a direita, e quaisquer sinalizadores
     em "LDFLAGS" terão precedência sobre os sinalizadores "-L"
     fornecidos pelo usuário e pelo pacote.

CONFIGURE_LDFLAGS_NODIST

   Valor da variável "LDFLAGS_NODIST" passado para o script
   "./configure".

   Adicionado na versão 3.8.

LDFLAGS

   Sinalizadores do vinculador, p.ex. "-L*lib_dir*", se você tiver
   bibliotecas em um diretório não padrão *lib_dir*.

   Tanto "CPPFLAGS" quanto "LDFLAGS" precisam conter o valor do shell
   para poder construir módulos de extensão usando os diretórios
   especificados nas variáveis de ambiente.

LIBS

   Sinalizadores do vinculador para passar bibliotecas para o
   vinculador ao vincular o executável Python.

   Exemplo: "-lrt".

LDSHARED

   Comando para construir uma biblioteca compartilhada.

   Padrão: "@LDSHARED@ $(PY_LDFLAGS)".

BLDSHARED

   Comando para construir a biblioteca compartilhada "libpython".

   Padrão: "@BLDSHARED@ $(PY_CORE_LDFLAGS)".

PY_LDFLAGS

   Padrão: "$(CONFIGURE_LDFLAGS) $(LDFLAGS)".

PY_LDFLAGS_NODIST

   Padrão: "$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)".

   Adicionado na versão 3.8.

PY_CORE_LDFLAGS

   Sinalizadores de vinculador usados para construir os arquivos de
   objeto do interpretador.

   Adicionado na versão 3.8.
