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


3.1. Requisitos de compilación
==============================

Características necesarias para compilar CPython:

* Un compilador C11. Características opcionales de C11 no son
  necesarias.

* Support for IEEE 754 floating-point numbers and floating-point
  Not-a-Number (NaN).

* Soporte para hilos.

* OpenSSL 1.1.1 o posterior para los módulos "ssl" y "hashlib".

* En Windows, se necesita Microsoft Visual Studio 2017 o posterior.

Distinto en la versión 3.5: En Windows, se necesita Visual Studio 2015
o posterior.

Distinto en la versión 3.6: Ahora se necesitan características
seleccionadas de C99, como "<stdint.h>" y funciones "static inline".

Distinto en la versión 3.7: Ahora se necesita soporte de hilos y
OpenSSL 1.0.2.

Distinto en la versión 3.10: Ahora se necesita OpenSSL 1.1.1.

Distinto en la versión 3.11: Ahora se requiere compatibilidad del
compilador C11, IEEE 754 y NaN. En Windows, se necesita Visual Studio
2017 o posterior.

Ver también **PEP 7** "Style Guide for C Code" y **PEP 11** "CPython
platform support".


3.2. Archivos generados
=======================

Para reducir las dependencias de compilación, el código fuente de
Python contiene varios archivos generados. Comandos para regenerar
todos los archivos generados:

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

El archivo "Makefile.pre.in" documenta archivos generados, sus
entradas y las herramientas que se usaron para regenerarlos. Busque
los objetivos make "regen-*".


3.2.1. configure script
-----------------------

The "make regen-configure" command regenerates the "aclocal.m4" file
and the "configure" script using the "Tools/build/regen-configure.sh"
shell script which uses an Ubuntu container to get the same tools
versions and have a reproducible output.

The container is optional, the following command can be run locally:

   autoreconf -ivf -Werror

The generated files can change depending on the exact "autoconf-
archive", "aclocal" and "pkg-config" versions.


3.3. Configurar opciones
========================

Enumerar todas las opciones del script "./configure" usando:

   ./configure --help

Consultar también "Misc/SpecialBuilds.txt" en la distribución fuente
de Python.


3.3.1. Opciones generales
-------------------------

--enable-loadable-sqlite-extensions

   Admite extensiones cargables en el módulo de extensión "_sqlite"
   (el valor por defecto es no) del módulo "sqlite3".

   Consultar el método "sqlite3.Connection.enable_load_extension()"
   del módulo "sqlite3".

   Added in version 3.6.

--disable-ipv6

   Deshabilita la compatibilidad con IPv6 (habilitada de forma
   predeterminada si es compatible), consulte el módulo "socket".

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

   Define el tamaño en bits de los dígitos "int" de Python: 15 o 30
   bits.

   Por defecto, el tamaño del dígito es 30.

   Define el "PYLONG_BITS_IN_DIGIT" en "15" o "30".

   Consultar "sys.int_info.bits_per_digit".

--with-suffix=SUFFIX

   Establece el sufijo ejecutable de Python en *SUFFIX*.

   El sufijo predeterminado es ".exe" en Windows y macOS (ejecutable
   "python.exe"), ".js" en el nodo Emscripten, ".html" en el navegador
   Emscripten, ".wasm" en WASI y una cadena vacía en otras plataformas
   (ejecutable "python").

   Distinto en la versión 3.11: El sufijo predeterminado en la
   plataforma WASM es uno de ".js", ".html" o ".wasm".

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

   Selecciona la ruta de búsqueda de zona horaria predeterminada para
   "zoneinfo.TZPATH". Consultar la Configuración en tiempo de
   compilación del módulo "zoneinfo".

   Por defecto: "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib
   /zoneinfo:/etc/zoneinfo".

   Consultar separador de rutas "os.pathsep" .

   Added in version 3.9.

--without-decimal-contextvar

   Construye el módulo de extensión "_decimal" usando un contexto
   local de hilos en lugar de un contexto local de corutinas
   (predeterminado), consultar el módulo "decimal".

   Consultar "decimal.HAVE_CONTEXTVAR" y el módulo "contextvars".

   Added in version 3.9.

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

   Sobrescribe el orden para verificar los de las bases datos para el
   módulo "dbm"

   Un valor válido es una cadena de caracteres separada por dos puntos
   (":") con los nombres de los backends:

   * "ndbm";

   * "gdbm";

   * "bdb".

--without-c-locale-coercion

   Deshabilita la coerción de configuración regional C a una
   configuración regional basada en UTF-8 (habilitada de forma
   predeterminada).

   No define la macro "PY_COERCE_C_LOCALE".

   Consultar "PYTHONCOERCECLOCALE" y el **PEP 538**.

--without-freelists

   Deshabilita todas las listas libres excepto la tupla única vacía.

   Added in version 3.11.

--with-platlibdir=DIRNAME

   Nombre del directorio de la biblioteca de Python (por defecto es
   "lib").

   Fedora y SuSE usan "lib64" en plataformas 64-bit.

   Consultar "sys.platlibdir".

   Added in version 3.9.

--with-wheel-pkg-dir=PATH

   Directorio de los paquetes *wheel* usados por el módulo "ensurepip"
   (ninguno por defecto)

   Algunas políticas de empaquetado de distribución de Linux
   recomiendan no empaquetar dependencias. Por ejemplo, Fedora instala
   paquetes *wheel* en el directorio "/usr/share/python-wheels/" y no
   instala el paquete "ensurepip._bundled".

   Added in version 3.10.

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

   Si configure debe usar **pkg-config** para detectar dependencias de
   compilación.

   * "check" (predeterminado): **pkg-config** es opcional

   * "yes": **pkg-config** es obligatorio

   * "no": configure no usa **pkg-config** incluso cuando está
     presente

   Added in version 3.11.

--enable-pystats

   Active la recopilación de estadísticas internas.

   Las estadísticas se volcarán en un archivo arbitrario
   (probablemente único) en "/tmp/py_stats/" o "C:\temp\py_stats\" en
   Windows. Si ese directorio no existe, los resultados se imprimirán
   en la salida estándar.

   Usa "Tools/scripts/summarize_stats.py" para leer las estadísticas.

   Added in version 3.11.


3.3.2. Opciones de WebAssembly
------------------------------

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

   Establezca el tipo de compilación para "wasm32-emscripten".

   * "browser" (predeterminado): precarga mínima stdlib, MEMFS
     predeterminado.

   * "node": soporte para NODERAWFS y pthread.

   Added in version 3.11.

--enable-wasm-dynamic-linking

   Active la compatibilidad con enlaces dinámicos para WASM.

   La vinculación dinámica habilita "dlopen". El tamaño del archivo
   del ejecutable aumenta debido a la eliminación limitada de código
   muerto y características adicionales.

   Added in version 3.11.

--enable-wasm-pthreads

   Active la compatibilidad con pthreads para WASM.

   Added in version 3.11.


3.3.3. Opciones de instalación
------------------------------

--prefix=PREFIX

   Instala archivos independientes de la arquitectura en PREFIX. En
   Unix, el valor predeterminado es "/usr/local".

   Este valor se puede recuperar en tiempo de ejecución al usar
   "sys.prefix".

   Como ejemplo, se puede utilizar "--prefix="$HOME/.local/"" para
   instalar Python en su directorio raíz.

--exec-prefix=EPREFIX

   Instala archivos independientes de la arquitectura en EPREFIX, el
   valor predeterminado es "--prefix".

   Este valor se puede recuperar en tiempo de ejecución al usar
   "sys.exec_prefix".

--disable-test-modules

   No construya ni instale módulos de prueba, como el paquete "test" o
   el módulo de extensión "_testcapi" (construido e instalado por
   defecto).

   Added in version 3.10.

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

   Selecciona el comando "ensurepip" que se ejecuta en la instalación
   de Python:

   * "upgrade" (por defecto): ejecutar el comando "python -m ensurepip
     --altinstall --upgrade".

   * "install": ejecutar el comando "python -m ensurepip
     --altinstall";

   * "no": no ejecuta ensurepip;

   Added in version 3.6.


3.3.4. Opciones de desempeño
----------------------------

Se recomienda configurar Python usando "--enable-optimizations --with-
lto" (PGO + LTO) para obtener el mejor rendimiento. El indicador
experimental "--enable-bolt" también se puede usar para mejorar el
rendimiento.

--enable-optimizations

   Habilite la Optimización Guiada por Perfiles (*PGO* por sus siglas
   en inglés) usando "PROFILE_TASK" (deshabilitado de forma
   predeterminada).

   El compilador de C Clang requiere el programa "llvm-profdata" para
   PGO. En macOS, GCC también lo requiere: GCC es solo un alias de
   Clang en macOS.

   Desactiva también la interposición semántica en libpython si se usa
   "--enable-shared" y GCC: agregar "-fno-semantic-interposition" a
   los flags del compilador y del enlazador.

   Nota:

     During the build, you may encounter compiler warnings about
     profile data not being available for some source files. These
     warnings are harmless, as only a subset of the code is exercised
     during profile data acquisition. To disable these warnings on
     Clang, manually suppress them by adding "-Wno-profile-instr-
     unprofiled" to "CFLAGS".

   Added in version 3.6.

   Distinto en la versión 3.10: Usar "-fno-semantic-interposition" en
   GCC.

PROFILE_TASK

   Variable de entorno utilizada en el Makefile: argumentos de la
   línea de comando Python para la tarea de generación de PGO.

   Por defecto: "-m test --pgo --timeout=$(TESTTIMEOUT)".

   Added in version 3.8.

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

   Habilita la Optimización de Tiempo de Enlace (*LTO* por sus siglas
   en inglés) en cualquier compilación (deshabilitado de forma
   predeterminada).

   El compilador de C Clang requiere "llvm-ar" para LTO ("ar" en
   macOS), así como un enlazador compatible con LTO ("ld.gold" o
   "lld").

   Added in version 3.6.

   Added in version 3.11: Para usar la función ThinLTO, use "--with-
   lto=thin" en Clang.

   Distinto en la versión 3.12: Utiliza ThinLTO como política de
   optimización predeterminada en Clang si el compilador acepta el
   indicador.

--enable-bolt

   Habilita el uso del optimizador binario post-enlace BOLT
   (deshabilitado de forma predeterminada).

   BOLT es parte del proyecto LLVM pero no siempre se incluye en sus
   distribuciones binarias. Este indicador necesita que "llvm-bolt" y
   "merge-fdata" estén disponibles.

   BOLT aún es un proyecto bastante nuevo, así que este indicador
   debería considerarse experimental por ahora. Debido a que esta
   herramienta opera en código máquina, su éxito depende de una
   combinación del entorno de compilación + los otros argumentos de
   configuración de optimización + la arquitectura del CPU, y no todas
   las combinaciones son compatibles. Se sabe que las versiones de
   BOLT anteriores a LLVM 16 bloquean BOLT en algunos escenarios. Se
   recomienda encarecidamente utilizar LLVM 16 o posterior para la
   optimización de BOLT.

   Las variables **configure** "BOLT_INSTRUMENT_FLAGS" y
   "BOLT_APPLY_FLAGS" se pueden definir para sobrescribir el conjunto
   predeterminado de argumentos de **llvm-bolt** para instrumentar y
   aplicar datos BOLT a binarios, respectivamente.

   Added in version 3.12.

--with-computed-gotos

   Habilita los *gotos* calculados en el ciclo de evaluación
   (habilitado de forma predeterminada en los compiladores
   compatibles).

--without-pymalloc

   Deshabilita el asignador de memoria especializado de Python
   pymalloc (habilitado de forma predeterminada).

   Consultar también la variable de entorno "PYTHONMALLOC".

--without-doc-strings

   Deshabilita las cadenas de caracteres de documentación estáticas
   para reducir el espacio de memoria (habilitado de forma
   predeterminada). Las cadenas de caracteres de documentación
   definidas en Python no se ven afectadas.

   No define la macro "WITH_DOC_STRINGS".

   Consultar la macro "PyDoc_STRVAR()".

--enable-profiling

   Habilita el análisis de rendimiento de código (*profiling*) de
   nivel C con "gprof" (deshabilitado de forma predeterminada).

--with-strict-overflow

   Agrega "-fstrict-overflow" a los indicadores del compilador de C
   (el valor predeterminado que agregamos en su lugar es "-fno-strict-
   overflow").


3.3.5. Compilación de depuración de Python
------------------------------------------

Una compilación de depuración es Python construido con la opción de
configuración "--with-pydebug".

Efectos de una compilación de depuración:

* Muestra todas las advertencias de forma predeterminada: la lista de
  filtros de advertencia predeterminados está vacía en el módulo
  "warnings".

* Agrega "d" a "sys.abiflags".

* Agrega la función "sys.gettotalrefcount()".

* Agrega la opción de línea de comando "-X showrefcount".

* Agrega la opción de línea de comando "-d" y la variable de entorno
  "PYTHONDEBUG" para depurar el analizador.

* Agregue soporte para la variable "__lltrace__": habilite el
  seguimiento de bajo nivel en el ciclo de evaluación del código de
  bytes si la variable está definida.

* Instala ganchos de depuración en los asignadores de memoria para
  detectar el desbordamiento del búfer y otros errores de memoria.

* Define las macros "Py_DEBUG" y "Py_REF_DEBUG".

* Agregue verificaciones de tiempo de ejecución: código rodeado por
  "#ifdef Py_DEBUG" y "#endif". Habilite las aserciones "assert(...)"
  y "_PyObject_ASSERT(...)": no configure la macro "NDEBUG" (vea
  también la opción de configuración "--with-assertions").
  Comprobaciones principales de tiempo de ejecución:

  * Agregue controles de sanidad en los argumentos de la función.

  * Los objetos unicode e int se crean con su memoria completa con un
    patrón para detectar el uso de objetos no inicializados.

  * Asegúrese de que las funciones que pueden borrar o reemplazar la
    excepción actual no se invocan con una excepción lanzada.

  * Verifique que las funciones de desasignador no cambien la
    excepción actual.

  * El recolector de basura (función "gc.collect()") ejecuta algunas
    comprobaciones básicas sobre la consistencia de los objetos.

  * La macro "Py_SAFE_DOWNCAST()" comprueba el subdesbordamiento y el
    desbordamiento de enteros al realizar una conversión descendente
    de tipos anchos a tipos estrechos.

Consultar también Modo de Desarrollo de Python y la opción de
configuración "--with-trace-refs".

Distinto en la versión 3.8: Las compilaciones de lanzamiento y las
compilaciones de depuración ahora son compatibles con ABI: definir la
macro "Py_DEBUG" ya no implica la macro "Py_TRACE_REFS" (consultar la
opción "--with-trace-refs"), que presenta la única Incompatibilidad
ABI.


3.3.6. Opciones de depuración
-----------------------------

--with-pydebug

   Compila Python en modo de depuración: define la macro "Py_DEBUG"
   (deshabilitada por defecto).

--with-trace-refs

   Habilita las referencias de seguimiento con fines de depuración
   (deshabilitado de forma predeterminada).

   Efectos:

   * Define la macro "Py_TRACE_REFS".

   * Add "sys.getobjects()" function.

   * Agrega la variable de entorno "PYTHONDUMPREFS".

   Esta compilación no es ABI compatible con la compilación de
   lanzamiento (compilación predeterminada) o la compilación de
   depuración (macros "Py_DEBUG" y "Py_REF_DEBUG").

   Added in version 3.8.

--with-assertions

   Compila con las aserciones de C habilitadas (el valor
   predeterminado es no): "assert(...);" y "_PyObject_ASSERT(...);".

   Si se establece, la macro "NDEBUG" no está definida en la variable
   del compilador "OPT".

   Consultar también la opción "--with-pydebug" (compilación de
   depuración) que también habilita las aserciones.

   Added in version 3.6.

--with-valgrind

   Habilite la compatibilidad con Valgrind (el valor predeterminado es
   no).

--with-dtrace

   Habilite la compatibilidad con DTrace (el valor predeterminado es
   no).

   Consultar Instrumentación de CPython con DTrace y SystemTap.

   Added in version 3.6.

--with-address-sanitizer

   Habilita el detector de errores de memoria AddressSanitizer, "asan"
   (el valor predeterminado es no).

   Added in version 3.6.

--with-memory-sanitizer

   Habilita el detector de errores de asignación MemorySanitizer,
   "msan" (el valor predeterminado es no).

   Added in version 3.6.

--with-undefined-behavior-sanitizer

   Habilita el detector de comportamiento indefinido
   UndefinedBehaviorSanitizer, "ubsan" (el valor predeterminado es
   no).

   Added in version 3.6.


3.3.7. Opciones del enlazador
-----------------------------

--enable-shared

   Habilita la compilación de una biblioteca compartida de Python
   :"libpython" (el valor predeterminado es no).

--without-static-libpython

   No compila "libpythonMAJOR.MINOR.a" y no instala "python.o"
   (compilado y habilitado de forma predeterminada).

   Added in version 3.10.


3.3.8. Opciones de bibliotecas
------------------------------

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

   Enlace con bibliotecas adicionales (el valor predeterminado es no).

--with-system-expat

   Compila el módulo "pyexpat" usando la biblioteca instalada "expat"
   instalada (por defecto es no).

--with-system-libmpdec

   Compila el módulo de extensión "_decimal" usando la biblioteca
   instalada "mpdec", ver el módulo "decimal" (el valor predeterminado
   es no).

   Added in version 3.3.

--with-readline=editline

   Utilice la biblioteca "editline" para el backend del módulo
   "readline".

   Define la macro "WITH_EDITLINE".

   Added in version 3.10.

--without-readline

   No cree el módulo "readline" (es construido por defecto).

   No defina la macro "HAVE_LIBREADLINE".

   Added in version 3.10.

--with-libm=STRING

   Sobreescribe la biblioteca matemática "libm" a *STRING* (el valor
   predeterminado es dependiente del sistema).

--with-libc=STRING

   Sobreescribe la biblioteca C "libc" a *STRING* (el valor
   predeterminado es dependiente del sistema).

--with-openssl=DIR

   Raíz del directorio OpenSSL.

   Added in version 3.7.

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

   Configura el directorio de la biblioteca en tiempo de ejecución
   (rpath) para las bibliotecas OpenSSL:

   * "no" (por defecto): no establece rpath;

   * "auto": autodetecta rpath desde "--with-openssl" y "pkg-config";

   * *DIR*: establece un rpath explícito.

   Added in version 3.10.


3.3.9. Opciones de seguridad
----------------------------

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

   Selecciona el algoritmo hash para usar en "Python/pyhash.c":

   * "siphash13" (por defecto);

   * "siphash24";

   * "fnv".

   Added in version 3.4.

   Added in version 3.11: Se agrega "siphash13" y es el nuevo valor
   predeterminado.

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

   Módulos hash incorporados:

   * "md5";

   * "sha1";

   * "sha256";

   * "sha512";

   * "sha3" (con shake);

   * "blake2".

   Added in version 3.9.

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

   Sobreescribe la cadena de conjuntos de cifrado predeterminada de
   OpenSSL:

   * "python" (por defecto): usa la selección principal de Python;

   * "openssl": deja intactos los valores predeterminados de OpenSSL;

   * *STRING*: usa una cadena de caracteres personalizada

   Consultar el módulo "ssl".

   Added in version 3.7.

   Distinto en la versión 3.10: Las configuraciones "python" y
   *STRING* también establecen TLS 1.2 como versión mínima del
   protocolo.


3.3.10. Opciones macOS
----------------------

Ver "Mac/README.rst".

--enable-universalsdk

--enable-universalsdk=SDKDIR

   Crea una compilación binaria universal. *SDKDIR* especifica qué
   macOS SDK debe usarse para realizar la compilación (el valor
   predeterminado es no).

--enable-framework

--enable-framework=INSTALLDIR

   Crear un Python.framework en lugar de una instalación Unix
   tradicional. Opcionalmente *INSTALLDIR* especifica la ruta de
   instalación (el valor predeterminado es no).

--with-universal-archs=ARCH

   Especifique el tipo de binario universal que se debe crear. Esta
   opción solo es válida cuando se establece "--enable-universalsdk".

   Opciones:

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

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

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

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

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

   * "intel-32" (i386);

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

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

   Note that values for this configuration item are *not* the same as
   the identifiers used for universal binary wheels on macOS. See the
   Python Packaging User Guide for details on the packaging platform
   compatibility tags used on macOS

--with-framework-name=FRAMEWORK

   Especifica el nombre del framework de Python en macOS, solo es
   válido cuando "--enable-framework" está configurada (por defecto:
   "Python").


3.3.11. Opciones de compilación cruzada
---------------------------------------

La compilación cruzada, también conocida como construcción cruzada, se
puede usar para construir Python para otra plataforma o arquitectura
de CPU. La compilación cruzada requiere un intérprete de Python para
la plataforma de compilación. La versión de Python de compilación debe
coincidir con la versión de Python host de compilación cruzada.

--build=BUILD

   configure para construir en BUILD, generalmente adivinado por
   **config.guess**.

--host=HOST

   compilación cruzada para crear programas que se ejecuten en HOST
   (plataforma de destino)

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

   ruta para construir el binario "python" para compilación cruzada

   Added in version 3.11.

CONFIG_SITE=file

   Una variable de entorno que apunta a un archivo con anulaciones de
   configuración.

   Example *config.site* file:

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

Ejemplo de compilación 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 compilación Python
==================================


3.4.1. Archivos principales del sistema de compilación
------------------------------------------------------

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

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

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

* "Modules/Setup": Extensiones C creadas por Makefile usando el script
  de shell "Module/makesetup";


3.4.2. Pasos principales de compilación
---------------------------------------

* Los archivos C (".c") se crean como archivos objeto (".o").

* La biblioteca estática "libpython" (".a") se crea a a partir de
  archivos de objetos.

* "python.o" y la biblioteca estática "libpython" están enlazadas al
  programa final "python".

* Las extensiones C son creadas por Makefile (ver "Modules/Setup").


3.4.3. Objetivos principales de Makefile
----------------------------------------

* "make": Compilar Python con la biblioteca estándar.

* "make platform:": compila el programa "python", pero no construye
  los módulos de extensión de la biblioteca estándar.

* "make profile-opt": compila Python utilizando la optimización guiada
  por perfiles (PGO). Puede usar la opción de configuración "--enable-
  optimizations" para hacer que este sea el objetivo predeterminado
  del comando "make" ("make all" o simplemente "make").

* "make buildbottest": compila Python y ejecuta el conjunto de pruebas
  de Python, de la misma manera que los buildbots prueban Python.
  Configure la variable "TESTTIMEOUT" (en segundos) para cambiar el
  tiempo de espera de la prueba (1200 por defecto: 20 minutos).

* "make install": Compila e instala Python.

* "make regen-all": regenera (casi) todos los archivos generados;
  "make regen-stdlib-module-names" y "autoconf" deben ejecutarse por
  separado para los archivos generados restantes.

* "make clean": elimina los archivos compilados.

* "make distclean": Similar a "make clean", pero elimina también los
  archivos creados por el script de configuración.


3.4.4. Extensiones C
--------------------

Some C extensions are built as built-in modules, like the "sys"
module. They are built with the "Py_BUILD_CORE_BUILTIN" macro defined.
Built-in modules have no "__file__" attribute:

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

Other C extensions are built as dynamic libraries, like the "_asyncio"
module. They are built with the "Py_BUILD_CORE_MODULE" macro defined.
Example on 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" se usa para generar objetivos Makefile para compilar
extensiones C. Al principio de los archivos, las extensiones C se
crean como módulos incorporados. Las extensiones definidas después del
marcador "*shared*" se crean como bibliotecas dinámicas.

Las macros "PyAPI_FUNC()", "PyAPI_DATA()" y "PyMODINIT_FUNC" de
"Include/exports.h" se definen de manera diferente dependiendo si es
definida la macro "Py_BUILD_CORE_MODULE":

* Use "Py_EXPORTED_SYMBOL" si "Py_BUILD_CORE_MODULE" es definido

* Use "Py_IMPORTED_SYMBOL" de lo contrario.

Si la macro "Py_BUILD_CORE_BUILTIN" se usa por error en una extensión
de C compilada como una biblioteca compartida, su función
"PyInit_*xxx*()" no se exporta, provocando un "ImportError" en la
importación.


3.5. Banderas de compilador y vinculación
=========================================

Opciones establecidas por el script "./configure" y las variables de
entorno y utilizadas por "Makefile".


3.5.1. Banderas del preprocesador
---------------------------------

CONFIGURE_CPPFLAGS

   Valor de la variable "CPPFLAGS" pasado al script "./configure".

   Added in version 3.6.

CPPFLAGS

   (Objetivo) Indicadores del preprocesador C/C++, p. ej.
   "-I*include_dir*" si tiene encabezados en un directorio no estándar
   *include_dir*.

   Ambos "CPPFLAGS" y "LDFLAGS" necesitan contener el valor del shell
   para poder compilar módulos de extensión usando los directorios
   especificados en las variables de entorno.

BASECPPFLAGS

   Added in version 3.4.

PY_CPPFLAGS

   Se agregaron indicadores de preprocesador adicionales para
   construir los archivos de objeto del intérprete.

   Por defecto: "$(BASECPPFLAGS) -I. -I$(srcdir)/Include
   $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)".

   Added in version 3.2.


3.5.2. Banderas del compilador
------------------------------

CC

   Comando del compilador C.

   Ejemplo: "gcc -pthread".

CXX

   Comando del compilador de C++.

   Ejemplo: "g++ -pthread".

CFLAGS

   Banderas del compilador de C.

CFLAGS_NODIST

   "CFLAGS_NODIST" se usa para compilar el intérprete y las
   extensiones stdlib C. Úselo cuando un indicador del compilador *no*
   deba ser parte de "CFLAGS" una vez que Python esté instalado
   (gh-65320).

   En particular, "CFLAGS" no debe contener:

   * el indicador del compilador "-I" (para configurar la ruta de
     búsqueda de archivos de inclusión). Los indicadores "-I" se
     procesan de izquierda a derecha, y cualquier indicador en
     "CFLAGS" tendrá prioridad sobre los indicadores "-I"
     proporcionados por el usuario y el paquete.

   * banderas de endurecimiento como "-Werror" porque las
     distribuciones no pueden controlar si los paquetes instalados por
     los usuarios cumplen con estándares tan elevados.

   Added in version 3.5.

COMPILEALL_OPTS

   Las opciones pasadas a la línea de comando "compileall" al crear
   archivos PYC en "make install". El valor predeterminado: "-j0".

   Added in version 3.12.

EXTRA_CFLAGS

   Banderas adicionales del compilador de C.

CONFIGURE_CFLAGS

   Valor de la variable "CFLAGS" pasada al script "./configure".

   Added in version 3.2.

CONFIGURE_CFLAGS_NODIST

   Valor de la variable "CFLAGS_NODIST" pasada al script
   "./configure".

   Added in version 3.5.

BASECFLAGS

   Banderas base del compilador.

OPT

   Banderas de optimización.

CFLAGS_ALIASING

   Banderas de alias estrictos o no estrictos que se utilizan para
   compilar "Python/dtoa.c".

   Added in version 3.7.

CCSHARED

   Banderas del compilador que se utilizan para compilar una
   biblioteca compartida.

   Por ejemplo, "-fPIC" se usa en Linux y BSD.

CFLAGSFORSHARED

   Se agregaron banderas C adicionales para compilar los archivos de
   objeto del intérprete.

   Por defecto: "$(CCSHARED)" cuando se usa "--enable-shared", o una
   cadena de caracteres vacía en caso contrario.

PY_CFLAGS

   Por defecto: "$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS)
   $(EXTRA_CFLAGS)".

PY_CFLAGS_NODIST

   Por defecto: "$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST)
   -I$(srcdir)/Include/internal".

   Added in version 3.5.

PY_STDMODULE_CFLAGS

   Banderas de C que se utilizan para compilar los archivos de objeto
   del intérprete.

   Por defecto: "$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS)
   $(CFLAGSFORSHARED)".

   Added in version 3.7.

PY_CORE_CFLAGS

   Por defecto: "$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE".

   Added in version 3.2.

PY_BUILTIN_MODULE_CFLAGS

   Banderas del compilador para construir un módulo de extensión de
   biblioteca estándar como un módulo incorporado, como el módulo
   "posix".

   Por defecto: "$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN".

   Added in version 3.8.

PURIFY

   Comando Purify. Purify es un programa de depuración de memoria.

   Por defecto: cadena de caracteres vacía (no utilizado).


3.5.3. Banderas de vinculación
------------------------------

LINKCC

   Comando de vinculación usado para compilar programas como "python"
   y "_testembed".

   Por defecto: "$(PURIFY) $(CC)".

CONFIGURE_LDFLAGS

   Valor de la variable "LDFLAGS" pasada al script "./configure".

   Evite asignar "CFLAGS", "LDFLAGS", etc. así los usuarios pueden
   usarlos en la línea de comando para agregar estos valores sin pisar
   los valores preestablecidos.

   Added in version 3.2.

LDFLAGS_NODIST

   "LDFLAGS_NODIST" se usa de la misma manera que "CFLAGS_NODIST".
   Usar cuando un indicador del enlazador *no* deba ser parte de
   "LDFLAGS" una vez que Python esté instalado (gh-65320).

   En particular, "LDFLAGS" no debe contener:

   * el indicador del compilador "-L" (para establecer la ruta de
     búsqueda de bibliotecas). Los indicadores "-L" se procesan de
     izquierda a derecha, y cualquier indicador en "LDFLAGS" tendrá
     prioridad sobre los indicadores "-L" proporcionados por el
     usuario y el paquete.

CONFIGURE_LDFLAGS_NODIST

   Valor de la variable "LDFLAGS_NODIST" pasado al script
   "./configure".

   Added in version 3.8.

LDFLAGS

   Indicadores de vinculación, p. ej. "-L*lib_dir*" si tiene
   bibliotecas en un directorio no estándar *lib_dir*.

   Ambos "CPPFLAGS" y "LDFLAGS" necesitan contener el valor del shell
   para poder compilar módulos de extensión usando los directorios
   especificados en las variables de entorno.

LIBS

   Banderas de vinculación para pasar bibliotecas al vinculador al
   enlazar el ejecutable de Python.

   Ejemplo: "-lrt".

LDSHARED

   Comando para construir una biblioteca compartida.

   Por defecto: "@LDSHARED@ $(PY_LDFLAGS)".

BLDSHARED

   Comando para compilar la biblioteca compartida "libpython".

   Por defecto: "@BLDSHARED@ $(PY_CORE_LDFLAGS)".

PY_LDFLAGS

   Por defecto: "$(CONFIGURE_LDFLAGS) $(LDFLAGS)".

PY_LDFLAGS_NODIST

   Por defecto: "$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)".

   Added in version 3.8.

PY_CORE_LDFLAGS

   Banderas de vinculación que se utilizan para crear los archivos de
   objeto del intérprete.

   Added in version 3.8.
