****************
Configure Python
****************

.. highlight:: sh

Build Requirements
==================

Features and minimum versions required to build CPython:

* A `C11 <https://en.cppreference.com/w/c/11>`_ compiler. `Optional C11
  features
  <https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features>`_
  are not required.

* On Windows, Microsoft Visual Studio 2017 or later is required.

* Support for `IEEE 754 <https://en.wikipedia.org/wiki/IEEE_754>`_ floating
  point numbers and `floating point Not-a-Number (NaN)
  <https://en.wikipedia.org/wiki/NaN#Floating_point>`_.

* Support for threads.

* OpenSSL 1.1.1 is the minimum version and OpenSSL 3.0.9 is the recommended
  minimum version for the :mod:`ssl` and :mod:`hashlib` extension modules.

* SQLite 3.15.2 for the :mod:`sqlite3` extension module.

* Tcl/Tk 8.5.12 for the :mod:`tkinter` module.

* Autoconf 2.71 and aclocal 1.16.4 are required to regenerate the
  :file:`configure` script.

.. versionchanged:: 3.1
   Tcl/Tk version 8.3.1 is now required.

.. versionchanged:: 3.5
   On Windows, Visual Studio 2015 or later is now required.
   Tcl/Tk version 8.4 is now required.

.. versionchanged:: 3.6
   Selected C99 features are now required, like ``<stdint.h>`` and ``static
   inline`` functions.

.. versionchanged:: 3.7
   Thread support and OpenSSL 1.0.2 are now required.

.. versionchanged:: 3.10
   OpenSSL 1.1.1 is now required.
   Require SQLite 3.7.15.

.. versionchanged:: 3.11
   C11 compiler, IEEE 754 and NaN support are now required.
   On Windows, Visual Studio 2017 or later is required.
   Tcl/Tk version 8.5.12 is now required for the :mod:`tkinter` module.

.. versionchanged:: 3.13
   Autoconf 2.71, aclocal 1.16.4 and SQLite 3.15.2 are now required.

See also :pep:`7` "Style Guide for C Code" and :pep:`11` "CPython platform
support".


Generated files
===============

To reduce build dependencies, Python source code contains multiple generated
files. Commands to regenerate all generated files::

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

The ``Makefile.pre.in`` file documents generated files, their inputs, and tools used
to regenerate them. Search for ``regen-*`` make targets.

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.


.. _configure-options:

Configure Options
=================

List all :file:`configure` script options using::

    ./configure --help

See also the :file:`Misc/SpecialBuilds.txt` in the Python source distribution.

General Options
---------------

.. option:: --enable-loadable-sqlite-extensions

   Support loadable extensions in the :mod:`!_sqlite` extension module (default
   is no) of the :mod:`sqlite3` module.

   See the :meth:`sqlite3.Connection.enable_load_extension` method of the
   :mod:`sqlite3` module.

   .. versionadded:: 3.6

.. option:: --disable-ipv6

   Disable IPv6 support (enabled by default if supported), see the
   :mod:`socket` module.

.. option:: --enable-big-digits=[15|30]

   Define the size in bits of Python :class:`int` digits: 15 or 30 bits.

   By default, the digit size is 30.

   Define the ``PYLONG_BITS_IN_DIGIT`` to ``15`` or ``30``.

   See :data:`sys.int_info.bits_per_digit <sys.int_info>`.

.. option:: --with-suffix=SUFFIX

   Set the Python executable suffix to *SUFFIX*.

   The default suffix is ``.exe`` on Windows and macOS (``python.exe``
   executable), ``.js`` on Emscripten node, ``.html`` on Emscripten browser,
   ``.wasm`` on WASI, and an empty string on other platforms (``python``
   executable).

   .. versionchanged:: 3.11
      The default suffix on WASM platform is one of ``.js``, ``.html``
      or ``.wasm``.

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

   Select the default time zone search path for :const:`zoneinfo.TZPATH`.
   See the :ref:`Compile-time configuration
   <zoneinfo_data_compile_time_config>` of the :mod:`zoneinfo` module.

   Default: ``/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo``.

   See :data:`os.pathsep` path separator.

   .. versionadded:: 3.9

.. option:: --without-decimal-contextvar

   Build the ``_decimal`` extension module using a thread-local context rather
   than a coroutine-local context (default), see the :mod:`decimal` module.

   See :const:`decimal.HAVE_CONTEXTVAR` and the :mod:`contextvars` module.

   .. versionadded:: 3.9

.. option:: --with-dbmliborder=<list of backend names>

   Override order to check db backends for the :mod:`dbm` module

   A valid value is a colon (``:``) separated string with the backend names:

   * ``ndbm``;
   * ``gdbm``;
   * ``bdb``.

.. option:: --without-c-locale-coercion

   Disable C locale coercion to a UTF-8 based locale (enabled by default).

   Don't define the ``PY_COERCE_C_LOCALE`` macro.

   See :envvar:`PYTHONCOERCECLOCALE` and the :pep:`538`.

.. option:: --without-freelists

   Disable all freelists except the empty tuple singleton.

   .. versionadded:: 3.11

.. option:: --with-platlibdir=DIRNAME

   Python library directory name (default is ``lib``).

   Fedora and SuSE use ``lib64`` on 64-bit platforms.

   See :data:`sys.platlibdir`.

   .. versionadded:: 3.9

.. option:: --with-wheel-pkg-dir=PATH

   Directory of wheel packages used by the :mod:`ensurepip` module
   (none by default).

   Some Linux distribution packaging policies recommend against bundling
   dependencies. For example, Fedora installs wheel packages in the
   ``/usr/share/python-wheels/`` directory and don't install the
   :mod:`!ensurepip._bundled` package.

   .. versionadded:: 3.10

.. option:: --with-pkg-config=[check|yes|no]

   Whether configure should use :program:`pkg-config` to detect build
   dependencies.

   * ``check`` (default): :program:`pkg-config` is optional
   * ``yes``: :program:`pkg-config` is mandatory
   * ``no``: configure does not use :program:`pkg-config` even when present

   .. versionadded:: 3.11

.. option:: --enable-pystats

   Turn on internal Python performance statistics gathering.

   By default, statistics gathering is off. Use ``python3 -X pystats`` command
   or set ``PYTHONSTATS=1`` environment variable to turn on statistics
   gathering at Python startup.

   At Python exit, dump statistics if statistics gathering was on and not
   cleared.

   Effects:

   * Add :option:`-X pystats <-X>` command line option.
   * Add :envvar:`!PYTHONSTATS` environment variable.
   * Define the ``Py_STATS`` macro.
   * Add functions to the :mod:`sys` module:

     * :func:`!sys._stats_on`: Turns on statistics gathering.
     * :func:`!sys._stats_off`: Turns off statistics gathering.
     * :func:`!sys._stats_clear`: Clears the statistics.
     * :func:`!sys._stats_dump`: Dump statistics to file, and clears the statistics.

   The statistics will be dumped to a arbitrary (probably unique) file in
   ``/tmp/py_stats/`` (Unix) or ``C:\temp\py_stats\`` (Windows). If that
   directory does not exist, results will be printed on stderr.

   Use ``Tools/scripts/summarize_stats.py`` to read the stats.

   Statistics:

   * Opcode:

     * Specialization: success, failure, hit, deferred, miss, deopt, failures;
     * Execution count;
     * Pair count.

   * Call:

     * Inlined Python calls;
     * PyEval calls;
     * Frames pushed;
     * Frame object created;
     * Eval calls: vector, generator, legacy, function VECTORCALL, build class,
       slot, function "ex", API, method.

   * Object:

     * incref and decref;
     * interpreter incref and decref;
     * allocations: all, 512 bytes, 4 kiB, big;
     * free;
     * to/from free lists;
     * dictionary materialized/dematerialized;
     * type cache;
     * optimization attempts;
     * optimization traces created/executed;
     * uops executed.

   * Garbage collector:

     * Garbage collections;
     * Objects visited;
     * Objects collected.

   .. versionadded:: 3.11

.. _free-threading-build:

.. option:: --disable-gil

   Enables **experimental** support for running Python without the
   :term:`global interpreter lock` (GIL): free threading build.

   Defines the ``Py_GIL_DISABLED`` macro and adds ``"t"`` to
   :data:`sys.abiflags`.

   See :pep:`703` "Making the Global Interpreter Lock Optional in CPython".

   .. versionadded:: 3.13

.. option:: PKG_CONFIG

   Path to ``pkg-config`` utility.

.. option:: PKG_CONFIG_LIBDIR
.. option:: PKG_CONFIG_PATH

   ``pkg-config`` options.


C compiler options
------------------

.. option:: CC

   C compiler command.

.. option:: CFLAGS

   C compiler flags.

.. option:: CPP

   C preprocessor command.

.. option:: CPPFLAGS

   C preprocessor flags, e.g. :samp:`-I{include_dir}`.


Linker options
--------------

.. option:: LDFLAGS

   Linker flags, e.g. :samp:`-L{library_directory}`.

.. option:: LIBS

   Libraries to pass to the linker, e.g. :samp:`-l{library}`.

.. option:: MACHDEP

   Name for machine-dependent library files.


Options for third-party dependencies
------------------------------------

.. versionadded:: 3.11

.. option:: BZIP2_CFLAGS
.. option:: BZIP2_LIBS

   C compiler and linker flags to link Python to ``libbz2``, used by :mod:`bz2`
   module, overriding ``pkg-config``.

.. option:: CURSES_CFLAGS
.. option:: CURSES_LIBS

   C compiler and linker flags for ``libncurses`` or ``libncursesw``, used by
   :mod:`curses` module, overriding ``pkg-config``.

.. option:: GDBM_CFLAGS
.. option:: GDBM_LIBS

   C compiler and linker flags for ``gdbm``.

.. option:: LIBB2_CFLAGS
.. option:: LIBB2_LIBS

   C compiler and linker flags for ``libb2`` (:ref:`BLAKE2 <hashlib-blake2>`),
   used by :mod:`hashlib` module, overriding ``pkg-config``.

.. option:: LIBEDIT_CFLAGS
.. option:: LIBEDIT_LIBS

   C compiler and linker flags for ``libedit``, used by :mod:`readline` module,
   overriding ``pkg-config``.

.. option:: LIBFFI_CFLAGS
.. option:: LIBFFI_LIBS

   C compiler and linker flags for ``libffi``, used by :mod:`ctypes` module,
   overriding ``pkg-config``.

.. option:: LIBLZMA_CFLAGS
.. option:: LIBLZMA_LIBS

   C compiler and linker flags for ``liblzma``, used by :mod:`lzma` module,
   overriding ``pkg-config``.

.. option:: LIBREADLINE_CFLAGS
.. option:: LIBREADLINE_LIBS

   C compiler and linker flags for ``libreadline``, used by :mod:`readline`
   module, overriding ``pkg-config``.

.. option:: LIBSQLITE3_CFLAGS
.. option:: LIBSQLITE3_LIBS

   C compiler and linker flags for ``libsqlite3``, used by :mod:`sqlite3`
   module, overriding ``pkg-config``.

.. option:: LIBUUID_CFLAGS
.. option:: LIBUUID_LIBS

   C compiler and linker flags for ``libuuid``, used by :mod:`uuid` module,
   overriding ``pkg-config``.

.. option:: PANEL_CFLAGS
.. option:: PANEL_LIBS

   C compiler and Linker flags for PANEL, overriding ``pkg-config``.

   C compiler and linker flags for ``libpanel`` or ``libpanelw``, used by
   :mod:`curses.panel` module, overriding ``pkg-config``.

.. option:: TCLTK_CFLAGS
.. option:: TCLTK_LIBS

   C compiler and linker flags for TCLTK, overriding ``pkg-config``.

.. option:: ZLIB_CFLAGS
.. option:: ZLIB_LIBS

   C compiler and linker flags for ``libzlib``, used by :mod:`gzip` module,
   overriding ``pkg-config``.


WebAssembly Options
-------------------

.. option:: --with-emscripten-target=[browser|node]

   Set build flavor for ``wasm32-emscripten``.

   * ``browser`` (default): preload minimal stdlib, default MEMFS.
   * ``node``: NODERAWFS and pthread support.

   .. versionadded:: 3.11

.. option:: --enable-wasm-dynamic-linking

   Turn on dynamic linking support for WASM.

   Dynamic linking enables ``dlopen``. File size of the executable
   increases due to limited dead code elimination and additional features.

   .. versionadded:: 3.11

.. option:: --enable-wasm-pthreads

   Turn on pthreads support for WASM.

   .. versionadded:: 3.11


Install Options
---------------

.. option:: --prefix=PREFIX

   Install architecture-independent files in PREFIX. On Unix, it
   defaults to :file:`/usr/local`.

   This value can be retrieved at runtime using :data:`sys.prefix`.

   As an example, one can use ``--prefix="$HOME/.local/"`` to install
   a Python in its home directory.

.. option:: --exec-prefix=EPREFIX

   Install architecture-dependent files in EPREFIX, defaults to :option:`--prefix`.

   This value can be retrieved at runtime using :data:`sys.exec_prefix`.

.. option:: --disable-test-modules

   Don't build nor install test modules, like the :mod:`test` package or the
   :mod:`!_testcapi` extension module (built and installed by default).

   .. versionadded:: 3.10

.. option:: --with-ensurepip=[upgrade|install|no]

   Select the :mod:`ensurepip` command run on Python installation:

   * ``upgrade`` (default): run ``python -m ensurepip --altinstall --upgrade``
     command.
   * ``install``: run ``python -m ensurepip --altinstall`` command;
   * ``no``: don't run ensurepip;

   .. versionadded:: 3.6


Performance options
-------------------

Configuring Python using ``--enable-optimizations --with-lto`` (PGO + LTO) is
recommended for best performance. The experimental ``--enable-bolt`` flag can
also be used to improve performance.

.. option:: --enable-optimizations

   Enable Profile Guided Optimization (PGO) using :envvar:`PROFILE_TASK`
   (disabled by default).

   The C compiler Clang requires ``llvm-profdata`` program for PGO. On
   macOS, GCC also requires it: GCC is just an alias to Clang on macOS.

   Disable also semantic interposition in libpython if ``--enable-shared`` and
   GCC is used: add ``-fno-semantic-interposition`` to the compiler and linker
   flags.

   .. note::

      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 :envvar:`CFLAGS`.

   .. versionadded:: 3.6

   .. versionchanged:: 3.10
      Use ``-fno-semantic-interposition`` on GCC.

.. envvar:: PROFILE_TASK

   Environment variable used in the Makefile: Python command line arguments for
   the PGO generation task.

   Default: ``-m test --pgo --timeout=$(TESTTIMEOUT)``.

   .. versionadded:: 3.8

   .. versionchanged:: 3.13
      Task failure is no longer ignored silently.

.. option:: --with-lto=[full|thin|no|yes]

   Enable Link Time Optimization (LTO) in any build (disabled by default).

   The C compiler Clang requires ``llvm-ar`` for LTO (``ar`` on macOS), as well
   as an LTO-aware linker (``ld.gold`` or ``lld``).

   .. versionadded:: 3.6

   .. versionadded:: 3.11
      To use ThinLTO feature, use ``--with-lto=thin`` on Clang.

   .. versionchanged:: 3.12
      Use ThinLTO as the default optimization policy on Clang if the compiler accepts the flag.

.. option:: --enable-bolt

   Enable usage of the `BOLT post-link binary optimizer
   <https://github.com/llvm/llvm-project/tree/main/bolt>`_ (disabled by
   default).

   BOLT is part of the LLVM project but is not always included in their binary
   distributions. This flag requires that ``llvm-bolt`` and ``merge-fdata``
   are available.

   BOLT is still a fairly new project so this flag should be considered
   experimental for now. Because this tool operates on machine code its success
   is dependent on a combination of the build environment + the other
   optimization configure args + the CPU architecture, and not all combinations
   are supported.
   BOLT versions before LLVM 16 are known to crash BOLT under some scenarios.
   Use of LLVM 16 or newer for BOLT optimization is strongly encouraged.

   The :envvar:`!BOLT_INSTRUMENT_FLAGS` and :envvar:`!BOLT_APPLY_FLAGS`
   :program:`configure` variables can be defined to override the default set of
   arguments for :program:`llvm-bolt` to instrument and apply BOLT data to
   binaries, respectively.

   .. versionadded:: 3.12

.. option:: BOLT_APPLY_FLAGS

   Arguments to ``llvm-bolt`` when creating a `BOLT optimized binary
   <https://github.com/facebookarchive/BOLT>`_.

   .. versionadded:: 3.12

.. option:: BOLT_INSTRUMENT_FLAGS

   Arguments to ``llvm-bolt`` when instrumenting binaries.

   .. versionadded:: 3.12

.. option:: --with-computed-gotos

   Enable computed gotos in evaluation loop (enabled by default on supported
   compilers).

.. option:: --without-mimalloc

   Disable the fast mimalloc allocator :ref:`mimalloc <mimalloc>`
   (enabled by default).

   See also :envvar:`PYTHONMALLOC` environment variable.

.. option:: --without-pymalloc

   Disable the specialized Python memory allocator :ref:`pymalloc <pymalloc>`
   (enabled by default).

   See also :envvar:`PYTHONMALLOC` environment variable.

.. option:: --without-doc-strings

   Disable static documentation strings to reduce the memory footprint (enabled
   by default). Documentation strings defined in Python are not affected.

   Don't define the ``WITH_DOC_STRINGS`` macro.

   See the ``PyDoc_STRVAR()`` macro.

.. option:: --enable-profiling

   Enable C-level code profiling with ``gprof`` (disabled by default).

.. option:: --with-strict-overflow

   Add ``-fstrict-overflow`` to the C compiler flags (by default we add
   ``-fno-strict-overflow`` instead).


.. _debug-build:

Python Debug Build
------------------

A debug build is Python built with the :option:`--with-pydebug` configure
option.

Effects of a debug build:

* Display all warnings by default: the list of default warning filters is empty
  in the :mod:`warnings` module.
* Add ``d`` to :data:`sys.abiflags`.
* Add :func:`!sys.gettotalrefcount` function.
* Add :option:`-X showrefcount <-X>` command line option.
* Add :option:`-d` command line option and :envvar:`PYTHONDEBUG` environment
  variable to debug the parser.
* Add support for the ``__lltrace__`` variable: enable low-level tracing in the
  bytecode evaluation loop if the variable is defined.
* Install :ref:`debug hooks on memory allocators <default-memory-allocators>`
  to detect buffer overflow and other memory errors.
* Define ``Py_DEBUG`` and ``Py_REF_DEBUG`` macros.
* Add runtime checks: code surrounded by ``#ifdef Py_DEBUG`` and ``#endif``.
  Enable ``assert(...)`` and ``_PyObject_ASSERT(...)`` assertions: don't set
  the ``NDEBUG`` macro (see also the :option:`--with-assertions` configure
  option). Main runtime checks:

  * Add sanity checks on the function arguments.
  * Unicode and int objects are created with their memory filled with a pattern
    to detect usage of uninitialized objects.
  * Ensure that functions which can clear or replace the current exception are
    not called with an exception raised.
  * Check that deallocator functions don't change the current exception.
  * The garbage collector (:func:`gc.collect` function) runs some basic checks
    on objects consistency.
  * The :c:macro:`!Py_SAFE_DOWNCAST()` macro checks for integer underflow and
    overflow when downcasting from wide types to narrow types.

See also the :ref:`Python Development Mode <devmode>` and the
:option:`--with-trace-refs` configure option.

.. versionchanged:: 3.8
   Release builds and debug builds are now ABI compatible: defining the
   ``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro (see the
   :option:`--with-trace-refs` option).


Debug options
-------------

.. option:: --with-pydebug

   :ref:`Build Python in debug mode <debug-build>`: define the ``Py_DEBUG``
   macro (disabled by default).

.. option:: --with-trace-refs

   Enable tracing references for debugging purpose (disabled by default).

   Effects:

   * Define the ``Py_TRACE_REFS`` macro.
   * Add :func:`!sys.getobjects` function.
   * Add :envvar:`PYTHONDUMPREFS` environment variable.

   The :envvar:`PYTHONDUMPREFS` environment variable can be used to dump
   objects and reference counts still alive at Python exit.

   :ref:`Statically allocated objects <static-types>` are not traced.

   .. versionadded:: 3.8

   .. versionchanged:: 3.13
      This build is now ABI compatible with release build and :ref:`debug build
      <debug-build>`.

.. option:: --with-assertions

   Build with C assertions enabled (default is no): ``assert(...);`` and
   ``_PyObject_ASSERT(...);``.

   If set, the ``NDEBUG`` macro is not defined in the :envvar:`OPT` compiler
   variable.

   See also the :option:`--with-pydebug` option (:ref:`debug build
   <debug-build>`) which also enables assertions.

   .. versionadded:: 3.6

.. option:: --with-valgrind

   Enable Valgrind support (default is no).

.. option:: --with-dtrace

   Enable DTrace support (default is no).

   See :ref:`Instrumenting CPython with DTrace and SystemTap
   <instrumentation>`.

   .. versionadded:: 3.6

.. option:: --with-address-sanitizer

   Enable AddressSanitizer memory error detector, ``asan`` (default is no).

   .. versionadded:: 3.6

.. option:: --with-memory-sanitizer

   Enable MemorySanitizer allocation error detector, ``msan`` (default is no).

   .. versionadded:: 3.6

.. option:: --with-undefined-behavior-sanitizer

   Enable UndefinedBehaviorSanitizer undefined behaviour detector, ``ubsan``
   (default is no).

   .. versionadded:: 3.6

.. option:: --with-thread-sanitizer

   Enable ThreadSanitizer data race detector, ``tsan``
   (default is no).

   .. versionadded:: 3.13


Linker options
--------------

.. option:: --enable-shared

   Enable building a shared Python library: ``libpython`` (default is no).

.. option:: --without-static-libpython

   Do not build ``libpythonMAJOR.MINOR.a`` and do not install ``python.o``
   (built and enabled by default).

   .. versionadded:: 3.10


Libraries options
-----------------

.. option:: --with-libs='lib1 ...'

   Link against additional libraries (default is no).

.. option:: --with-system-expat

   Build the :mod:`!pyexpat` module using an installed ``expat`` library
   (default is no).

.. option:: --with-system-libmpdec

   Build the ``_decimal`` extension module using an installed ``mpdec``
   library, see the :mod:`decimal` module (default is no).

   .. versionadded:: 3.3

.. option:: --with-readline=readline|editline

   Designate a backend library for the :mod:`readline` module.

   * readline: Use readline as the backend.
   * editline: Use editline as the backend.

   .. versionadded:: 3.10

.. option:: --without-readline

   Don't build the :mod:`readline` module (built by default).

   Don't define the ``HAVE_LIBREADLINE`` macro.

   .. versionadded:: 3.10

.. option:: --with-libm=STRING

   Override ``libm`` math library to *STRING* (default is system-dependent).

.. option:: --with-libc=STRING

   Override ``libc`` C library to *STRING* (default is system-dependent).

.. option:: --with-openssl=DIR

   Root of the OpenSSL directory.

   .. versionadded:: 3.7

.. option:: --with-openssl-rpath=[no|auto|DIR]

   Set runtime library directory (rpath) for OpenSSL libraries:

   * ``no`` (default): don't set rpath;
   * ``auto``: auto-detect rpath from :option:`--with-openssl` and
     ``pkg-config``;
   * *DIR*: set an explicit rpath.

   .. versionadded:: 3.10


Security Options
----------------

.. option:: --with-hash-algorithm=[fnv|siphash13|siphash24]

   Select hash algorithm for use in ``Python/pyhash.c``:

   * ``siphash13`` (default);
   * ``siphash24``;
   * ``fnv``.

   .. versionadded:: 3.4

   .. versionadded:: 3.11
      ``siphash13`` is added and it is the new default.

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

   Built-in hash modules:

   * ``md5``;
   * ``sha1``;
   * ``sha256``;
   * ``sha512``;
   * ``sha3`` (with shake);
   * ``blake2``.

   .. versionadded:: 3.9

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

   Override the OpenSSL default cipher suites string:

   * ``python`` (default): use Python's preferred selection;
   * ``openssl``: leave OpenSSL's defaults untouched;
   * *STRING*: use a custom string

   See the :mod:`ssl` module.

   .. versionadded:: 3.7

   .. versionchanged:: 3.10

      The settings ``python`` and *STRING* also set TLS 1.2 as minimum
      protocol version.

macOS Options
-------------

See :source:`Mac/README.rst`.

.. option:: --enable-universalsdk
.. option:: --enable-universalsdk=SDKDIR

   Create a universal binary build. *SDKDIR* specifies which macOS SDK should
   be used to perform the build (default is no).

.. option:: --enable-framework
.. option:: --enable-framework=INSTALLDIR

   Create a Python.framework rather than a traditional Unix install. Optional
   *INSTALLDIR* specifies the installation path (default is no).

.. option:: --with-universal-archs=ARCH

   Specify the kind of universal binary that should be created. This option is
   only valid when :option:`--enable-universalsdk` is set.

   Options:

   * ``universal2``;
   * ``32-bit``;
   * ``64-bit``;
   * ``3-way``;
   * ``intel``;
   * ``intel-32``;
   * ``intel-64``;
   * ``all``.

.. option:: --with-framework-name=FRAMEWORK

   Specify the name for the python framework on macOS only valid when
   :option:`--enable-framework` is set (default: ``Python``).

iOS Options
-----------

See :source:`iOS/README.rst`.

.. option:: --enable-framework=INSTALLDIR

   Create a Python.framework. Unlike macOS, the *INSTALLDIR* argument
   specifying the installation path is mandatory.

.. option:: --with-framework-name=FRAMEWORK

   Specify the name for the framework (default: ``Python``).


Cross Compiling Options
-----------------------

Cross compiling, also known as cross building, can be used to build Python
for another CPU architecture or platform. Cross compiling requires a Python
interpreter for the build platform. The version of the build Python must match
the version of the cross compiled host Python.

.. option:: --build=BUILD

   configure for building on BUILD, usually guessed by :program:`config.guess`.

.. option:: --host=HOST

   cross-compile to build programs to run on HOST (target platform)

.. option:: --with-build-python=path/to/python

   path to build ``python`` binary for cross compiling

   .. versionadded:: 3.11

.. option:: CONFIG_SITE=file

   An environment variable that points to a file with configure overrides.

   Example *config.site* file:

   .. code-block:: ini

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

.. option:: HOSTRUNNER

   Program to run CPython for the host platform for cross-compilation.

   .. versionadded:: 3.11


Cross compiling example::

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


Python Build System
===================

Main files of the build system
------------------------------

* :file:`configure.ac` => :file:`configure`;
* :file:`Makefile.pre.in` => :file:`Makefile` (created by :file:`configure`);
* :file:`pyconfig.h` (created by :file:`configure`);
* :file:`Modules/Setup`: C extensions built by the Makefile using
  :file:`Module/makesetup` shell script;

Main build steps
----------------

* C files (``.c``) are built as object files (``.o``).
* A static ``libpython`` library (``.a``) is created from objects files.
* ``python.o`` and the static ``libpython`` library are linked into the
  final ``python`` program.
* C extensions are built by the Makefile (see :file:`Modules/Setup`).

Main Makefile targets
---------------------

make
^^^^

For the most part, when rebuilding after editing some code or
refreshing your checkout from upstream, all you need to do is execute
``make``, which (per Make's semantics) builds the default target, the
first one defined in the Makefile.  By tradition (including in the
CPython project) this is usually the ``all`` target. The
``configure`` script expands an ``autoconf`` variable,
``@DEF_MAKE_ALL_RULE@`` to describe precisely which targets ``make
all`` will build. The three choices are:

* ``profile-opt`` (configured with ``--enable-optimizations``)
* ``build_wasm`` (configured with ``--with-emscripten-target``)
* ``build_all`` (configured without explicitly using either of the others)

Depending on the most recent source file changes, Make will rebuild
any targets (object files and executables) deemed out-of-date,
including running ``configure`` again if necessary. Source/target
dependencies are many and maintained manually however, so Make
sometimes doesn't have all the information necessary to correctly
detect all targets which need to be rebuilt.  Depending on which
targets aren't rebuilt, you might experience a number of problems. If
you have build or test problems which you can't otherwise explain,
``make clean && make`` should work around most dependency problems, at
the expense of longer build times.


make platform
^^^^^^^^^^^^^

Build the ``python`` program, but don't build the standard library
extension modules. This generates a file named ``platform`` which
contains a single line describing the details of the build platform,
e.g., ``macosx-14.3-arm64-3.12`` or ``linux-x86_64-3.13``.


make profile-opt
^^^^^^^^^^^^^^^^

Build Python using profile-guided optimization (PGO).  You can use the
configure :option:`--enable-optimizations` option to make this the
default target of the ``make`` command (``make all`` or just
``make``).



make clean
^^^^^^^^^^

Remove built files.


make distclean
^^^^^^^^^^^^^^

In addition to the the work done by ``make clean``, remove files
created by the configure script.  ``configure`` will have to be run
before building again. [#]_


make install
^^^^^^^^^^^^

Build the ``all`` target and install Python.


make test
^^^^^^^^^

Build the ``all`` target and run the Python test suite with the
``--fast-ci`` option. Variables:

* ``TESTOPTS``: additional regrtest command-line options.
* ``TESTPYTHONOPTS``: additional Python command-line options.
* ``TESTTIMEOUT``: timeout in seconds (default: 10 minutes).


make buildbottest
^^^^^^^^^^^^^^^^^

This is similar to ``make test``, but uses the ``--slow-ci``
option and default timeout of 20 minutes, instead of ``--fast-ci`` option.


make regen-all
^^^^^^^^^^^^^^

Regenerate (almost) all generated files. These include (but are not
limited to) bytecode cases, and parser generator file.
``make regen-stdlib-module-names`` and ``autoconf`` must be run
separately for the remaining `generated files <#generated-files>`_.


C extensions
------------

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:

.. code-block:: pycon

    >>> 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:

.. code-block:: pycon

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

:file:`Modules/Setup` is used to generate Makefile targets to build C extensions.
At the beginning of the files, C extensions are built as built-in modules.
Extensions defined after the ``*shared*`` marker are built as dynamic libraries.

The :c:macro:`!PyAPI_FUNC()`, :c:macro:`!PyAPI_DATA()` and
:c:macro:`PyMODINIT_FUNC` macros of :file:`Include/exports.h` are defined
differently depending if the ``Py_BUILD_CORE_MODULE`` macro is defined:

* Use ``Py_EXPORTED_SYMBOL`` if the ``Py_BUILD_CORE_MODULE`` is defined
* Use ``Py_IMPORTED_SYMBOL`` otherwise.

If the ``Py_BUILD_CORE_BUILTIN`` macro is used by mistake on a C extension
built as a shared library, its :samp:`PyInit_{xxx}()` function is not exported,
causing an :exc:`ImportError` on import.


Compiler and linker flags
=========================

Options set by the ``./configure`` script and environment variables and used by
``Makefile``.

Preprocessor flags
------------------

.. envvar:: CONFIGURE_CPPFLAGS

   Value of :envvar:`CPPFLAGS` variable passed to the ``./configure`` script.

   .. versionadded:: 3.6

.. envvar:: CPPFLAGS

   (Objective) C/C++ preprocessor flags, e.g. :samp:`-I{include_dir}` if you have
   headers in a nonstandard directory *include_dir*.

   Both :envvar:`CPPFLAGS` and :envvar:`LDFLAGS` need to contain the shell's
   value to be able to build extension modules using the
   directories specified in the environment variables.

.. envvar:: BASECPPFLAGS

   .. versionadded:: 3.4

.. envvar:: PY_CPPFLAGS

   Extra preprocessor flags added for building the interpreter object files.

   Default: ``$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)``.

   .. versionadded:: 3.2

Compiler flags
--------------

.. envvar:: CC

   C compiler command.

   Example: ``gcc -pthread``.

.. envvar:: CXX

   C++ compiler command.

   Example: ``g++ -pthread``.

.. envvar:: CFLAGS

   C compiler flags.

.. envvar:: CFLAGS_NODIST

   :envvar:`CFLAGS_NODIST` is used for building the interpreter and stdlib C
   extensions.  Use it when a compiler flag should *not* be part of
   :envvar:`CFLAGS` once Python is installed (:gh:`65320`).

   In particular, :envvar:`CFLAGS` should not contain:

   * the compiler flag ``-I`` (for setting the search path for include files).
     The ``-I`` flags are processed from left to right, and any flags in
     :envvar:`CFLAGS` would take precedence over user- and package-supplied ``-I``
     flags.

   * hardening flags such as ``-Werror`` because distributions cannot control
     whether packages installed by users conform to such heightened
     standards.

   .. versionadded:: 3.5

.. envvar:: COMPILEALL_OPTS

   Options passed to the :mod:`compileall` command line when building PYC files
   in ``make install``. Default: ``-j0``.

   .. versionadded:: 3.12

.. envvar:: EXTRA_CFLAGS

   Extra C compiler flags.

.. envvar:: CONFIGURE_CFLAGS

   Value of :envvar:`CFLAGS` variable passed to the ``./configure``
   script.

   .. versionadded:: 3.2

.. envvar:: CONFIGURE_CFLAGS_NODIST

   Value of :envvar:`CFLAGS_NODIST` variable passed to the ``./configure``
   script.

   .. versionadded:: 3.5

.. envvar:: BASECFLAGS

   Base compiler flags.

.. envvar:: OPT

   Optimization flags.

.. envvar:: CFLAGS_ALIASING

   Strict or non-strict aliasing flags used to compile ``Python/dtoa.c``.

   .. versionadded:: 3.7

.. envvar:: CCSHARED

   Compiler flags used to build a shared library.

   For example, ``-fPIC`` is used on Linux and on BSD.

.. envvar:: CFLAGSFORSHARED

   Extra C flags added for building the interpreter object files.

   Default: ``$(CCSHARED)`` when :option:`--enable-shared` is used, or an empty
   string otherwise.

.. envvar:: PY_CFLAGS

   Default: ``$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)``.

.. envvar:: PY_CFLAGS_NODIST

   Default: ``$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal``.

   .. versionadded:: 3.5

.. envvar:: PY_STDMODULE_CFLAGS

   C flags used for building the interpreter object files.

   Default: ``$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)``.

   .. versionadded:: 3.7

.. envvar:: PY_CORE_CFLAGS

   Default: ``$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE``.

   .. versionadded:: 3.2

.. envvar:: PY_BUILTIN_MODULE_CFLAGS

   Compiler flags to build a standard library extension module as a built-in
   module, like the :mod:`posix` module.

   Default: ``$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN``.

   .. versionadded:: 3.8

.. envvar:: PURIFY

   Purify command. Purify is a memory debugger program.

   Default: empty string (not used).


Linker flags
------------

.. envvar:: LINKCC

   Linker command used to build programs like ``python`` and ``_testembed``.

   Default: ``$(PURIFY) $(CC)``.

.. envvar:: CONFIGURE_LDFLAGS

   Value of :envvar:`LDFLAGS` variable passed to the ``./configure`` script.

   Avoid assigning :envvar:`CFLAGS`, :envvar:`LDFLAGS`, etc. so users can use
   them on the command line to append to these values without stomping the
   pre-set values.

   .. versionadded:: 3.2

.. envvar:: LDFLAGS_NODIST

   :envvar:`LDFLAGS_NODIST` is used in the same manner as
   :envvar:`CFLAGS_NODIST`.  Use it when a linker flag should *not* be part of
   :envvar:`LDFLAGS` once Python is installed (:gh:`65320`).

   In particular, :envvar:`LDFLAGS` should not contain:

   * the compiler flag ``-L`` (for setting the search path for libraries).
     The ``-L`` flags are processed from left to right, and any flags in
     :envvar:`LDFLAGS` would take precedence over user- and package-supplied ``-L``
     flags.

.. envvar:: CONFIGURE_LDFLAGS_NODIST

   Value of :envvar:`LDFLAGS_NODIST` variable passed to the ``./configure``
   script.

   .. versionadded:: 3.8

.. envvar:: LDFLAGS

   Linker flags, e.g. :samp:`-L{lib_dir}` if you have libraries in a nonstandard
   directory *lib_dir*.

   Both :envvar:`CPPFLAGS` and :envvar:`LDFLAGS` need to contain the shell's
   value to be able to build extension modules using the
   directories specified in the environment variables.

.. envvar:: LIBS

   Linker flags to pass libraries to the linker when linking the Python
   executable.

   Example: ``-lrt``.

.. envvar:: LDSHARED

   Command to build a shared library.

   Default: ``@LDSHARED@ $(PY_LDFLAGS)``.

.. envvar:: BLDSHARED

   Command to build ``libpython`` shared library.

   Default: ``@BLDSHARED@ $(PY_CORE_LDFLAGS)``.

.. envvar:: PY_LDFLAGS

   Default: ``$(CONFIGURE_LDFLAGS) $(LDFLAGS)``.

.. envvar:: PY_LDFLAGS_NODIST

   Default: ``$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)``.

   .. versionadded:: 3.8

.. envvar:: PY_CORE_LDFLAGS

   Linker flags used for building the interpreter object files.

   .. versionadded:: 3.8


.. rubric:: Footnotes

.. [#] ``git clean -fdx`` is an even more extreme way to "clean" your
   checkout. It removes all files not known to Git.
   When bug hunting using ``git bisect``, this is
   `recommended between probes <https://github.com/python/cpython/issues/114505#issuecomment-1907021718>`_
   to guarantee a completely clean build. **Use with care**, as it
   will delete all files not checked into Git, including your
   new, uncommitted work.
