3. 配置 Python¶
3.1. 構建要求¶
構建 CPython 所需的特性和最低版本
一個 C11 編譯器。可選的 C11 特性不是必需的。
在 Windows 上,需要 Microsoft Visual Studio 2017 或更高版本。
支援 IEEE 754 浮點數和 浮點非數字 (NaN)。
支援執行緒。
構建可選模組
用於
lzma
模組的liblzma
。用於
curses
模組的libncurses
或libncursesw
。用於
curses.panel
模組的libpanel
或libpanelw
。用於
readline
模組的 libreadline 或 libedit。對於
ssl
和hashlib
擴充套件模組,OpenSSL 1.1.1 是最低版本,OpenSSL 3.0.18 是推薦的最低版本。用於
compression.zstd
模組,zstd 1.4.5 是最低版本。
有關構建所有模組所需的依賴項的完整列表以及如何安裝它們,請參閱 devguide。
重新生成
configure
指令碼需要 Autoconf 2.72 和 aclocal 1.16.5。
3.1 版中已更改: 現在需要 Tcl/Tk 8.3.1 版本。
3.5 版中已更改: 在 Windows 上,現在需要 Visual Studio 2015 或更高版本。現在需要 Tcl/Tk 8.4 版本。
3.6 版中已更改: 現在需要選定的 C99 特性,例如 <stdint.h>
和 static inline
函式。
3.7 版中已更改: 現在需要執行緒支援和 OpenSSL 1.0.2。
3.10 版中已更改: 現在需要 OpenSSL 1.1.1。需要 SQLite 3.7.15。
3.11 版中已更改: 現在需要 C11 編譯器、IEEE 754 和 NaN 支援。在 Windows 上,需要 Visual Studio 2017 或更高版本。對於 tkinter
模組,現在需要 Tcl/Tk 8.5.12 版本。
3.13 版中已更改: 現在需要 Autoconf 2.71、aclocal 1.16.5 和 SQLite 3.15.2。
3.14 版中已更改: 現在需要 Autoconf 2.72。
3.2. 生成的檔案¶
為了減少構建依賴項,Python 原始碼包含多個生成的檔案。重新生成所有生成檔案的命令
make regen-all
make regen-stdlib-module-names
make regen-limited-abi
make regen-configure
Makefile.pre.in
檔案記錄了生成的檔案、它們的輸入以及用於重新生成它們的工具。搜尋 regen-*
make 目標。
3.2.1. 配置指令碼¶
make regen-configure
命令使用 Tools/build/regen-configure.sh
shell 指令碼重新生成 aclocal.m4
檔案和 configure
指令碼,該指令碼使用 Ubuntu 容器獲取相同的工具版本並生成可重現的輸出。
容器是可選的,以下命令可以在本地執行
autoreconf -ivf -Werror
生成的檔案可能會根據具體的 autoconf-archive
、aclocal
和 pkg-config
版本而變化。
3.3. 配置選項¶
使用以下命令列出所有 configure
指令碼選項
./configure --help
另請參閱 Python 原始碼分發中的 Misc/SpecialBuilds.txt
。
3.3.1. 通用選項¶
- --enable-loadable-sqlite-extensions¶
支援
sqlite3
模組的_sqlite
擴充套件模組中的可載入擴充套件(預設為否)。請參閱
sqlite3
模組的sqlite3.Connection.enable_load_extension()
方法。在 3.6 版本加入。
- --enable-big-digits=[15|30]¶
定義 Python
int
數字的位大小:15 或 30 位。預設情況下,數字大小為 30。
將
PYLONG_BITS_IN_DIGIT
定義為15
或30
。
- --with-suffix=SUFFIX¶
將 Python 可執行檔案字尾設定為 *SUFFIX*。
在 Windows 和 macOS 上(
python.exe
可執行檔案),預設字尾為.exe
;在 Emscripten 節點上為.js
;在 Emscripten 瀏覽器上為.html
;在 WASI 上為.wasm
;在其他平臺上為空字串(python
可執行檔案)。3.11 版中已更改: WASM 平臺上的預設字尾是
.js
、.html
或.wasm
之一。
- --with-tzpath=<list of absolute paths separated by pathsep>¶
選擇
zoneinfo.TZPATH
的預設時區搜尋路徑。請參閱zoneinfo
模組的 編譯時配置。預設值:
/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo
。請參閱
os.pathsep
路徑分隔符。在 3.9 版本中新增。
- --without-decimal-contextvar¶
使用執行緒區域性上下文而不是協程區域性上下文(預設)構建
_decimal
擴充套件模組,請參閱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 的區域設定(預設啟用)。
不定義
PY_COERCE_C_LOCALE
宏。請參閱
PYTHONCOERCECLOCALE
和 PEP 538。
- --with-platlibdir=DIRNAME¶
Python 庫目錄名(預設為
lib
)。Fedora 和 SuSE 在 64 位平臺上使用
lib64
。請參閱
sys.platlibdir
。在 3.9 版本中新增。
- --with-wheel-pkg-dir=PATH¶
ensurepip
模組使用的 wheel 包的目錄(預設無)。一些 Linux 發行版打包策略建議不要捆綁依賴項。例如,Fedora 將 wheel 包安裝在
/usr/share/python-wheels/
目錄中,並且不安裝ensurepip._bundled
包。在 3.10 版本加入。
- --with-pkg-config=[check|yes|no]¶
configure 是否應該使用 pkg-config 來檢測構建依賴項。
check
(預設):pkg-config 是可選的yes
:pkg-config 是強制性的no
:即使存在 pkg-config,configure 也不使用它
在 3.11 版本中新增。
- --enable-pystats¶
開啟內部 Python 效能統計資訊收集。
預設情況下,統計資訊收集是關閉的。使用
python3 -X pystats
命令或設定PYTHONSTATS=1
環境變數以在 Python 啟動時開啟統計資訊收集。在 Python 退出時,如果統計資訊收集已開啟且未清除,則轉儲統計資訊。
影響
新增
-X pystats
命令列選項。新增
PYTHONSTATS
環境變數。定義
Py_STATS
宏。向
sys
模組新增函式sys._stats_on()
:開啟統計資訊收集。sys._stats_off()
:關閉統計資訊收集。sys._stats_clear()
:清除統計資訊。sys._stats_dump()
:將統計資訊轉儲到檔案,並清除統計資訊。
統計資訊將被轉儲到
/tmp/py_stats/
(Unix) 或C:\temp\py_stats\
(Windows) 中的任意(可能唯一)檔案。如果該目錄不存在,結果將列印到 stderr。使用
Tools/scripts/summarize_stats.py
讀取統計資訊。統計資料
操作碼
專門化:成功、失敗、命中、延遲、未命中、去最佳化、失敗;
執行計數;
對數。
呼叫
內聯 Python 呼叫;
PyEval 呼叫;
壓入幀;
建立幀物件;
Eval 呼叫:向量、生成器、遺留、函式 VECTORCALL、構建類、槽、函式“ex”、API、方法。
物件
增引用和減引用;
直譯器增引用和減引用;
分配:所有、512 位元組、4 KiB、大;
釋放;
到/從空閒列表;
字典實體化/非實體化;
型別快取;
最佳化嘗試;
建立/執行最佳化跟蹤;
執行的 uops。
垃圾回收器
垃圾回收;
訪問的物件;
收集的物件。
在 3.11 版本中新增。
- --disable-gil¶
啟用在沒有 全域性直譯器鎖 (GIL) 的情況下執行 Python 的支援:自由執行緒構建。
定義
Py_GIL_DISABLED
宏並向sys.abiflags
新增"t"
。有關更多詳細資訊,請參閱 自由執行緒 CPython。
在 3.13 版本加入。
- --enable-experimental-jit=[no|yes|yes-off|interpreter]¶
指示如何整合 實驗性即時編譯器。
no
:不構建 JIT。yes
:啟用 JIT。要在執行時停用它,請設定環境變數PYTHON_JIT=0
。yes-off
:構建 JIT,但預設停用。要在執行時啟用它,請設定環境變數PYTHON_JIT=1
。interpreter
:啟用“JIT 直譯器”(僅對除錯 JIT 本身的人有用)。要在執行時停用它,請設定環境變數PYTHON_JIT=0
。
如果未提供該選項,則
--enable-experimental-jit=no
是預設行為,而--enable-experimental-jit
是--enable-experimental-jit=yes
的簡寫。有關更多資訊,包括如何安裝必要的構建時依賴項,請參閱Tools/jit/README.md
。備註
當啟用 JIT 構建 CPython 時,請確保您的系統已安裝 Python 3.11 或更高版本。
在 3.13 版本加入。
- PKG_CONFIG¶
pkg-config
工具的路徑。
- PKG_CONFIG_LIBDIR¶
- PKG_CONFIG_PATH¶
pkg-config
選項。
3.3.2. C 編譯器選項¶
- CC¶
C 編譯器命令。
- CFLAGS¶
C 編譯器標誌。
- CPP¶
C 預處理器命令。
- CPPFLAGS¶
C 預處理器標誌,例如
-Iinclude_dir
。
3.3.3. 連結器選項¶
- LDFLAGS¶
連結器標誌,例如
-Llibrary_directory
。
- LIBS¶
傳遞給連結器的庫,例如
-llibrary
。
- MACHDEP¶
機器相關庫檔案的名稱。
3.3.4. 第三方依賴項選項¶
在 3.11 版本中新增。
- BZIP2_CFLAGS¶
- CURSES_CFLAGS¶
- GDBM_CFLAGS¶
- GDBM_LIBS¶
用於
gdbm
的 C 編譯器和連結器標誌。
- LIBB2_CFLAGS¶
- LIBEDIT_CFLAGS¶
- LIBFFI_CFLAGS¶
- LIBMPDEC_CFLAGS¶
- LIBMPDEC_LIBS¶
用於
libmpdec
的 C 編譯器和連結器標誌,由decimal
模組使用,覆蓋pkg-config
。備註
除非指定了
--with-system-libmpdec
,否則這些環境變數無效。
- LIBLZMA_CFLAGS¶
- LIBREADLINE_CFLAGS¶
- LIBSQLITE3_CFLAGS¶
- LIBUUID_CFLAGS¶
- LIBZSTD_CFLAGS¶
- LIBZSTD_LIBS¶
用於
libzstd
的 C 編譯器和連結器標誌,由compression.zstd
模組使用,覆蓋pkg-config
。在 3.14 版本加入。
- PANEL_CFLAGS¶
- PANEL_LIBS¶
PANEL 的 C 編譯器和連結器標誌,覆蓋
pkg-config
。用於
libpanel
或libpanelw
的 C 編譯器和連結器標誌,由curses.panel
模組使用,覆蓋pkg-config
。
- TCLTK_CFLAGS¶
- TCLTK_LIBS¶
TCLTK 的 C 編譯器和連結器標誌,覆蓋
pkg-config
。
- ZLIB_CFLAGS¶
3.3.5. WebAssembly 選項¶
- --enable-wasm-dynamic-linking¶
為 WASM 開啟動態連結支援。
動態連結啟用
dlopen
。由於有限的死程式碼消除和附加功能,可執行檔案的大小增加。在 3.11 版本中新增。
- --enable-wasm-pthreads¶
為 WASM 開啟 pthreads 支援。
在 3.11 版本中新增。
3.3.6. 安裝選項¶
- --prefix=PREFIX¶
將與體系結構無關的檔案安裝在 PREFIX 中。在 Unix 上,它預設為
/usr/local
。此值可以在執行時使用
sys.prefix
檢索。例如,可以使用
--prefix="$HOME/.local/"
將 Python 安裝到其主目錄中。
- --exec-prefix=EPREFIX¶
將與體系結構相關的檔案安裝在 EPREFIX 中,預設為
--prefix
。此值可以在執行時使用
sys.exec_prefix
檢索。
3.3.7. 效能選項¶
建議使用 --enable-optimizations --with-lto
(PGO + LTO)配置 Python 以獲得最佳效能。實驗性的 --enable-bolt
標誌也可用於提高效能。
- --enable-optimizations¶
使用
PROFILE_TASK
啟用配置檔案引導最佳化 (PGO)(預設停用)。C 編譯器 Clang 需要
llvm-profdata
程式進行 PGO。在 macOS 上,GCC 也需要它:GCC 在 macOS 上只是 Clang 的別名。如果使用
--enable-shared
且使用 GCC,也停用 libpython 中的語義插入:將-fno-semantic-interposition
新增到編譯器和連結器標誌中。備註
在構建過程中,您可能會遇到關於某些原始檔沒有可用配置檔案資料的編譯器警告。這些警告是無害的,因為在配置檔案資料獲取期間只執行了程式碼的一個子集。要在 Clang 上停用這些警告,請手動新增
-Wno-profile-instr-unprofiled
到CFLAGS
來抑制它們。在 3.6 版本加入。
3.10 版中已更改: 在 GCC 上使用
-fno-semantic-interposition
。
- PROFILE_TASK¶
Makefile 中使用的環境變數:用於 PGO 生成任務的 Python 命令列引數。
預設值:
-m test --pgo --timeout=$(TESTTIMEOUT)
。在 3.8 版本加入。
3.13 版中已更改: 任務失敗不再靜默忽略。
- --with-lto=[full|thin|no|yes]¶
在任何構建中啟用連結時間最佳化 (LTO)(預設停用)。
C 編譯器 Clang 需要
llvm-ar
進行 LTO(macOS 上為ar
),以及支援 LTO 的連結器(ld.gold
或lld
)。在 3.6 版本加入。
3.11 新版功能: 要使用 ThinLTO 功能,請在 Clang 上使用
--with-lto=thin
。3.12 版中已更改: 如果編譯器接受該標誌,則在 Clang 上使用 ThinLTO 作為預設最佳化策略。
- --enable-bolt¶
啟用使用 BOLT 後連結二進位制最佳化器(預設停用)。
BOLT 是 LLVM 專案的一部分,但並非總是包含在它們的二進位制發行版中。此標誌要求
llvm-bolt
和merge-fdata
可用。BOLT 仍然是一個相當新的專案,因此此標誌目前應被視為實驗性。由於此工具在機器程式碼上執行,其成功取決於構建環境 + 其他最佳化配置引數 + CPU 架構的組合,並非所有組合都受支援。LLVM 16 之前的 BOLT 版本已知在某些情況下會導致 BOLT 崩潰。強烈建議使用 LLVM 16 或更新版本進行 BOLT 最佳化。
可以定義
BOLT_INSTRUMENT_FLAGS
和BOLT_APPLY_FLAGS
configure 變數,以分別覆蓋 llvm-bolt 用於檢測二進位制檔案和將 BOLT 資料應用於二進位制檔案的預設引數集。3.12 新版功能.
- BOLT_APPLY_FLAGS¶
建立 BOLT 最佳化二進位制檔案時傳遞給
llvm-bolt
的引數。3.12 新版功能.
- BOLT_INSTRUMENT_FLAGS¶
檢測二進位制檔案時傳遞給
llvm-bolt
的引數。3.12 新版功能.
- --with-computed-gotos¶
在評估迴圈中啟用計算 goto(在支援的編譯器上預設啟用)。
- --with-tail-call-interp¶
啟用在 CPython 中使用尾呼叫(tail calls)的直譯器。如果啟用,強烈建議啟用 PGO(
--enable-optimizations
)。此選項特別需要支援適當尾呼叫的 C 編譯器和 preserve_none 呼叫約定。例如,Clang 19 及更高版本支援此功能。在 3.14 版本加入。
- --without-mimalloc¶
停用快速 mimalloc 分配器(預設啟用)。
另請參閱
PYTHONMALLOC
環境變數。
- --without-pymalloc¶
停用專用 Python 記憶體分配器 pymalloc(預設啟用)。
另請參閱
PYTHONMALLOC
環境變數。
- --without-doc-strings¶
停用靜態文件字串以減少記憶體佔用(預設啟用)。Python 中定義的文件字串不受影響。
不定義
WITH_DOC_STRINGS
宏。請參閱
PyDoc_STRVAR()
宏。
- --enable-profiling¶
使用
gprof
啟用 C 級程式碼分析(預設停用)。
- --with-strict-overflow¶
將
-fstrict-overflow
新增到 C 編譯器標誌(預設我們新增-fno-strict-overflow
)。
- --without-remote-debug¶
停用 PEP 768 中描述的遠端除錯支援(預設啟用)。當提供此標誌時,允許直譯器在單獨程序中排程 Python 檔案執行的程式碼(如 PEP 768 中所述)不會被編譯。這包括排程要執行的程式碼的功能和接收要執行的程式碼的功能。
-
Py_REMOTE_DEBUG¶
除非 Python 配置了
--without-remote-debug
,否則此宏預設定義。請注意,即使定義了宏,遠端除錯也可能不可用(例如,在不相容的平臺上)。
在 3.14 版本加入。
-
Py_REMOTE_DEBUG¶
3.3.8. Python 除錯構建¶
除錯構建是使用 --with-pydebug
配置選項構建的 Python。
除錯構建的影響
預設顯示所有警告:
warnings
模組中預設警告過濾器列表為空。向
sys.abiflags
新增d
。新增
sys.gettotalrefcount()
函式。新增
-X showrefcount
命令列選項。新增
-d
命令列選項和PYTHONDEBUG
環境變數以除錯解析器。新增對
__lltrace__
變數的支援:如果定義了該變數,則在位元組碼評估迴圈中啟用低階跟蹤。在記憶體分配器上安裝 除錯鉤子 以檢測緩衝區溢位和其他記憶體錯誤。
定義
Py_DEBUG
和Py_REF_DEBUG
宏。新增執行時檢查:由
#ifdef Py_DEBUG
和#endif
包圍的程式碼。啟用assert(...)
和_PyObject_ASSERT(...)
斷言:不設定NDEBUG
宏(另請參閱--with-assertions
配置選項)。主要執行時檢查對函式引數新增健全性檢查。
Unicode 和 int 物件在建立時其記憶體用模式填充,以檢測未初始化物件的使用。
確保不會在引發異常時呼叫可以清除或替換當前異常的函式。
檢查解除分配器函式不會改變當前異常。
垃圾回收器(
gc.collect()
函式)對物件的一致性進行了一些基本檢查。Py_SAFE_DOWNCAST()
宏在從寬型別向下轉換為窄型別時檢查整數下溢和溢位。
另請參閱 Python 開發模式 和 --with-trace-refs
配置選項。
3.8 版中已更改: 釋出版本和除錯版本現在 ABI 相容:定義 Py_DEBUG
宏不再意味著 Py_TRACE_REFS
宏(請參閱 --with-trace-refs
選項)。
3.3.9. 除錯選項¶
- --with-pydebug¶
在除錯模式下構建 Python:定義
Py_DEBUG
宏(預設停用)。
- --with-trace-refs¶
啟用跟蹤引用以用於除錯目的(預設停用)。
影響
定義
Py_TRACE_REFS
宏。新增
sys.getobjects()
函式。新增
PYTHONDUMPREFS
環境變數。
PYTHONDUMPREFS
環境變數可用於在 Python 退出時轉儲仍然存活的物件和引用計數。靜態分配的物件 不會被跟蹤。
在 3.8 版本加入。
3.13 版中已更改: 此構建現在與釋出構建和 除錯構建 ABI 相容。
- --with-assertions¶
啟用 C 斷言構建(預設停用):
assert(...);
和_PyObject_ASSERT(...);
。如果設定,則在
OPT
編譯器變數中不定義NDEBUG
宏。另請參閱
--with-pydebug
選項(除錯構建),它也啟用斷言。在 3.6 版本加入。
- --with-valgrind¶
啟用 Valgrind 支援(預設停用)。
- --with-dtrace¶
啟用 DTrace 支援(預設停用)。
請參閱 使用 DTrace 和 SystemTap 檢測 CPython。
在 3.6 版本加入。
- --with-address-sanitizer¶
啟用 AddressSanitizer 記憶體錯誤檢測器
asan
(預設停用)。為了提高 ASan 檢測能力,您可能還需要將其與--without-pymalloc
結合使用,以停用專門的小物件分配器,其分配不被 ASan 跟蹤。在 3.6 版本加入。
- --with-memory-sanitizer¶
啟用 MemorySanitizer 分配錯誤檢測器
msan
(預設停用)。在 3.6 版本加入。
- --with-undefined-behavior-sanitizer¶
啟用 UndefinedBehaviorSanitizer 未定義行為檢測器
ubsan
(預設停用)。在 3.6 版本加入。
- --with-thread-sanitizer¶
啟用 ThreadSanitizer 資料競爭檢測器
tsan
(預設停用)。在 3.13 版本加入。
3.3.10. 連結器選項¶
啟用構建共享 Python 庫:
libpython
(預設停用)。
- --without-static-libpython¶
不構建
libpythonMAJOR.MINOR.a
並且不安裝python.o
(預設構建和啟用)。在 3.10 版本加入。
3.3.11. 庫選項¶
- --with-libs='lib1 ...'¶
連結到附加庫(預設停用)。
- --with-system-expat¶
使用已安裝的
expat
庫構建pyexpat
模組(預設停用)。
- --with-system-libmpdec¶
使用已安裝的
mpdecimal
庫構建_decimal
擴充套件模組,請參閱decimal
模組(預設啟用)。在 3.3 版本加入。
3.13 版中已更改: 預設使用已安裝的
mpdecimal
庫。自 3.13 版起已廢棄,並將在 3.16 版中移除:
mpdecimal
庫的副本將不再隨 Python 3.16 一起分發。參見
- --with-readline=readline|editline¶
為
readline
模組指定後端庫。readline:使用 readline 作為後端。
editline:使用 editline 作為後端。
在 3.10 版本加入。
- --with-libm=STRING¶
將
libm
數學庫覆蓋為 *STRING*(預設取決於系統)。
- --with-libc=STRING¶
將
libc
C 庫覆蓋為 *STRING*(預設取決於系統)。
- --with-openssl=DIR¶
OpenSSL 目錄的根目錄。
在 3.7 版本加入。
- --with-openssl-rpath=[no|auto|DIR]¶
為 OpenSSL 庫設定執行時庫目錄 (rpath)
no
(預設):不設定 rpath;auto
:從--with-openssl
和pkg-config
自動檢測 rpath;DIR:設定顯式 rpath。
在 3.10 版本加入。
3.3.12. 安全選項¶
- --with-hash-algorithm=[fnv|siphash13|siphash24]¶
選擇用於
Python/pyhash.c
中的雜湊演算法siphash13
(預設);siphash24
;fnv
.
在 3.4 版本加入。
3.11 新版功能: 添加了
siphash13
,它是新的預設值。
- --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2¶
內建雜湊模組
md5
;sha1
;sha256
;sha512
;sha3
(帶 shake);blake2
.
在 3.9 版本中新增。
- --with-ssl-default-suites=[python|openssl|STRING]¶
覆蓋 OpenSSL 預設的密碼套件字串
python
(預設): 使用 Python 首選的選擇;openssl
: 保持 OpenSSL 的預設設定不變;STRING: 使用自定義字串
參見
ssl
模組。在 3.7 版本加入。
3.10 版本更改: 設定
python
和 STRING 也將 TLS 1.2 設定為最低協議版本。
- --disable-safety¶
停用 OpenSSF 為安全原因推薦的、沒有效能開銷的編譯器選項。如果未啟用此選項,CPython 將基於沒有速度下降的安全編譯器選項進行構建。啟用此選項時,CPython 將不會使用下面列出的編譯器選項進行構建。
以下編譯器選項在使用
--disable-safety
時被停用-fstack-protector-strong: 啟用基於堆疊的緩衝區溢位的執行時檢查。
-Wtrampolines: 啟用對需要可執行堆疊的蹦床的警告。
在 3.14 版本加入。
- --enable-slower-safety¶
啟用 OpenSSF 為安全原因推薦的、需要額外開銷的編譯器選項。如果未啟用此選項,CPython 將不會基於對效能有影響的安全編譯器選項進行構建。啟用此選項時,CPython 將使用下面列出的編譯器選項進行構建。
以下編譯器選項在使用
--enable-slower-safety
時被啟用-D_FORTIFY_SOURCE=3: 使用編譯時和執行時檢查來加固不安全的 libc 用法和緩衝區溢位。
在 3.14 版本加入。
3.3.13. macOS 選項¶
參見 Mac/README.rst。
- --enable-universalsdk¶
- --enable-universalsdk=SDKDIR¶
建立通用二進位制構建。SDKDIR 指定用於執行構建的 macOS SDK(預設不指定)。
- --enable-framework¶
- --enable-framework=INSTALLDIR¶
建立 Python.framework 而不是傳統的 Unix 安裝。可選的 INSTALLDIR 指定安裝路徑(預設不指定)。
- --with-universal-archs=ARCH¶
指定應建立的通用二進位制檔案的型別。此選項僅在設定
--enable-universalsdk
時有效。選項
universal2
(x86-64 和 arm64);32-bit
(PPC 和 i386);64-bit
(PPC64 和 x86-64);3-way
(i386, PPC 和 x86-64);intel
(i386 和 x86-64);intel-32
(i386);intel-64
(x86-64);all
(PPC, i386, PPC64 和 x86-64)。
請注意,此配置項的值與 macOS 上通用二進位制輪子使用的識別符號 不 相同。有關 macOS 上使用的打包平臺相容性標籤 的詳細資訊,請參見 Python 打包使用者指南。
- --with-framework-name=FRAMEWORK¶
指定 macOS 上 Python framework 的名稱,僅在設定
--enable-framework
時有效(預設值:Python
)。
- --with-app-store-compliance¶
- --with-app-store-compliance=PATCH-FILE¶
Python 標準庫包含的字串在提交到 macOS 和 iOS App Store 進行分發時已知會觸發自動化檢查工具錯誤。如果啟用此選項,將應用已知能糾正 App Store 合規性的補丁列表。也可以指定自定義補丁檔案。此選項預設停用。
在 3.13 版本加入。
3.3.14. iOS 選項¶
參見 iOS/README.rst。
- --enable-framework=INSTALLDIR¶
建立 Python.framework。與 macOS 不同,指定安裝路徑的 INSTALLDIR 引數是強制性的。
- --with-framework-name=FRAMEWORK¶
指定 framework 的名稱(預設值:
Python
)。
3.3.15. 交叉編譯選項¶
交叉編譯,也稱為交叉構建,可用於為其他 CPU 架構或平臺構建 Python。交叉編譯需要用於構建平臺的 Python 直譯器。構建 Python 的版本必須與交叉編譯的主機 Python 的版本匹配。
- --build=BUILD¶
為 BUILD 上的構建進行配置,通常由 config.guess 推斷。
- --host=HOST¶
交叉編譯以構建在 HOST(目標平臺)上執行的程式
- --with-build-python=path/to/python¶
用於交叉編譯的構建
python
二進位制檔案的路徑在 3.11 版本中新增。
- CONFIG_SITE=file¶
指向包含配置覆蓋的檔名的環境變數。
示例 config.site 檔案
# config.site-aarch64 ac_cv_buggy_getaddrinfo=no ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=no
- HOSTRUNNER¶
用於交叉編譯的主機平臺執行 CPython 的程式。
在 3.11 版本中新增。
交叉編譯示例
CONFIG_SITE=config.site-aarch64 ../configure \
--build=x86_64-pc-linux-gnu \
--host=aarch64-unknown-linux-gnu \
--with-build-python=../x86_64/python
3.4. Python 構建系統¶
3.4.1. 構建系統主要檔案¶
configure.ac
=>configure
;Makefile.pre.in
=>Makefile
(由configure
建立);pyconfig.h
(由configure
建立);Modules/Setup
: 透過 Makefile 使用Module/makesetup
shell 指令碼構建的 C 擴充套件;
3.4.2. 主要構建步驟¶
C 檔案 (
.c
) 被構建為物件檔案 (.o
)。從物件檔案建立靜態
libpython
庫 (.a
)。python.o
和靜態libpython
庫被連結到最終的python
程式中。C 擴充套件由 Makefile 構建(參見
Modules/Setup
)。
3.4.3. 主要 Makefile 目標¶
3.4.3.1. make¶
在編輯一些程式碼或從上游重新整理檢出後重新構建時,大多數情況下,您只需要執行 make
,它(根據 Make 的語義)會構建預設目標,即 Makefile 中定義的第一個目標。按照傳統(包括在 CPython 專案中),這通常是 all
目標。configure
指令碼擴充套件了一個 autoconf
變數 @DEF_MAKE_ALL_RULE@
,以精確描述 make all
將構建哪些目標。有三種選擇:
profile-opt
(使用--enable-optimizations
配置)build_wasm
(如果主機平臺匹配wasm32-wasi*
或wasm32-emscripten
則選擇)build_all
(未明確使用其他任何選項進行配置)
根據最近的原始檔更改,Make 將重新構建任何被視為過時的目標(物件檔案和可執行檔案),必要時還會再次執行 configure
。然而,源/目標依賴項眾多且是手動維護的,因此 Make 有時無法獲得正確檢測所有需要重新構建的目標所需的所有資訊。根據未重新構建的目標,您可能會遇到一些問題。如果您遇到無法解釋的構建或測試問題,make clean && make
應該可以解決大多數依賴項問題,但會增加構建時間。
3.4.3.2. make platform¶
構建 python
程式,但不構建標準庫擴充套件模組。這將生成一個名為 platform
的檔案,其中包含一行描述構建平臺詳細資訊的內容,例如 macosx-14.3-arm64-3.12
或 linux-x86_64-3.13
。
3.4.3.3. make profile-opt¶
使用配置檔案引導最佳化 (PGO) 構建 Python。您可以使用配置選項 --enable-optimizations
使其成為 make
命令(make all
或僅僅 make
)的預設目標。
3.4.3.4. make clean¶
移除已構建檔案。
3.4.3.5. make distclean¶
除了 make clean
完成的工作外,還移除由 configure 指令碼建立的檔案。configure
必須在再次構建之前執行。[1]
3.4.3.6. make install¶
構建 all
目標並安裝 Python。
3.4.3.7. make test¶
構建 all
目標並使用 --fast-ci
選項執行 Python 測試套件,不包括 GUI 測試。變數:
TESTOPTS
: 額外的 regrtest 命令列選項。TESTPYTHONOPTS
: 額外的 Python 命令列選項。TESTTIMEOUT
: 超時時間(秒)(預設:10 分鐘)。
3.4.3.8. make ci¶
這類似於 make test
,但使用 -ugui
也執行 GUI 測試。
在 3.14 版本加入。
3.4.3.9. make buildbottest¶
這類似於 make test
,但使用 --slow-ci
選項和預設 20 分鐘的超時時間,而不是 --fast-ci
選項。
3.4.3.10. make regen-all¶
重新生成(幾乎)所有生成的檔案。其中包括(但不限於)位元組碼用例和解析器生成器檔案。make regen-stdlib-module-names
和 autoconf
必須為剩餘的生成檔案單獨執行。
3.4.4. C 擴充套件¶
一些 C 擴充套件被構建為內建模組,例如 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__'
其他 C 擴充套件被構建為動態庫,例如 _asyncio
模組。它們在定義了 Py_BUILD_CORE_MODULE
宏的情況下構建。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 目標以構建 C 擴充套件。在檔案開頭,C 擴充套件作為內建模組構建。在 *shared*
標記之後定義的擴充套件作為動態庫構建。
Include/exports.h
中的 PyAPI_FUNC()
、PyAPI_DATA()
和 PyMODINIT_FUNC
宏的定義取決於是否定義了 Py_BUILD_CORE_MODULE
宏。
如果定義了
Py_BUILD_CORE_MODULE
,則使用Py_EXPORTED_SYMBOL
。否則使用
Py_IMPORTED_SYMBOL
。
如果在作為共享庫構建的 C 擴充套件上錯誤地使用了 Py_BUILD_CORE_BUILTIN
宏,其 PyInit_xxx()
函式將不會匯出,導致匯入時出現 ImportError
。
3.5. 編譯器和連結器標誌¶
由 ./configure
指令碼和環境變數設定並由 Makefile
使用的選項。
3.5.1. 預處理器標誌¶
- CPPFLAGS¶
(Objective) C/C++ 預處理器標誌,例如,如果您在非標準目錄 include_dir 中有標頭檔案,則為
-Iinclude_dir
。
- BASECPPFLAGS¶
在 3.4 版本加入。
- PY_CPPFLAGS¶
為構建直譯器物件檔案而新增的額外預處理器標誌。
預設值:
$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)
。在 3.2 版本加入。
3.5.2. 編譯器標誌¶
- CC¶
C 編譯器命令。
示例:
gcc -pthread
。
- CXX¶
C++ 編譯器命令。
示例:
g++ -pthread
。
- CFLAGS¶
C 編譯器標誌。
- CFLAGS_NODIST¶
CFLAGS_NODIST
用於構建直譯器和標準庫 C 擴充套件。當編譯器標誌在 Python 安裝後 不應 成為CFLAGS
的一部分時使用(gh-65320)。特別是,
CFLAGS
不應包含:編譯器標誌
-I
(用於設定包含檔案的搜尋路徑)。-I
標誌從左到右處理,CFLAGS
中的任何標誌都將優先於使用者和包提供的-I
標誌。強化標誌,例如
-Werror
,因為發行版無法控制使用者安裝的包是否符合此類更高的標準。
在 3.5 版本加入。
- COMPILEALL_OPTS¶
在
make install
中構建 PYC 檔案時傳遞給compileall
命令列的選項。預設值:-j0
。3.12 新版功能.
- EXTRA_CFLAGS¶
額外的 C 編譯器標誌。
- CONFIGURE_CFLAGS_NODIST¶
傳遞給
./configure
指令碼的CFLAGS_NODIST
變數的值。在 3.5 版本加入。
- BASECFLAGS¶
基本編譯器標誌。
- OPT¶
最佳化標誌。
- CFLAGS_ALIASING¶
用於編譯
Python/dtoa.c
的嚴格或非嚴格別名標誌。在 3.7 版本加入。
- CCSHARED¶
用於構建共享庫的編譯器標誌。
例如,在 Linux 和 BSD 上使用
-fPIC
。
- CFLAGSFORSHARED¶
為構建直譯器物件檔案而新增的額外 C 標誌。
預設值:當使用
--enable-shared
時為$(CCSHARED)
,否則為空字串。
- PY_CFLAGS¶
預設值:
$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)
。
- PY_CFLAGS_NODIST¶
預設值:
$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal
。在 3.5 版本加入。
- PY_STDMODULE_CFLAGS¶
用於將標準庫擴充套件模組構建為內建模組的 C 標誌,例如
posix
模組。預設值:
$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)
。在 3.7 版本加入。
- PY_CORE_CFLAGS¶
預設值:
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE
。在 3.2 版本加入。
- PY_BUILTIN_MODULE_CFLAGS¶
用於將標準庫擴充套件模組構建為內建模組的編譯器標誌,例如
posix
模組。預設值:
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN
。在 3.8 版本加入。
- PURIFY¶
Purify 命令。Purify 是一個記憶體除錯程式。
預設值:空字串(未使用)。
3.5.3. 連結器標誌¶
- LINKCC¶
用於構建
python
和_testembed
等程式的連結器命令。預設值:
$(PURIFY) $(CC)
。
- CONFIGURE_LDFLAGS¶
傳遞給
./configure
指令碼的LDFLAGS
變數的值。避免賦值
CFLAGS
,LDFLAGS
等,這樣使用者可以在命令列上使用它們來追加這些值而不會覆蓋預設值。在 3.2 版本加入。
- LDFLAGS_NODIST¶
LDFLAGS_NODIST
的用法與CFLAGS_NODIST
相同。當連結器標誌在 Python 安裝後 不應 成為LDFLAGS
的一部分時使用(gh-65320)。特別是,
LDFLAGS
不應包含:編譯器標誌
-L
(用於設定庫的搜尋路徑)。-L
標誌從左到右處理,LDFLAGS
中的任何標誌都將優先於使用者和包提供的-L
標誌。
- CONFIGURE_LDFLAGS_NODIST¶
傳遞給
./configure
指令碼的LDFLAGS_NODIST
變數的值。在 3.8 版本加入。
- LDFLAGS¶
連結器標誌,例如,如果您在非標準目錄 lib_dir 中有庫,則為
-Llib_dir
。
- LIBS¶
將庫傳遞給連結器以連結 Python 可執行檔案時的連結器標誌。
示例:
-lrt
。
- LDSHARED¶
用於構建共享庫的命令。
預設值:
@LDSHARED@ $(PY_LDFLAGS)
。
- BLDSHARED¶
用於構建
libpython
共享庫的命令。預設值:
@BLDSHARED@ $(PY_CORE_LDFLAGS)
。
- PY_LDFLAGS¶
預設值:
$(CONFIGURE_LDFLAGS) $(LDFLAGS)
。
- PY_LDFLAGS_NODIST¶
預設值:
$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)
。在 3.8 版本加入。
- PY_CORE_LDFLAGS¶
用於構建直譯器物件檔案的連結器標誌。
在 3.8 版本加入。
腳註