3. 配置 Python?
3.1. 配置參數(shù)?
用以下方式列出腳本 ./configure 的所有參數(shù):
./configure --help
參閱 Python 源代碼中的 Misc/SpecialBuilds.txt 。
3.1.1. 常用參數(shù)?
- --enable-loadable-sqlite-extensions?
支持
_sqlite擴展模塊中的可加載擴展(默認(rèn)為否)。參見
sqlite3.Connection.enable_load_extension()方法的sqlite3模塊。3.6 新版功能.
- --enable-big-digits=[15|30]?
定義 Python
int數(shù)字的比特大小:15或30比特By default, the digit size is 30.
定義
PYLONG_BITS_IN_DIGIT為15或30。
- --with-cxx-main?
- --with-cxx-main=COMPILER?
編譯 Python
main()函數(shù),用 C++ 編譯器鏈接 Python 可執(zhí)行文件: $CXX` 或 COMPILER。
- --with-suffix=SUFFIX?
將 Python 的可執(zhí)行文件后綴設(shè)置為 SUFFIX。
The default suffix is
.exeon Windows and macOS (python.exeexecutable),.json Emscripten node,.htmlon Emscripten browser,.wasmon WASI, and an empty string on other platforms (pythonexecutable).在 3.11 版更改: The default suffix on WASM platform is one of
.js,.htmlor.wasm.
- --with-tzpath=<list of absolute paths separated by pathsep>?
為
zoneinfo.TZPATH選擇默認(rèn)的時區(qū)搜索路徑。 參見zoneinfo模塊的 編譯時配置。默認(rèn):
/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo參閱
os.pathsep路徑分隔符。3.9 新版功能.
- --without-decimal-contextvar?
編譯
_decimal擴展模塊時使用線程本地上下文,而不是協(xié)程本地上下文(默認(rèn)),參見decimal模塊。參見
decimal.HAVE_CONTEXTVAR和contextvars模塊。3.9 新版功能.
- --with-dbmliborder=<list of backend names>?
覆蓋
dbm模塊的 db 后端檢查順序。合法值是用冒號(
:)分隔的字符串,包含后端名稱。ndbm;gdbm;bdb。
- --without-c-locale-coercion?
禁用 C 語言對 UTF-8 的強制要求(默認(rèn)為啟用)。
不定義
PY_COERCE_C_LOCALE宏。參閱
PYTHONCOERCECLOCALE和 PEP 538。
- --with-platlibdir=DIRNAME?
Python 庫目錄名(默認(rèn)為
lib)。Fedora 和 SuSE 在64 位平臺用
lib64。參閱
sys.platlibdir。3.9 新版功能.
- --with-wheel-pkg-dir=PATH?
ensurepip模塊用到的 wheel 包目錄(默認(rèn)為無)。某些 Linux 發(fā)行版的打包策略建議不要捆綁依賴關(guān)系。如 Fedora 在``/usr/share/python-wheels/`` 目錄下安裝 wheel 包,而不安裝
ensurepip._bundled包。3.10 新版功能.
- --with-pkg-config=[check|yes|no]?
Whether configure should use pkg-config to detect build dependencies.
check(default): pkg-config is optionalyes: pkg-config is mandatoryno: configure does not use pkg-config even when present
3.11 新版功能.
- --enable-pystats?
Turn on internal statistics gathering.
The statistics will be dumped to a arbitrary (probably unique) file in
/tmp/py_stats/, orC:\temp\py_stats\on Windows.Use
Tools/scripts/summarize_stats.pyto read the stats.3.11 新版功能.
3.1.2. WebAssembly Options?
- --with-emscripten-target=[browser|node]?
Set build flavor for
wasm32-emscripten.browser(default): preload minimal stdlib, default MEMFS.node: NODERAWFS and pthread support.
3.11 新版功能.
- --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.3.11 新版功能.
- --enable-wasm-pthreads?
Turn on pthreads support for WASM.
3.11 新版功能.
3.1.3. 安裝時的選項?
3.1.4. 性能選項?
建議用 --enable-optimizations --with-lto (PGO + LTO)配置 Python,以便實現(xiàn)最佳性能。
- --enable-optimizations?
用
PROFILE_TASK啟用以配置文件主導(dǎo)的優(yōu)化(PGO)(默認(rèn)為禁用)。C 編譯器 Clang 需要用到
llvm-profdata程序進行 PGO。在 macOS 上,GCC 也需要用到它:在 macOS 上 GCC 只是 Clang 的別名而已。如果使用
--enable-shared和 GCC ,還可以禁用 libpython 中的語義插值:在編譯器和鏈接器的標(biāo)志中加入-fno-semantic-interposition。3.6 新版功能.
在 3.10 版更改: 在 GCC 上使用
-fno-semantic-interposition。
- PROFILE_TASK?
Makefile 用到的環(huán)境變量:PGO 用到的 Python 命令行參數(shù)。
默認(rèn)為:
-m test --pgo --timeout=$(TESTTIMEOUT)。3.8 新版功能.
- --with-lto=[full|thin|no|yes]?
在編譯過程中啟用鏈接時間優(yōu)化(LTO)(默認(rèn)為禁用)。
LTO 時 C 編譯器 Clang 需要用到
llvm-ar參數(shù)(在 macOS 則為ar),以及支持 LTO 的鏈接器(ld.gold或lld)。3.6 新版功能.
3.11 新版功能: To use ThinLTO feature, use
--with-lto=thinon Clang.
- --with-computed-gotos?
在求值環(huán)節(jié)啟用 goto 計數(shù)(在支持的編譯器上默認(rèn)啟用)。
- --without-pymalloc?
禁用特定的 Python 內(nèi)存分配器 pymalloc (默認(rèn)為啟用)。
參見環(huán)境變量
PYTHONMALLOC。
- --without-doc-strings?
禁用靜態(tài)文檔字符串以減少內(nèi)存占用(默認(rèn)啟用)。Python 中定義的文檔字符串不受影響。
不定義
PY_COERCE_C_LOCALE宏。參閱宏
PyDoc_STRVAR()。
- --enable-profiling?
用
gprof啟用 C 語言級的代碼評估(默認(rèn)為禁用)。
3.1.5. Python 調(diào)試級編譯?
調(diào)試版本 Python 是指帶有 --with-pydebug 參數(shù)的編譯。
調(diào)試版本的效果:
默認(rèn)顯示所有警告:在
warnings模塊中,默認(rèn)警告過濾器的列表是空的。在
sys.abiflags中加入d標(biāo)記。加入
sys.gettotalrefcount()函數(shù)。命令行參數(shù)加入
-X showrefcount。Add
-dcommand line option andPYTHONDEBUGenvironment 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.安裝 內(nèi)存分配調(diào)試鉤子 ,以便檢測緩沖區(qū)溢出和其他內(nèi)存錯誤。
定義宏
Py_DEBUG和Py_REF_DEBUG。Add runtime checks: code surrounded by
#ifdef Py_DEBUGand#endif. Enableassert(...)and_PyObject_ASSERT(...)assertions: don't set theNDEBUGmacro (see also the--with-assertionsconfigure option). Main runtime checks:增加了對函數(shù)參數(shù)的合理性檢查。
創(chuàng)建 Unicode 和 int 對象時,內(nèi)存按某種模式進行了填充,用于檢測是否使用了未初始化的對象。
確保有能力清除或替換當(dāng)前異常的函數(shù)在調(diào)用時不會引發(fā)異常。
Check that deallocator functions don't change the current exception.
垃圾收集器(
gc.collect()函數(shù))對對象的一致性進行一些基本檢查。從較寬類型轉(zhuǎn)換到較窄類型時,
Py_SAFE_DOWNCAST()宏會檢查整數(shù)下溢和上溢的情況。
參見 Python 開發(fā)模式 和配置參數(shù) --with-trace-refs 。
在 3.8 版更改: 發(fā)布版和調(diào)試版的編譯現(xiàn)在是 ABI 兼容的:定義了 Py_DEBUG 宏不再意味著同時定義了 Py_TRACE_REFS 宏(參見 --with-trace-refs 參數(shù)),這引入了唯一一處不是 ABI 兼容的地方。
3.1.6. 調(diào)試選項?
- --with-pydebug?
在調(diào)試模式下編譯 Python: 定義宏
Py_DEBUG(默認(rèn)為禁用)。
- --with-trace-refs?
為了調(diào)試而啟用引用的跟蹤(默認(rèn)為禁用)。
效果如下:
定義
Py_TRACE_REFS宏。加入
sys.getobjects()函數(shù)。環(huán)境變量加入
PYTHONDUMPREFS。
此版本與發(fā)布模式(默認(rèn)編譯模式)或調(diào)試模式(
Py_DEBUG和Py_REF_DEBUG宏)不具備 ABI 兼容性。3.8 新版功能.
- --with-assertions?
編譯時啟用 C 斷言:
assert(...);和_PyObject_ASSERT(...);(默認(rèn)不啟用)。如果設(shè)置此參數(shù),則在
OPT編譯器變量中不定義NDEBUG宏。參閱
--with-pydebug選項(調(diào)試編譯模式),它也可以啟用斷言。3.6 新版功能.
- --with-valgrind?
啟用 Valgrind (默認(rèn)禁用)。
- --with-dtrace?
啟用 DTrace(默認(rèn)禁用)。
參閱 用 DTrace 和 SystemTap 測試 CPython。
3.6 新版功能.
- --with-address-sanitizer?
啟用 AddressSanitizer 內(nèi)存錯誤檢測
asan,(默認(rèn)為禁用)。3.6 新版功能.
- --with-memory-sanitizer?
啟用 MemorySanitizer 內(nèi)存錯誤檢測
msan,(默認(rèn)為禁用)。3.6 新版功能.
- --with-undefined-behavior-sanitizer?
啟用 undefinedBehaviorSanitizer 未定義行為檢測
ubsan,(默認(rèn)為禁用)。3.6 新版功能.
3.1.7. 鏈接器選項?
啟用共享 Python 庫
libpython的編譯(默認(rèn)為禁用)。
- --without-static-libpython?
不編譯
libpythonMAJOR.MINOR.a,也不安裝python.o(默認(rèn)會編譯并安裝)。3.10 新版功能.
3.1.8. 庫選項?
- --with-libs='lib1 ...'?
鏈接附加庫(默認(rèn)不會)。
- --with-system-expat?
用已安裝的
expat庫編譯pyexpat模塊(默認(rèn)為否)。
- --with-libm=STRING?
將
libm數(shù)學(xué)庫覆蓋為 STRING (默認(rèn)情況視系統(tǒng)而定)。
- --with-libc=STRING?
將
libcC 庫覆蓋為 STRING (默認(rèn)情況視系統(tǒng)而定)。
- --with-openssl=DIR?
OpenSSL 的根目錄。
3.7 新版功能.
- --with-openssl-rpath=[no|auto|DIR]?
設(shè)置 OpenSSL 庫的運行時庫目錄(rpath)。
no(默認(rèn)): 不設(shè)置 rpath。auto:根據(jù)--with-openssl和pkg-config自動檢測 rpath。DIR :直接設(shè)置 rpath。
3.10 新版功能.
3.1.9. 安全性選項?
- --with-hash-algorithm=[fnv|siphash13|siphash24]?
選擇
Python/pyhash.c采用的哈希算法。siphash13(default);siphash24;fnv.
3.4 新版功能.
3.11 新版功能:
siphash13is added and it is the new default.
- --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2?
內(nèi)置哈希模塊:
md5。sha1。sha256。sha512。sha3(帶 shake)。blake2。
3.9 新版功能.
3.1.10. macOS 選項?
參見 Mac/README.rst 。
- --enable-universalsdk?
- --enable-universalsdk=SDKDIR?
創(chuàng)建通用的二進制版本。SDKDIR 指定應(yīng)采用的 macOS SDK (默認(rèn)為否)。
- --enable-framework?
- --enable-framework=INSTALLDIR?
創(chuàng)建 Python.framework ,而不是傳統(tǒng)的 Unix 安裝版??蛇x參數(shù) INSTALLDIR 指定了安裝路徑((默認(rèn)為否)。
- --with-universal-archs=ARCH?
指定應(yīng)創(chuàng)建何種通用二進制文件。該選項僅當(dāng)設(shè)置了
--enable-universalsdk時才有效。可選項:
universal2。32-bit。64-bit。3-way。intel。intel-32。intel-64。all。
- --with-framework-name=FRAMEWORK?
為 macOS 中的 python 框架指定名稱,僅當(dāng)設(shè)置了
--enable-framework時有效(默認(rèn):Python)。
3.1.11. 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.
- --build=BUILD?
configure for building on BUILD, usually guessed by config.guess.
- --host=HOST?
cross-compile to build programs to run on HOST (target platform)
- --with-build-python=path/to/python?
path to build
pythonbinary for cross compiling3.11 新版功能.
- CONFIG_SITE=file?
An environment variable that points to a file with configure overrides.
Example config.site file:
# 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
3.2. Python 構(gòu)建系統(tǒng)?
3.2.1. 構(gòu)建系統(tǒng)的主要文件?
configure.ac=>configure;Makefile.pre.in=>Makefile(由configure創(chuàng)建);pyconfig.h(由configure創(chuàng)建);Modules/Setup: 由Makefile 使用Module/makesetupshell 腳本構(gòu)建的 C 擴展;setup.py: 使用distutils模塊構(gòu)建的 C 擴展。
3.2.2. 主要構(gòu)建步驟?
C文件(
.c)是作為對象文件(.o)構(gòu)建的。一個靜態(tài)庫
libpython(.a)是由對象文件創(chuàng)建的。python.o和靜態(tài)庫libpython被鏈接到最終程序python中。C 擴展由 Makefile (參見
Modules/Setup) 和python setup.py build構(gòu)建。
3.2.3. 主要 Makefile 目標(biāo)?
make:用標(biāo)準(zhǔn)庫構(gòu)建Python。make platform::構(gòu)建python程序,但不構(gòu)建標(biāo)準(zhǔn)庫擴展模塊。make profile-opt:使用 Profile Guided Optimization (PGO) 構(gòu)建 Python 。你可以使用 configure 的--enable-optimizations選項來使其成為make命令的默認(rèn)目標(biāo)(make all或只是make)。make buildbottest:構(gòu)建 Python 并運行 Python 測試套件,與 buildbots 測試 Python 的方式相同。設(shè)置變量TESTTIMEOUT(單位:秒)來改變測試超時時間(默認(rèn)為 1200 即 20 分鐘)。make install:構(gòu)建并安裝 Python 。make regen-all:重新生成(幾乎)所有生成的文件;make regen-stdlib-module-names和autoconf必須對其余生成的文件單獨運行。make clean:移除構(gòu)建的文件。make distclean:與make clean相同,但也刪除由配置腳本創(chuàng)建的文件。
3.2.4. C 擴展?
一些 C 擴展是作為內(nèi)置模塊構(gòu)建的,比如模塊 sys 。它們是在定義了宏 Py_BUILD_CORE_BUILTIN 的情況下構(gòu)建的。內(nèi)置模塊沒有 __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:
>>> 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 用于生成 Makefile 目標(biāo),以構(gòu)建 C 擴展。在文件的開頭, C 被構(gòu)建為內(nèi)置模塊。在標(biāo)記 *shared* 之后定義的擴展被構(gòu)建為動態(tài)庫。
setup.py 腳本只使用 distutils 模塊將 C 構(gòu)建為共享庫。
宏 PyAPI_FUNC() , PyAPI_API() 和 PyMODINIT_FUNC() 在 Include/pyport.h 中的定義不同,取決于是否定義宏 Py_BUILD_CORE_MODULE 。
如果
Py_BUILD_CORE_MODULE定義了,使用Py_EXPORTED_SYMBOL。否則使用
Py_IMPORTED_SYMBOL。
如果宏 Py_BUILD_CORE_BUILTIN 被錯誤地用在作為共享庫構(gòu)建的 C 擴展上,它的函數(shù) PyInit_xxx() 就不會被導(dǎo)出,導(dǎo)致導(dǎo)入時出現(xiàn) ImportError 。
3.3. 編譯器和鏈接器的標(biāo)志?
腳本 ./configure 和環(huán)境變量設(shè)置的選項,并被 Makefile 使用。
3.3.1. 預(yù)處理器的標(biāo)志?
- CPPFLAGS?
( Objective ) C/C++ 預(yù)處理器標(biāo)志,例如,使用
-I<include dir>如果你的頭文件在一個非標(biāo)準(zhǔn)的目錄<include dir>中 、CPPFLAGS和LDFLAGS都需要包含shell的值,以便 setup.py 能夠使用環(huán)境變量中指定的目錄構(gòu)建擴展模塊。
- BASECPPFLAGS?
3.4 新版功能.
- PY_CPPFLAGS?
為構(gòu)建解釋器對象文件增加了額外的預(yù)處理器標(biāo)志。
默認(rèn)為:
$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)。3.2 新版功能.
3.3.2. 編譯器標(biāo)志?
- CC?
C 編譯器指令。
例如:
gcc -pthread。
- MAINCC?
C編譯器命令用于構(gòu)建像
python這樣的程序的main()函數(shù)。由配置腳本的
--with-cxx-main選項設(shè)置的變量。默認(rèn)為:
$(CC)。
- CXX?
C++ 編譯器指令。
如果使用了
--with-cxx-main選項,則使用。例如:
g++ -pthread。
- CFLAGS?
C 編譯器標(biāo)志。
- CFLAGS_NODIST?
CFLAGS_NODIST用于構(gòu)建解釋器和 stdlib C 擴展。當(dāng) Python 安裝后,編譯器標(biāo)志 不 應(yīng)該成為 distutilsCFLAGS的一部分時,可以使用它 ( bpo-21121 )。3.5 新版功能.
- EXTRA_CFLAGS?
而外的 C 編譯器指令。
- CONFIGURE_CFLAGS_NODIST?
變量
CFLAGS_NODIST的值傳遞給./configure腳本。3.5 新版功能.
- BASECFLAGS?
基礎(chǔ)編譯器標(biāo)志。
- OPT?
優(yōu)化標(biāo)志。
- CFLAGS_ALIASING?
嚴(yán)格或不嚴(yán)格的別名標(biāo)志,用于編譯
Python/dtoa.c、3.7 新版功能.
- CCSHARED?
用于構(gòu)建共享庫的編譯器標(biāo)志。
例如,
-fPIC在 Linux 和 BSD 上使用。
- CFLAGSFORSHARED?
為構(gòu)建解釋器對象文件增加了額外的 C 標(biāo)志。
,默認(rèn)為:
$(CCSHARED),當(dāng)--enable-shared被使用時,則為空字符串
- PY_CFLAGS?
默認(rèn)為:
$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)。
- PY_CFLAGS_NODIST?
默認(rèn)為:
$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal。3.5 新版功能.
- PY_STDMODULE_CFLAGS?
用于構(gòu)建解釋器對象文件的 C 標(biāo)志。
默認(rèn)為:
$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)。3.7 新版功能.
- PY_CORE_CFLAGS?
默認(rèn)為
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE。3.2 新版功能.
- PY_BUILTIN_MODULE_CFLAGS?
編譯器標(biāo)志,將標(biāo)準(zhǔn)庫的擴展模塊作為內(nèi)置模塊來構(gòu)建,如
posix模塊默認(rèn)為:
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN。3.8 新版功能.
- PURIFY?
Purify 命令。 Purify 是一個內(nèi)存調(diào)試程序。
默認(rèn)為:空字符串(不使用)。
3.3.3. 鏈接器標(biāo)志位?
- LINKCC?
用于構(gòu)建如
python和_testembed的程序的鏈接器命令。默認(rèn)為:
$(PURIFY) $(MAINCC)。
- CONFIGURE_LDFLAGS?
變量
LDFLAGS的值被傳遞給./configure腳本。避免指定
CFLAGS,LDFLAGS等,這樣用戶就可以在命令行上使用它們來追加這些值,而不用觸碰到預(yù)設(shè)的值。3.2 新版功能.
- LDFLAGS_NODIST?
LDFLAGS_NODIST的使用方式與CFLAGS_NODIST相同。當(dāng) Python 安裝后,鏈接器標(biāo)志 不 應(yīng)該成為 distutilsLDFLAGS的一部分時,可以使用它( bpo-35257 )。
- CONFIGURE_LDFLAGS_NODIST?
變量
LDFLAGS_NODIST的值傳遞給./configure腳本。3.8 新版功能.
- LDFLAGS?
鏈接器標(biāo)志,例如,如果你的庫在一個非標(biāo)準(zhǔn)的目錄
<lib dir>中,則使用-L<lib dir>。CPPFLAGS和LDFLAGS都需要包含shell的值,以便 setup.py 能夠使用環(huán)境變量中指定的目錄構(gòu)建擴展模塊。
- LIBS?
鏈接器標(biāo)志,在鏈接 Python 可執(zhí)行文件時將庫傳遞給鏈接器。
例如:
-lrt。
- LDSHARED?
構(gòu)建一個共享庫的命令。
默認(rèn)為:
@LDSHARED@ $(PY_LDFLAGS)。
- BLDSHARED?
構(gòu)建共享庫
libpython的命令。默認(rèn)為:
@BLDSHARED@ $(PY_CORE_LDFLAGS)。
- PY_LDFLAGS?
默認(rèn)為:
$(CONFIGURE_LDFLAGS) $(LDFLAGS)。
- PY_LDFLAGS_NODIST?
默認(rèn)為:
$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)。3.8 新版功能.
- PY_CORE_LDFLAGS?
用于構(gòu)建解釋器對象文件的鏈接器標(biāo)志。
3.8 新版功能.