3. 配置 Python¶
3.1. 構建要求¶
構建 CPython 所需的特性和最低版本
C11 編譯器。不需要可選的 C11 特性。
在 Windows 上,需要 Microsoft Visual Studio 2017 或更高版本。
支援 IEEE 754 浮點數和 浮點數非數字 (NaN)。
支援執行緒。
OpenSSL 1.1.1 是
ssl
和hashlib
擴充套件模組的最低版本,建議最低版本為 OpenSSL 3.0.9。sqlite3
擴充套件模組需要 SQLite 3.15.2。tkinter
模組需要 Tcl/Tk 8.5.12。需要 Autoconf 2.71 和 aclocal 1.16.5 來重新生成
configure
指令碼。
在 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.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. configure 指令碼¶
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.Connection.enable_load_extension()
方法,來自sqlite3
模組。在 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 上為
.exe
(python.exe
可執行檔案),在 Emscripten 節點上為.js
,在 Emscripten 瀏覽器上為.html
,在 WASI 上為.wasm
,在其他平臺上為空字串(python
可執行檔案)。在 3.11 版本中更改:WASM 平臺上的預設字尾是
.js
、.html
或.wasm
之一。
- --with-tzpath=<以路徑分隔符分隔的絕對路徑列表>¶
為
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 版本中新增。
- --without-c-locale-coercion¶
停用 C 語言環境強制轉換為基於 UTF-8 的語言環境(預設啟用)。
不要定義
PY_COERCE_C_LOCALE
宏。請參閱
PYTHONCOERCECLOCALE
和 PEP 538。
- --without-freelists¶
停用除空元組單例之外的所有空閒列表。
在 3.11 版本中新增。
- --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]¶
配置是否應使用 pkg-config 來檢測構建依賴項。
check
(預設值):pkg-config 是可選的yes
:pkg-config 是強制性的no
:即使存在 pkg-config,配置也不使用它
在 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、方法。
物件
incref 和 decref;
直譯器 incref 和 decref;
分配:全部、512 位元組、4 kiB、大;
釋放;
到/從空閒列表;
字典具體化/非具體化;
型別快取;
最佳化嘗試;
建立/執行的最佳化跟蹤;
執行的 uops。
垃圾回收器
垃圾回收;
訪問的物件;
收集的物件。
在 3.11 版本中新增。
- --disable-gil¶
啟用在沒有全域性直譯器鎖 (GIL) 的情況下執行 Python 的實驗性支援:自由執行緒構建。
定義
Py_GIL_DISABLED
宏並將"t"
新增到sys.abiflags
。有關更多詳細資訊,請參閱 自由執行緒 CPython。
在 3.13 版本中新增。
- --enable-experimental-jit=[no|yes|yes-off|interpreter]¶
指示如何整合 JIT 編譯器。
no
- 構建不帶 JIT 的直譯器。yes
- 構建帶有 JIT 的直譯器。yes-off
- 構建帶有 JIT 的直譯器,但預設情況下停用它。interpreter
- 構建不帶 JIT 的直譯器,但啟用第 2 層直譯器。
按照慣例,
--enable-experimental-jit
是--enable-experimental-jit=yes
的簡寫形式。在 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¶
- 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 選項¶
- --with-emscripten-target=[browser|node]¶
為
wasm32-emscripten
設定構建風格。browser
(預設):預載入最小的 stdlib,預設使用 MEMFS。node
:NODERAWFS 和 pthread 支援。
在 3.11 版本中新增。
- --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(在受支援的編譯器上預設啟用)。
- --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
)。
3.3.8. Python 除錯構建¶
除錯構建是使用 --with-pydebug
配置選項構建的 Python。
除錯構建的效果
預設顯示所有警告:
warnings
模組中的預設警告過濾器列表為空。將
d
新增到sys.abiflags
。新增
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(...);
。如果設定,則
NDEBUG
宏不會在OPT
編譯器變數中定義。另請參閱
--with-pydebug
選項(除錯構建),它也會啟用斷言。在 3.6 版本中新增。
- --with-valgrind¶
啟用 Valgrind 支援(預設為停用)。
- --with-dtrace¶
啟用 DTrace 支援(預設為停用)。
請參閱使用 DTrace 和 SystemTap 檢測 CPython。
在 3.6 版本中新增。
- --with-address-sanitizer¶
啟用 AddressSanitizer 記憶體錯誤檢測器,
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.15 版本中刪除:
mpdecimal
庫的原始碼副本將不再與 Python 3.15 一起分發。另請參閱
- --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 版本中新增。
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
;32 位
;64 位
;三向
;intel
;intel-32
;intel-64
;全部
.
- --with-framework-name=FRAMEWORK¶
指定 macOS 上 python 框架的名稱,僅當設定了
--enable-framework
時才有效(預設為Python
)。
- --with-app-store-compliance¶
- --with-app-store-compliance=PATCH-FILE¶
當提交 macOS 和 iOS 應用商店進行分發時,Python 標準庫包含已知會觸發自動檢查工具錯誤的字串。如果啟用此選項,它將應用已知可以糾正應用商店合規性的補丁列表。也可以指定自定義補丁檔案。預設情況下停用此選項。
在 3.13 版本中新增。
3.3.14. iOS 選項¶
請參閱 iOS/README.rst。
- --enable-framework=INSTALLDIR¶
建立一個 Python.framework。與 macOS 不同,指定安裝路徑的 INSTALLDIR 引數是強制性的。
- --with-framework-name=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
(使用--with-emscripten-target
配置)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。您可以使用 configure --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 測試套件。 變數
TESTOPTS
: 額外的 regrtest 命令列選項。TESTPYTHONOPTS
: 額外的 Python 命令列選項。TESTTIMEOUT
: 超時時間(以秒為單位)(預設值:10 分鐘)。
3.4.3.8. make buildbottest¶
這與 make test
類似,但使用 --slow-ci
選項和預設 20 分鐘的超時時間,而不是 --fast-ci
選項。
3.4.3.9. 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*
標記之後定義的擴充套件被構建為動態庫。
PyAPI_FUNC()
、 PyAPI_DATA()
和 PyMODINIT_FUNC
Include/exports.h
的宏根據是否定義了 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
用於構建直譯器和 stdlib 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 標誌。
預設值:
$(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
。CPPFLAGS
和LDFLAGS
都需要包含 shell 的值,以便能夠使用環境變數中指定的目錄來構建擴充套件模組。
- 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 版本中新增。
腳註