| **************** | |
| Configure Python | |
| **************** | |
| .. highlight:: sh | |
| .. _build-requirements: | |
| Build Requirements | |
| ================== | |
| To build CPython, you will need: | |
| * 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. | |
| .. versionchanged:: 3.5 | |
| On Windows, Visual Studio 2015 or later is now required. | |
| .. versionchanged:: 3.6 | |
| Selected C99 features, like ``<stdint.h>`` and ``static inline`` functions, | |
| are now required. | |
| .. versionchanged:: 3.7 | |
| Thread support is now required. | |
| .. versionchanged:: 3.11 | |
| C11 compiler, IEEE 754 and NaN support are now required. | |
| On Windows, Visual Studio 2017 or later is required. | |
| See also :pep:`7` "Style Guide for C Code" and :pep:`11` "CPython platform | |
| support". | |
| .. _optional-module-requirements: | |
| Requirements for optional modules | |
| --------------------------------- | |
| Some :term:`optional modules <optional module>` of the standard library | |
| require third-party libraries installed for development | |
| (for example, header files must be available). | |
| Missing requirements are reported in the ``configure`` output. | |
| Modules that are missing due to missing dependencies are listed near the end | |
| of the ``make`` output, | |
| sometimes using an internal name, for example, ``_ctypes`` for :mod:`ctypes` | |
| module. | |
| If you distribute a CPython interpreter without optional modules, | |
| it's best practice to advise users, who generally expect that | |
| standard library modules are available. | |
| Dependencies to build optional modules are: | |
| .. list-table:: | |
| :header-rows: 1 | |
| :align: left | |
| * - Dependency | |
| - Minimum version | |
| - Python module | |
| * - `libbz2 <https://sourceware.org/bzip2/>`_ or | |
| `libbzip2-rs <https://github.com/trifectatechfoundation/libbzip2-rs>`_ [1]_ | |
| - | |
| - :mod:`bz2` | |
| * - `libffi <https://sourceware.org/libffi/>`_ | |
| - 3.3.0 recommended | |
| - :mod:`ctypes` | |
| * - `liblzma <https://tukaani.org/xz/>`_ | |
| - | |
| - :mod:`lzma` | |
| * - `libmpdec <https://www.bytereef.org/mpdecimal/doc/libmpdec/>`_ | |
| - 2.5.0 | |
| - :mod:`decimal` [2]_ | |
| * - `libreadline <https://tiswww.case.edu/php/chet/readline/rltop.html>`_ or | |
| `libedit <https://www.thrysoee.dk/editline/>`_ [3]_ | |
| - | |
| - :mod:`readline` | |
| * - `libuuid <https://linux.die.net/man/3/libuuid>`_ | |
| - | |
| - ``_uuid`` [4]_ | |
| * - `ncurses <https://gnu.org/software/ncurses/ncurses.html>`_ [5]_ | |
| - | |
| - :mod:`curses` | |
| * - `OpenSSL <https://openssl-library.org/>`_ | |
| - [8]_ | |
| - :mod:`ssl`, :mod:`hashlib` [6]_ | |
| * - `SQLite <https://sqlite.org/>`_ | |
| - 3.15.2 | |
| - :mod:`sqlite3` | |
| * - `Tcl/Tk <https://www.tcl-lang.org/>`_ | |
| - 8.5.12 | |
| - :mod:`tkinter`, :ref:`IDLE <idle>`, :mod:`turtle` | |
| * - `zlib <https://www.zlib.net>`_, | |
| `zlib-ng <https://github.com/zlib-ng/zlib-ng>`_, or | |
| `zlib-rs <https://github.com/trifectatechfoundation/zlib-rs/>`_ [7]_ | |
| - | 1.2.2.1 (zlib, zlib-ng) | |
| | 0.6.0 (zlib-rs) | |
| - :mod:`zlib`, :mod:`gzip`, :mod:`ensurepip` | |
| * - `zstd <https://facebook.github.io/zstd/>`_ | |
| - 1.4.5 | |
| - :mod:`compression.zstd` | |
| .. [1] See :option:`--with-bzip2` for choosing the backend for the | |
| :mod:`bz2` module. | |
| .. [2] If *libmpdec* is not available, the :mod:`decimal` module will use | |
| a pure-Python implementation. | |
| .. [3] See :option:`--with-readline` for choosing the backend for the | |
| :mod:`readline` module. | |
| .. [4] The :mod:`uuid` module uses ``_uuid`` to generate "safe" UUIDs. | |
| See the module documentation for details. | |
| .. [5] The :mod:`curses` module requires the ``libncurses`` or ``libncursesw`` | |
| library. | |
| The :mod:`curses.panel` module additionally requires the ``libpanel`` or | |
| ``libpanelw`` library. | |
| .. [6] If OpenSSL is not available, the :mod:`hashlib` module will use | |
| bundled implementations of several hash functions. | |
| See :option:`--with-builtin-hashlib-hashes` for *forcing* usage of OpenSSL. | |
| .. [7] See :option:`--with-zlib` for choosing the backend for the | |
| :mod:`zlib` module. | |
| .. [8] OpenSSL 1.1.1 is the minimum possible version to build against, | |
| but the series is end-of-life and no longer receives public security | |
| fixes. Use the latest patch release of a currently supported LTS | |
| release series (see the `OpenSSL Roadmap | |
| <https://openssl-library.org/roadmap/index.html>`__), or the package | |
| provided by your operating system if available. Other libraries that | |
| offer an API compatible with OpenSSL 1.1.1 or later may work, but are | |
| not officially supported. | |
| Note that the table does not include all optional modules; in particular, | |
| platform-specific modules like :mod:`winreg` are not listed here. | |
| .. seealso:: | |
| * The `devguide <https://devguide.python.org/getting-started/setup-building/#install-dependencies>`_ | |
| includes a full list of dependencies required to build all modules and | |
| instructions on how to install them on common platforms. | |
| * :option:`--with-system-expat` allows building with an external | |
| `libexpat <https://libexpat.github.io/>`_ library. | |
| * :ref:`configure-options-for-dependencies` | |
| .. versionchanged:: 3.1 | |
| Tcl/Tk version 8.3.1 is now required for :mod:`tkinter`. | |
| .. versionchanged:: 3.5 | |
| Tcl/Tk version 8.4 is now required for :mod:`tkinter`. | |
| .. versionchanged:: 3.7 | |
| OpenSSL 1.0.2 is now required for :mod:`hashlib` and :mod:`ssl`. | |
| .. versionchanged:: 3.10 | |
| OpenSSL 1.1.1 is now required for :mod:`hashlib` and :mod:`ssl`. | |
| SQLite 3.7.15 is now required for :mod:`sqlite3`. | |
| .. versionchanged:: 3.11 | |
| Tcl/Tk version 8.5.12 is now required for :mod:`tkinter`. | |
| .. versionchanged:: 3.13 | |
| SQLite 3.15.2 is now required for :mod:`sqlite3`. | |
| 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 versions of the | |
| tools used. | |
| The container that CPython uses has | |
| `Autoconf <https://gnu.org/software/autoconf>`_ 2.72, | |
| ``aclocal`` from `Automake <https://www.gnu.org/software/automake>`_ 1.16.5, | |
| and `pkg-config <https://www.freedesktop.org/wiki/Software/pkg-config/>`_ 1.8.1. | |
| .. versionchanged:: 3.13 | |
| Autoconf 2.71 and aclocal 1.16.5 and are now used to regenerate | |
| :file:`configure`. | |
| .. versionchanged:: 3.14 | |
| Autoconf 2.72 is now used to regenerate :file:`configure`. | |
| .. _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:: --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:: --with-missing-stdlib-config=FILE | |
| Path to a `JSON <https://www.json.org/json-en.html>`_ configuration file | |
| containing custom error messages for missing :term:`standard library` modules. | |
| This option is intended for Python distributors who wish to provide | |
| distribution-specific guidance when users encounter standard library | |
| modules that are missing or packaged separately. | |
| The JSON file should map missing module names to custom error message strings. | |
| For example, if your distribution packages :mod:`tkinter` and | |
| :mod:`_tkinter` separately and excludes :mod:`!_gdbm` for legal reasons, | |
| the configuration could contain: | |
| .. code-block:: json | |
| { | |
| "_gdbm": "The '_gdbm' module is not available in this distribution", | |
| "tkinter": "Install the python-tk package to use tkinter", | |
| "_tkinter": "Install the python-tk package to use tkinter", | |
| } | |
| .. versionadded:: 3.15 | |
| .. 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 | |
| .. c:macro:: Py_GIL_DISABLED | |
| :no-typesetting: | |
| Enables support for running Python without the :term:`global interpreter | |
| lock` (GIL): :term:`free-threaded build`. | |
| Defines the ``Py_GIL_DISABLED`` macro and adds ``"t"`` to | |
| :data:`sys.abiflags`. | |
| See :ref:`whatsnew313-free-threaded-cpython` for more detail. | |
| .. versionadded:: 3.13 | |
| .. option:: --enable-experimental-jit=[no|yes|yes-off|interpreter] | |
| Indicate how to integrate the :ref:`experimental just-in-time compiler <whatsnew314-jit-compiler>`. | |
| * ``no``: Don't build the JIT. | |
| * ``yes``: Enable the JIT. To disable it at runtime, set the environment | |
| variable :envvar:`PYTHON_JIT=0 <PYTHON_JIT>`. | |
| * ``yes-off``: Build the JIT, but disable it by default. To enable it at | |
| runtime, set the environment variable :envvar:`PYTHON_JIT=1 <PYTHON_JIT>`. | |
| * ``interpreter``: Enable the "JIT interpreter" (only useful for those | |
| debugging the JIT itself). To disable it at runtime, set the environment | |
| variable :envvar:`PYTHON_JIT=0 <PYTHON_JIT>`. | |
| ``--enable-experimental-jit=no`` is the default behavior if the option is not | |
| provided, and ``--enable-experimental-jit`` is shorthand for | |
| ``--enable-experimental-jit=yes``. See :file:`Tools/jit/README.md` for more | |
| information, including how to install the necessary build-time dependencies. | |
| .. note:: | |
| When building CPython with JIT enabled, ensure that your system has Python 3.11 or later installed. | |
| .. versionadded:: 3.13 | |
| .. option:: PKG_CONFIG | |
| Path to ``pkg-config`` utility. | |
| .. option:: PKG_CONFIG_LIBDIR | |
| .. option:: PKG_CONFIG_PATH | |
| ``pkg-config`` options. | |
| .. option:: --disable-epoll | |
| Build without ``epoll``, meaning that :py:func:`select.epoll` will not be | |
| present even if the system provides an | |
| :manpage:`epoll_create <epoll_create(2)>` function. | |
| This may be used on systems where :manpage:`!epoll_create` or | |
| :manpage:`epoll_create1 <epoll_create1(2)>` is available | |
| but incompatible with Linux semantics. | |
| .. versionadded:: 3.15 | |
| .. option:: --with-build-details-suffix=[yes|SUFFIX] | |
| Rename ``build-details.json`` to permit multiple co-located Python | |
| installs. If a custom ``SUFFIX`` is supplied it is used verbatim, | |
| otherwise one will be generated from the ``MULTIARCH`` tag with | |
| ``-free-threading`` and ``-debug``, as appropriate. | |
| .. versionadded:: 3.16 | |
| 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. | |
| .. _configure-options-for-dependencies: | |
| 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:: 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:: LIBMPDEC_CFLAGS | |
| .. option:: LIBMPDEC_LIBS | |
| C compiler and linker flags for ``libmpdec``, used by :mod:`decimal` 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:: LIBZSTD_CFLAGS | |
| .. option:: LIBZSTD_LIBS | |
| C compiler and linker flags for ``libzstd``, used by :mod:`compression.zstd` module, | |
| overriding ``pkg-config``. | |
| .. versionadded:: 3.14 | |
| .. 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:: --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:: --with-tail-call-interp | |
| Enable interpreters using tail calls in CPython. If enabled, enabling PGO | |
| (:option:`--enable-optimizations`) is highly recommended. This option specifically | |
| requires a C compiler with proper tail call support, and the | |
| `preserve_none <https://clang.llvm.org/docs/AttributeReference.html#preserve-none>`_ | |
| calling convention. For example, Clang 19 and newer supports this feature. | |
| .. versionadded:: 3.14 | |
| .. option:: --without-frame-pointers | |
| Disable frame pointers, which are enabled by default (see :pep:`831`). | |
| By default, the build appends flags to generate frame or backchain | |
| pointers to ``BASECFLAGS``: | |
| - ``-fno-omit-frame-pointer`` and/or ``-mno-omit-leaf-frame-pointer`` | |
| are added when the compiler supports them. | |
| - ``-marm`` and/or ``-mno-thumb`` is added on 32-bit ARM when supported, | |
| - on s390x platforms, when supported, ``-mbackchain`` is added *instead*. | |
| of the above frame pointer flags. | |
| - on ppc64le platforms, no compiler flags is needed since the power ABI | |
| requires that compilers maintain a back chain by default. | |
| Frame pointers enable profilers, debuggers, and system tracing tools | |
| (``perf``, ``eBPF``, ``dtrace``, ``gdb``) to walk the C call stack | |
| without DWARF metadata. The flags propagate to third-party C | |
| extensions through :mod:`sysconfig`. On compilers that do not | |
| understand them, the build silently skips them. | |
| Downstream packagers and authors of native libraries built with | |
| custom build systems should set the same flags so the unwind chain | |
| stays unbroken across all native frames. | |
| .. versionadded:: 3.15 | |
| .. option:: --without-mimalloc | |
| Disable the fast :ref:`mimalloc <mimalloc>` allocator | |
| (enabled by default). | |
| This option cannot be used together with :option:`--disable-gil` | |
| because the :term:`free-threaded <free threading>` build requires mimalloc. | |
| 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:: --with-pymalloc-hugepages | |
| Enable huge page support for :ref:`pymalloc <pymalloc>` arenas (disabled by | |
| default). When enabled, the arena size on 64-bit platforms is increased to | |
| 2 MiB and arena allocation uses ``MAP_HUGETLB`` (Linux) or | |
| ``MEM_LARGE_PAGES`` (Windows) with automatic fallback to regular pages. | |
| Even when compiled with this option, huge pages are **not** used at runtime | |
| unless the :envvar:`PYTHON_PYMALLOC_HUGEPAGES` environment variable is set | |
| to ``1``. This opt-in is required because huge pages | |
| * carry risks on Linux: if the huge-page pool is exhausted, page faults | |
| (including copy-on-write faults after :func:`os.fork`) deliver ``SIGBUS`` | |
| and kill the process. | |
| * need a special privilege on Windows. See the `Windows documentation for large pages | |
| <https://learn.microsoft.com/windows/win32/memory/large-page-support>`_ | |
| for details. Python will fail on startup if the required privilege | |
| `SeLockMemoryPrivilege | |
| <https://learn.microsoft.com/previous-versions/windows/it-pro/windows-10/security/threat-protection/security-policy-settings/lock-pages-in-memory>`_ | |
| is not held by the user. | |
| The configure script checks that the platform supports ``MAP_HUGETLB`` | |
| and emits a warning if it is not available. | |
| On Windows, use the ``--pymalloc-hugepages`` flag with ``build.bat`` or | |
| set the ``UsePymallocHugepages`` MSBuild property. | |
| .. versionadded:: 3.15 | |
| .. 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). | |
| .. option:: --without-remote-debug | |
| Deactivate remote debugging support described in :pep:`768` (enabled by default). | |
| When this flag is provided the code that allows the interpreter to schedule the | |
| execution of a Python file in a separate process as described in :pep:`768` is | |
| not compiled. This includes both the functionality to schedule code to be executed | |
| and the functionality to receive code to be executed. | |
| .. c:macro:: Py_REMOTE_DEBUG | |
| This macro is defined by default, unless Python is configured with | |
| :option:`--without-remote-debug`. | |
| Note that even if the macro is defined, remote debugging may not be | |
| available (for example, on an incompatible platform). | |
| .. versionadded:: 3.14 | |
| .. _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 are now ABI compatible with debug builds: defining the | |
| ``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro (see the | |
| :option:`--with-trace-refs` option). However, debug builds still expose | |
| more symbols than release builds and code built against a debug build is not | |
| necessarily compatible with a release build. | |
| 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). | |
| When built with ``asan``, Python uses ``malloc`` instead of :ref:`pymalloc <pymalloc>` by default. | |
| Set :envvar:`PYTHONMALLOC=pymalloc <PYTHONMALLOC>` to use pymalloc. | |
| .. versionadded:: 3.6 | |
| .. option:: --with-hwaddress-sanitizer | |
| Enable HWAddressSanitizer memory error detector, ``hwasan`` (default is no). | |
| Note that on x86-64 this uses `page aliasing | |
| <https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html#supported-architectures>`_, | |
| which only tags heap allocations and is unsafe for programs that ``fork()``, | |
| including much of the test suite. | |
| See the `LLVM HWASan design documentation | |
| <https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html>`_ | |
| for more information. | |
| When built with ``hwasan``, Python uses ``malloc`` instead of :ref:`pymalloc <pymalloc>` by default. | |
| Set :envvar:`PYTHONMALLOC=pymalloc <PYTHONMALLOC>` to use pymalloc. | |
| .. versionadded:: 3.16 | |
| .. option:: --with-memory-sanitizer | |
| Enable MemorySanitizer allocation error detector, ``msan`` (default is no). | |
| MSan reports false positives for memory initialized by libraries that are | |
| not built with MSan, so either build all dependencies with MSan or disable | |
| the extension modules that use them in :file:`Modules/Setup.local`. | |
| When built with ``msan``, Python uses ``malloc`` instead of :ref:`pymalloc <pymalloc>` by default. | |
| Set :envvar:`PYTHONMALLOC=pymalloc <PYTHONMALLOC>` to use pymalloc. | |
| .. 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 | |
| .. option:: --enable-static-libpython-for-interpreter | |
| Do not link the Python interpreter binary (``python3``) against the | |
| shared Python library; instead, statically link the interpreter | |
| against ``libpython`` as if ``--enable-shared`` had not been used, | |
| but continue to build the shared ``libpython`` (for use by other | |
| programs). | |
| This option does nothing if ``--enable-shared`` is not used. | |
| The default (when ``-enable-shared`` is used) is to link the Python | |
| interpreter against the built shared library. | |
| .. versionadded:: 3.15 | |
| 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-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-curses=ncursesw|ncurses|curses | |
| Designate a backend library for the :mod:`curses` and :mod:`curses.panel` | |
| modules. | |
| * ``ncursesw``: Use the wide-character ``libncursesw`` (and ``libpanelw``), | |
| found via ``pkg-config``. | |
| * ``ncurses``: Use ``libncurses`` (and ``libpanel``), found via | |
| ``pkg-config``. | |
| * ``curses``: Use the system's native ``libcurses`` (and ``libpanel``), such | |
| as on NetBSD or Solaris. It is built with wide-character support when the | |
| library provides it. | |
| Without this option (or with ``--with-curses=auto``, the default), Python | |
| tries ``ncursesw`` and then ``ncurses``; the native ``curses`` is used only | |
| when requested explicitly. | |
| .. versionadded:: 3.16 | |
| .. option:: --without-curses | |
| Don't build the :mod:`curses` and :mod:`curses.panel` modules, even when a | |
| curses library is present (built by default when one is found). | |
| .. versionadded:: 3.16 | |
| .. option:: --with-zlib=zlib|zlib-ng|zlib-rs | |
| Designate the zlib implementation to build the :mod:`zlib` module against. | |
| * ``zlib``: Use the system zlib library, found via ``pkg-config`` or as | |
| ``libz``. | |
| * ``zlib-ng``: Same detection as ``zlib``, but fail unless the detected | |
| library is `zlib-ng <https://github.com/zlib-ng/zlib-ng>`__. | |
| * ``zlib-rs``: Use `zlib-rs | |
| <https://github.com/trifectatechfoundation/zlib-rs/>`__, found via | |
| ``pkg-config`` as ``libz_rs``. | |
| Without this option (or with ``--with-zlib=auto``, the default), the system | |
| zlib is used when found; configure only fails when an implementation was | |
| requested explicitly but cannot be found. | |
| .. versionadded:: 3.16 | |
| .. option:: --without-zlib | |
| Don't build the :mod:`zlib` module, even when a zlib library is present | |
| (built by default when one is found). | |
| .. versionadded:: 3.16 | |
| .. option:: --with-bzip2=bzip2|bzip2-rs | |
| Designate the bzip2 implementation to build the :mod:`bz2` module against. | |
| * ``bzip2``: Use the system bzip2 library, found via ``pkg-config`` or as | |
| ``libbz2``. | |
| * ``bzip2-rs``: Use `libbzip2-rs | |
| <https://github.com/trifectatechfoundation/libbzip2-rs>`__, found via | |
| ``pkg-config`` as ``libbz2_rs``. | |
| Without this option (or with ``--with-bzip2=auto``, the default), the | |
| system bzip2 is used when found; configure only fails when an | |
| implementation was requested explicitly but cannot be found. | |
| .. versionadded:: 3.16 | |
| .. option:: --without-bzip2 | |
| Don't build the :mod:`bz2` module, even when a bzip2 library is present | |
| (built by default when one is found). | |
| .. versionadded:: 3.16 | |
| .. 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. | |
| .. option:: --disable-safety | |
| Disable compiler options that are `recommended by OpenSSF`_ for security reasons with no performance overhead. | |
| If this option is not enabled, CPython will be built based on safety compiler options with no slow down. | |
| When this option is enabled, CPython will not be built with the compiler options listed below. | |
| The following compiler options are disabled with :option:`!--disable-safety`: | |
| * `-fstack-protector-strong`_: Enable run-time checks for stack-based buffer overflows. | |
| * `-Wtrampolines`_: Enable warnings about trampolines that require executable stacks. | |
| .. _recommended by OpenSSF: https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md | |
| .. _-fstack-protector-strong: https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#enable-run-time-checks-for-stack-based-buffer-overflows | |
| .. _-Wtrampolines: https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#enable-warning-about-trampolines-that-require-executable-stacks | |
| .. versionadded:: 3.14 | |
| .. option:: --enable-slower-safety | |
| Enable compiler options that are `recommended by OpenSSF`_ for security reasons which require overhead. | |
| If this option is not enabled, CPython will not be built based on safety compiler options which performance impact. | |
| When this option is enabled, CPython will be built with the compiler options listed below. | |
| The following compiler options are enabled with :option:`!--enable-slower-safety`: | |
| * `-D_FORTIFY_SOURCE=3`_: Fortify sources with compile- and run-time checks for unsafe libc usage and buffer overflows. | |
| .. _-D_FORTIFY_SOURCE=3: https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#fortify-sources-for-unsafe-libc-usage-and-buffer-overflows | |
| .. versionadded:: 3.14 | |
| 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`` (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 | |
| <https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/#macos>`_ | |
| .. option:: --with-framework-name=FRAMEWORK | |
| Specify the name for the python framework on macOS only valid when | |
| :option:`--enable-framework` is set (default: ``Python``). | |
| .. option:: --with-app-store-compliance | |
| .. option:: --with-app-store-compliance=PATCH-FILE | |
| The Python standard library contains strings that are known to trigger | |
| automated inspection tool errors when submitted for distribution by | |
| the macOS and iOS App Stores. If enabled, this option will apply the list of | |
| patches that are known to correct app store compliance. A custom patch | |
| file can also be specified. This option is disabled by default. | |
| .. versionadded:: 3.13 | |
| iOS Options | |
| ----------- | |
| See :source:`Platforms/Apple/iOS/README.md`. | |
| .. 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``). | |
| An iOS build configured without ``--enable-framework`` produces a static | |
| ``libpython``, for embedding directly in an app binary. Such a build cannot | |
| load extension modules at runtime, and so does not support binary wheels; it | |
| requires ``MODULE_BUILDTYPE=static`` and :option:`--disable-test-modules`, and | |
| rejects :option:`--enable-shared`. See | |
| :source:`Platforms/Apple/iOS/README.md` for the full list of limitations. | |
| .. versionadded:: 3.16 | |
| iOS builds may be configured without a framework. | |
| 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`` (chosen if the host platform matches ``wasm32-wasi*`` or | |
| ``wasm32-emscripten``) | |
| * ``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 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 without GUI tests. Variables: | |
| * ``TESTOPTS``: additional regrtest command-line options. | |
| * ``TESTPYTHONOPTS``: additional Python command-line options. | |
| * ``TESTTIMEOUT``: timeout in seconds (default: 10 minutes). | |
| make ci | |
| ^^^^^^^ | |
| This is similar to ``make test``, but uses the ``-ugui`` to also run GUI tests. | |
| .. versionadded:: 3.14 | |
| 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:: CFLAGS_CEVAL | |
| Flags used to compile ``Python/ceval.c``. | |
| .. versionadded:: 3.14.5 | |
| .. 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. | |
| Please consider using ``EXE_LDFLAGS`` if the supplied linker flags are | |
| executable specific, e.g. GCC's ``-pie`` flag. | |
| .. 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 | |
| .. envvar:: EXE_LDFLAGS | |
| Linker flags used for building executable targets such as the | |
| interpreter. If supplied, :envvar:`PY_CORE_EXE_LDFLAGS` | |
| will be used in replacement of :envvar:`PY_CORE_LDFLAGS`. | |
| .. versionadded:: 3.15 | |
| .. envvar:: CONFIGURE_EXE_LDFLAGS | |
| Value of :envvar:`EXE_LDFLAGS` variable passed to the ``./configure`` | |
| script. | |
| .. versionadded:: 3.15 | |
| .. envvar:: PY_CORE_EXE_LDFLAGS | |
| Linker flags used for building the interpreter and | |
| executable targets. | |
| Default: ``$(PY_CORE_LDFLAGS)`` | |
| .. versionadded:: 3.15 | |
| .. 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. |