2. 在 Unix 平台使用 Python
Features required to build CPython:
A C11 编译器。 Optional C11 features are not required.
支持 IEEE 754 floating point numbers and floating point Not-a-Number (NaN) .
Support for threads.
OpenSSL 1.1.1 or newer for the ssl and hashlib 模块。
ssl
hashlib
On Windows, Microsoft Visual Studio 2017 or later is required.
3.5 版改变: On Windows, Visual Studio 2015 or later is required.
3.6 版改变: Selected C99 features are now required, like <stdint.h> and static inline 函数。
<stdint.h>
static inline
3.7 版改变: Thread support and OpenSSL 1.0.2 are now required.
3.10 版改变: OpenSSL 1.1.1 is now required.
3.11 版改变: C11 compiler, IEEE 754 and NaN support are now required. On Windows, Visual Studio 2017 or later is required.
另请参阅 PEP 7 “Style Guide for C Code” and PEP 11 “CPython platform support”.
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.
Makefile.pre.in
regen-*
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.
make regen-configure
aclocal.m4
configure
Tools/build/regen-configure.sh
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.
autoconf-archive
aclocal
pkg-config
列表所有 ./configure 脚本选项使用:
./configure
./configure --help
另请参阅 Misc/SpecialBuilds.txt 在 Python 源分发。
Misc/SpecialBuilds.txt
支持可加载扩展在 _sqlite extension module (default is no) of the sqlite3 模块。
_sqlite
sqlite3
见 sqlite3.Connection.enable_load_extension() 方法在 sqlite3 模块。
sqlite3.Connection.enable_load_extension()
Added in version 3.6.
Disable IPv6 support (enabled by default if supported), see the socket 模块。
socket
Define the size in bits of Python int digits: 15 or 30 bits.
int
By default, the digit size is 30.
定义 PYLONG_BITS_IN_DIGIT to 15 or 30 .
PYLONG_BITS_IN_DIGIT
15
30
见 sys.int_info.bits_per_digit .
sys.int_info.bits_per_digit
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).
.exe
python.exe
.js
.html
.wasm
python
3.11 版改变: The default suffix on WASM platform is one of .js , .html or .wasm .
Select the default time zone search path for zoneinfo.TZPATH 。见 编译时配置 的 zoneinfo 模块。
zoneinfo.TZPATH
zoneinfo
默认: /usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo .
/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo
见 os.pathsep path separator.
os.pathsep
Added in version 3.9.
Build the _decimal extension module using a thread-local context rather than a coroutine-local context (default), see the decimal 模块。
_decimal
decimal
见 decimal.HAVE_CONTEXTVAR 和 contextvars 模块。
decimal.HAVE_CONTEXTVAR
contextvars
Override order to check db backends for the dbm 模块
dbm
A valid value is a colon ( : ) separated string with the backend names:
:
ndbm ;
ndbm
gdbm ;
gdbm
bdb .
bdb
Disable C locale coercion to a UTF-8 based locale (enabled by default).
Don’t define the PY_COERCE_C_LOCALE 宏。
PY_COERCE_C_LOCALE
见 PYTHONCOERCECLOCALE 和 PEP 538 .
PYTHONCOERCECLOCALE
Disable all freelists except the empty tuple singleton.
Added in version 3.11.
Python library directory name (default is lib ).
lib
Fedora and SuSE use lib64 on 64-bit platforms.
lib64
见 sys.platlibdir .
sys.platlibdir
Directory of wheel packages used by the ensurepip module (none by default).
ensurepip
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 ensurepip._bundled 包。
/usr/share/python-wheels/
ensurepip._bundled
Added in version 3.10.
Whether configure should use pkg-config to detect build dependencies.
check (default): pkg-config is optional
check
yes : pkg-config is mandatory
yes
no : configure does not use pkg-config even when present
no
Turn on internal statistics gathering.
The statistics will be dumped to a arbitrary (probably unique) file in /tmp/py_stats/ ,或 C:\temp\py_stats\ on Windows. If that directory does not exist, results will be printed on stdout.
/tmp/py_stats/
C:\temp\py_stats\
使用 Tools/scripts/summarize_stats.py to read the stats.
Tools/scripts/summarize_stats.py
Set build flavor for wasm32-emscripten .
wasm32-emscripten
browser (default): preload minimal stdlib, default MEMFS.
browser
node : NODERAWFS and pthread support.
node
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.
dlopen
Turn on pthreads support for WASM.
Install architecture-independent files in PREFIX. On Unix, it defaults to /usr/local .
/usr/local
This value can be retrieved at runtime using sys.prefix .
sys.prefix
As an example, one can use --prefix="$HOME/.local/" to install a Python in its home directory.
--prefix="$HOME/.local/"
Install architecture-dependent files in EPREFIX, defaults to --prefix .
--prefix
This value can be retrieved at runtime using sys.exec_prefix .
sys.exec_prefix
Don’t build nor install test modules, like the test package or the _testcapi extension module (built and installed by default).
test
_testcapi
选择 ensurepip command run on Python installation:
upgrade (default): run python -m ensurepip --altinstall --upgrade 命令。
upgrade
python -m ensurepip --altinstall --upgrade
install : run python -m ensurepip --altinstall command;
install
python -m ensurepip --altinstall
no : don’t run ensurepip;
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.
--enable-optimizations --with-lto
--enable-bolt
Enable Profile Guided Optimization (PGO) using PROFILE_TASK (disabled by default).
PROFILE_TASK
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.
llvm-profdata
Disable also semantic interposition in libpython if --enable-shared and GCC is used: add -fno-semantic-interposition to the compiler and linker flags.
--enable-shared
-fno-semantic-interposition
注意
During the build, you may encounter compiler warnings about profile data not being available for some source files. These warnings are harmless, as only a subset of the code is exercised during profile data acquisition. To disable these warnings on Clang, manually suppress them by adding -Wno-profile-instr-unprofiled to CFLAGS .
-Wno-profile-instr-unprofiled
CFLAGS
3.10 版改变: 使用 -fno-semantic-interposition on GCC.
Environment variable used in the Makefile: Python command line arguments for the PGO generation task.
默认: -m test --pgo --timeout=$(TESTTIMEOUT) .
-m test --pgo --timeout=$(TESTTIMEOUT)
Added in version 3.8.
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 ).
llvm-ar
ar
ld.gold
lld
Added in version 3.11: To use ThinLTO feature, use --with-lto=thin on Clang.
--with-lto=thin
Changed in version 3.12: Use ThinLTO as the default optimization policy on Clang if the compiler accepts the flag.
Enable usage of the BOLT post-link binary optimizer (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.
llvm-bolt
merge-fdata
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 BOLT_INSTRUMENT_FLAGS and BOLT_APPLY_FLAGS configure variables can be defined to override the default set of arguments for llvm-bolt to instrument and apply BOLT data to binaries, respectively.
BOLT_INSTRUMENT_FLAGS
BOLT_APPLY_FLAGS
3.12 版添加。
Enable computed gotos in evaluation loop (enabled by default on supported compilers).
Disable the specialized Python memory allocator pymalloc (enabled by default).
另请参阅 PYTHONMALLOC 环境变量。
PYTHONMALLOC
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 宏。
WITH_DOC_STRINGS
见 PyDoc_STRVAR() 宏。
PyDoc_STRVAR()
Enable C-level code profiling with gprof (disabled by default).
gprof
添加 -fstrict-overflow to the C compiler flags (by default we add -fno-strict-overflow 代替)。
-fstrict-overflow
-fno-strict-overflow
A debug build is Python built with the --with-pydebug 配置选项。
--with-pydebug
Effects of a debug build:
Display all warnings by default: the list of default warning filters is empty in the warnings 模块。
warnings
添加 d to sys.abiflags .
d
sys.abiflags
添加 sys.gettotalrefcount() 函数。
sys.gettotalrefcount()
添加 -X showrefcount 命令行选项。
-X showrefcount
添加 -d 命令行选项和 PYTHONDEBUG environment variable to debug the parser.
-d
PYTHONDEBUG
Add support for the __lltrace__ variable: enable low-level tracing in the bytecode evaluation loop if the variable is defined.
__lltrace__
安装 debug hooks on memory allocators to detect buffer overflow and other memory errors.
Define Py_DEBUG and Py_REF_DEBUG 宏。
Py_DEBUG
Py_REF_DEBUG
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 --with-assertions configure option). Main runtime checks:
#ifdef Py_DEBUG
#endif
assert(...)
_PyObject_ASSERT(...)
NDEBUG
--with-assertions
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 ( gc.collect() function) runs some basic checks on objects consistency.
gc.collect()
The Py_SAFE_DOWNCAST() macro checks for integer underflow and overflow when downcasting from wide types to narrow types.
Py_SAFE_DOWNCAST()
另请参阅 Python 开发模式 和 --with-trace-refs 配置选项。
--with-trace-refs
3.8 版改变: 发行构建和调试构建现在兼容 ABI:定义的 Py_DEBUG 宏不再隐含 Py_TRACE_REFS macro (see the --with-trace-refs option), which introduces the only ABI incompatibility.
Py_TRACE_REFS
Build Python in debug mode : define the Py_DEBUG macro (disabled by default).
Enable tracing references for debugging purpose (disabled by default).
Effects:
定义 Py_TRACE_REFS 宏。
添加 sys.getobjects() 函数。
sys.getobjects()
添加 PYTHONDUMPREFS 环境变量。
PYTHONDUMPREFS
This build is not ABI compatible with release build (default build) or debug build ( Py_DEBUG and Py_REF_DEBUG macros).
Build with C assertions enabled (default is no): assert(...); and _PyObject_ASSERT(...); .
assert(...);
_PyObject_ASSERT(...);
If set, the NDEBUG macro is not defined in the OPT compiler variable.
OPT
另请参阅 --with-pydebug option ( 调试构建 ) which also enables assertions.
Enable Valgrind support (default is no).
Enable DTrace support (default is no).
见 采用 DTrace 和 SystemTap 仪表 CPython .
Enable AddressSanitizer memory error detector, asan (default is no).
asan
Enable MemorySanitizer allocation error detector, msan (default is no).
msan
Enable UndefinedBehaviorSanitizer undefined behaviour detector, ubsan (default is no).
ubsan
Enable building a shared Python library: libpython (default is no).
libpython
Do not build libpythonMAJOR.MINOR.a and do not install python.o (built and enabled by default).
libpythonMAJOR.MINOR.a
python.o
Link against additional libraries (default is no).
Build the pyexpat module using an installed expat library (default is no).
pyexpat
expat
Build the _decimal extension module using an installed mpdec library, see the decimal module (default is no).
mpdec
Added in version 3.3.
使用 editline library for backend of the readline 模块。
editline
readline
定义 WITH_EDITLINE 宏。
WITH_EDITLINE
Don’t build the readline module (built by default).
Don’t define the HAVE_LIBREADLINE 宏。
HAVE_LIBREADLINE
Override libm math library to STRING (default is system-dependent).
libm
Override libc C library to STRING (default is system-dependent).
libc
Root of the OpenSSL directory.
Added in version 3.7.
Set runtime library directory (rpath) for OpenSSL libraries:
no (default): don’t set rpath;
auto : auto-detect rpath from --with-openssl and pkg-config ;
auto
--with-openssl
DIR : set an explicit rpath.
Select hash algorithm for use in Python/pyhash.c :
Python/pyhash.c
siphash13 (default);
siphash13
siphash24 ;
siphash24
fnv .
fnv
Added in version 3.4.
Added in version 3.11: siphash13 is added and it is the new default.
Built-in hash modules:
md5 ;
md5
sha1 ;
sha1
sha256 ;
sha256
sha512 ;
sha512
sha3 (with shake);
sha3
blake2 .
blake2
Override the OpenSSL default cipher suites string:
python (default): use Python’s preferred selection;
openssl : leave OpenSSL’s defaults untouched;
openssl
STRING : use a custom string
见 ssl 模块。
3.10 版改变: The settings python and STRING also set TLS 1.2 as minimum protocol version.
见 Mac/README.rst .
Mac/README.rst
Create a universal binary build. SDKDIR specifies which macOS SDK should be used to perform the build (default is no).
Create a Python.framework rather than a traditional Unix install. Optional INSTALLDIR specifies the installation path (default is no).
Specify the kind of universal binary that should be created. This option is only valid when --enable-universalsdk 有设置。
--enable-universalsdk
Options:
universal2 ;
universal2
32-bit ;
32-bit
64-bit ;
64-bit
3-way ;
3-way
intel ;
intel
intel-32 ;
intel-32
intel-64 ;
intel-64
all .
all
Specify the name for the python framework on macOS only valid when --enable-framework is set (default: Python ).
--enable-framework
Python
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.
configure for building on BUILD, usually guessed by config.guess .
cross-compile to build programs to run on HOST (target platform)
path to build python binary for cross compiling
An environment variable that points to a file with configure overrides.
范例 config.site 文件:
# config.site-aarch64 ac_cv_buggy_getaddrinfo=no ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=no
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
configure.ac => configure ;
configure.ac
Makefile.pre.in => Makefile (创建通过 configure );
Makefile
pyconfig.h (创建通过 configure );
pyconfig.h
Modules/Setup : C extensions built by the Makefile using Module/makesetup shell script;
Modules/Setup
Module/makesetup
C 文件 ( .c ) are built as object files ( .o ).
.c
.o
A static libpython library ( .a ) is created from objects files.
.a
python.o and the static libpython library are linked into the final python program.
C extensions are built by the Makefile (see Modules/Setup ).
make : Build Python with the standard library.
make
make platform: : build the python program, but don’t build the standard library extension modules.
make platform:
make profile-opt : build Python using Profile Guided Optimization (PGO). You can use the configure --enable-optimizations option to make this the default target of the make 命令 ( make all or just make ).
make profile-opt
--enable-optimizations
make all
make buildbottest : Build Python and run the Python test suite, the same way than buildbots test Python. Set TESTTIMEOUT variable (in seconds) to change the test timeout (1200 by default: 20 minutes).
make buildbottest
TESTTIMEOUT
make install : Build and install Python.
make install
make regen-all : Regenerate (almost) all generated files; make regen-stdlib-module-names and autoconf must be run separately for the remaining generated files.
make regen-all
make regen-stdlib-module-names
autoconf
make clean : Remove built files.
make clean
make distclean : Same than make clean , but remove also files created by the configure script.
make distclean
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__ 属性:
sys
Py_BUILD_CORE_BUILTIN
__file__
>>> import sys >>> sys <module 'sys' (built-in)> >>> sys.__file__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'sys' has no attribute '__file__'
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:
_asyncio
Py_BUILD_CORE_MODULE
>>> import _asyncio >>> _asyncio <module '_asyncio' from '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'> >>> _asyncio.__file__ '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'
Modules/Setup 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.
*shared*
The PyAPI_FUNC() , PyAPI_DATA() and PyMODINIT_FUNC macros of Include/exports.h are defined differently depending if the Py_BUILD_CORE_MODULE macro is defined:
PyAPI_FUNC()
PyAPI_DATA()
PyMODINIT_FUNC
Include/exports.h
使用 Py_EXPORTED_SYMBOL 若 Py_BUILD_CORE_MODULE is defined
Py_EXPORTED_SYMBOL
使用 Py_IMPORTED_SYMBOL 否则。
Py_IMPORTED_SYMBOL
若 Py_BUILD_CORE_BUILTIN macro is used by mistake on a C extension built as a shared library, its PyInit_xxx() function is not exported, causing an ImportError on import.
PyInit_xxx()
ImportError
Options set by the ./configure script and environment variables and used by Makefile .
Value of CPPFLAGS variable passed to the ./configure 脚本。
CPPFLAGS
(Objective) C/C++ preprocessor flags, e.g. -Iinclude_dir if you have headers in a nonstandard directory include_dir .
-Iinclude_dir
Both CPPFLAGS and LDFLAGS need to contain the shell’s value to be able to build extension modules using the directories specified in the environment variables.
LDFLAGS
Extra preprocessor flags added for building the interpreter object files.
默认: $(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS) .
$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)
Added in version 3.2.
C compiler command.
范例: gcc -pthread .
gcc -pthread
C++ compiler command.
范例: g++ -pthread .
g++ -pthread
C compiler flags.
CFLAGS_NODIST is used for building the interpreter and stdlib C extensions. Use it when a compiler flag should not be part of CFLAGS once Python is installed ( gh-65320 ).
CFLAGS_NODIST
In particular, 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 CFLAGS would take precedence over user- and package-supplied -I 标志。
-I
hardening flags such as -Werror because distributions cannot control whether packages installed by users conform to such heightened standards.
-Werror
Added in version 3.5.
Options passed to the compileall command line when building PYC files in make install . Default: -j0 .
compileall
-j0
Extra C compiler flags.
Value of CFLAGS variable passed to the ./configure 脚本。
Value of CFLAGS_NODIST variable passed to the ./configure 脚本。
Base compiler flags.
Optimization flags.
Strict or non-strict aliasing flags used to compile Python/dtoa.c .
Python/dtoa.c
Compiler flags used to build a shared library.
例如, -fPIC is used on Linux and on BSD.
-fPIC
Extra C flags added for building the interpreter object files.
默认: $(CCSHARED) 当 --enable-shared is used, or an empty string otherwise.
$(CCSHARED)
默认: $(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) .
$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)
默认: $(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal .
$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal
C flags used for building the interpreter object files.
默认: $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) .
$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)
默认: $(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE .
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE
Compiler flags to build a standard library extension module as a built-in module, like the posix 模块。
posix
默认: $(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN .
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN
Purify command. Purify is a memory debugger program.
Default: empty string (not used).
Linker command used to build programs like python and _testembed .
_testembed
默认: $(PURIFY) $(CC) .
$(PURIFY) $(CC)
Value of LDFLAGS variable passed to the ./configure 脚本。
Avoid assigning CFLAGS , LDFLAGS , etc. so users can use them on the command line to append to these values without stomping the pre-set values.
LDFLAGS_NODIST is used in the same manner as CFLAGS_NODIST . Use it when a linker flag should not be part of LDFLAGS once Python is installed ( gh-65320 ).
LDFLAGS_NODIST
In particular, 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 LDFLAGS would take precedence over user- and package-supplied -L 标志。
-L
Value of LDFLAGS_NODIST variable passed to the ./configure 脚本。
Linker flags, e.g. -Llib_dir if you have libraries in a nonstandard directory lib_dir .
-Llib_dir
Linker flags to pass libraries to the linker when linking the Python executable.
范例: -lrt .
-lrt
Command to build a shared library.
默认: @LDSHARED@ $(PY_LDFLAGS) .
@LDSHARED@ $(PY_LDFLAGS)
Command to build libpython shared library.
默认: @BLDSHARED@ $(PY_CORE_LDFLAGS) .
@BLDSHARED@ $(PY_CORE_LDFLAGS)
默认: $(CONFIGURE_LDFLAGS) $(LDFLAGS) .
$(CONFIGURE_LDFLAGS) $(LDFLAGS)
默认: $(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST) .
$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)
Linker flags used for building the interpreter object files.
4. 在 Windows 使用 Python
键入搜索术语或模块、类、函数名称。