3. پیکربندی پایتون

3.1. نیازمندی‌های ساخت

برای ساخت سی‌پایتون، به موارد زیر نیاز خواهید داشت:

تغییر یافته در نسخه‌ی 3.5: در ویندوز، اکنون Visual Studio 2015 یا نسخه‌های بعدی آن لازم است.

تغییر یافته در نسخه‌ی 3.6: ویژگی‌های منتخب C99، مانند <stdint.h> و توابع static inline، اکنون الزامی هستند.

تغییر یافته در نسخه‌ی 3.7: پشتیبانی از نخ اکنون الزامی است.

تغییر یافته در نسخه‌ی 3.11: کامپایلر C11، پشتیبانی از IEEE 754 و NaN اکنون الزامی است. در ویندوز، Visual Studio 2017 یا جدیدتر لازم است.

همچنین PEP 7 "Style Guide for C Code" و PEP 11 "CPython platform support" را ببینید.

3.1.1. نیازمندی‌های ماژول‌های اختیاری

برخی از ماژول‌های اختیاری کتابخانه استاندارد به کتابخانه‌های شخص ثالث نیاز دارند که برای توسعه نصب شده باشند (برای مثال، باید پرونده‌های سرآیند در دسترس باشند).

نیازمندی‌های مفقود در خروجی configure گزارش می‌شوند. ماژول‌هایی که به دلیل وابستگی‌های مفقود وجود ندارند، نزدیک به انتهای خروجی make فهرست می‌شوند و گاهی با استفاده از نامی داخلی، برای مثال _ctypes برای ماژول ctypes.

اگر مفسر سی‌پایتون را بدون ماژول‌های اختیاری توزیع می‌کنید، بهترین روش این است که کاربران را آگاه کنید، زیرا آن‌ها معمولاً انتظار دارند ماژول‌های کتابخانه استاندارد در دسترس باشند.

وابستگی‌های ساخت ماژول‌های اختیاری عبارت‌اند از:

وابستگی

حداقل نسخه

ماژول پایتون

libbz2

bz2

libffi

3.3.0 توصیه‌شده

ctypes

liblzma

lzma

libmpdec

2.5.0

decimal [1]

libreadline یا libedit [2]

readline

libuuid

_uuid [3]

ncurses [4]

curses

OpenSSL

3.0.18 توصیه‌شده
(حداقل 1.1.1)

ssl, hashlib [5]

SQLite

3.15.2

sqlite3

Tcl/Tk

8.5.12

tkinter, IDLE, turtle

zlib

1.2.2.1

zlib, gzip, ensurepip

zstd

1.4.5

compression.zstd

توجه داشته باشید که این جدول شامل تمام ماژول‌های اختیاری نیست؛ به‌طور خاص، ماژول‌های مخصوص پلتفرم مانند winreg در اینجا فهرست نشده‌اند.

همچنین ملاحظه نمائید

تغییر یافته در نسخه‌ی 3.1: نسخه‌ی 8.3.1 از Tcl/Tk اکنون برای tkinter لازم است.

تغییر یافته در نسخه‌ی 3.5: اکنون نسخه‌ی 8.4 از Tcl/Tk برای tkinter لازم است.

تغییر یافته در نسخه‌ی 3.7: OpenSSL 1.0.2 اکنون برای hashlib و ssl الزامی است.

تغییر یافته در نسخه‌ی 3.10: اکنون hashlib و ssl به OpenSSL 1.1.1 نیاز دارند. اکنون sqlite3 به SQLite 3.7.15 نیاز دارد.

تغییر یافته در نسخه‌ی 3.11: نسخه‌ی 8.5.12 از Tcl/Tk اکنون برای tkinter لازم است.

تغییر یافته در نسخه‌ی 3.13: اکنون SQLite 3.15.2 برای sqlite3 لازم است.

3.2. پرونده‌های تولیدشده

برای کاهش وابستگی‌های ساخت، کد منبع پایتون شامل چندین پرونده‌ی تولیدشده است. دستورهایی برای بازتولید همه‌ی پرونده‌های تولیدشده:

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 پرونده‌ی aclocal.m4 و اسکریپت configure را با استفاده از اسکریپت پوسته‌ی Tools/build/regen-configure.sh بازتولید می‌کند که از یک کانتینر اوبونتو برای به دست آوردن همان نسخه‌های ابزارها و داشتن خروجی تکرار‌پذیر استفاده می‌کند.

استفاده از کانتینر اختیاری است؛ دستور زیر را می‌توان به‌صورت محلی اجرا کرد:

autoreconf -ivf -Werror

پرونده‌های تولیدشده ممکن است بسته به نسخه‌های دقیق ابزارهای استفاده‌شده تغییر کنند. کانتینری که سی‌پایتون از آن استفاده می‌کند، دارای Autoconf نسخه‌ی 2.72، aclocal از Automake نسخه‌ی 1.16.5 و pkg-config نسخه‌ی 1.8.1 است.

تغییر یافته در نسخه‌ی 3.13: Autoconf 2.71 و aclocal 1.16.5 اکنون برای بازتولید configure استفاده می‌شوند.

تغییر یافته در نسخه‌ی 3.14: اکنون از Autoconf 2.72 برای بازتولید configure استفاده می‌شود.

3.3. گزینه‌های پیکربندی

برای فهرست کردن همه‌ی گزینه‌های اسکریپت configure از این استفاده کنید:

./configure --help

همچنین Misc/SpecialBuilds.txt را در توزیع کد منبع پایتون ببینید.

3.3.1. گزینه‌های عمومی

--enable-loadable-sqlite-extensions

پشتیبانی از افزونه‌های قابل بارگذاری در ماژول توسعه‌ای _sqlite (پیش‌فرض: خیر) از ماژول sqlite3.

به متد sqlite3.Connection.enable_load_extension() از ماژول sqlite3 مراجعه کنید.

اضافه شده در نسخه‌ی 3.6.

--disable-ipv6

غیرفعال کردن پشتیبانی از IPv6 (در صورت پشتیبانی، به‌صورت پیش‌فرض فعال است)؛ به ماژول socket مراجعه کنید.

--enable-big-digits=[15|30]

اندازه‌ی رقم‌های int پایتون را بر حسب بیت تعریف می‌کند: ۱۵ یا ۳۰ بیت.

به‌طور پیش‌فرض، اندازه رقم ۳۰ است.

مقدار PYLONG_BITS_IN_DIGIT را برابر 15 یا 30 تعریف کنید.

به sys.int_info.bits_per_digit مراجعه کنید.

--with-suffix=SUFFIX

پسوند پرونده اجرایی پایتون را به SUFFIX تنظیم می‌کند.

پسوند پیش‌فرض در ویندوز و macOS .exe است (پرونده اجرایی python.exe)، در Emscripten node .js، در Emscripten browser .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

مقدار معتبر، رشته‌ای است که نام‌های بک‌اند در آن با دونقطه (:) از هم جدا شده‌اند:

  • ndbm;

  • gdbm;

  • bdb.

--without-c-locale-coercion

غیرفعال کردن اجبار C locale به یک locale مبتنی بر UTF-8 (به‌طور پیش‌فرض فعال است).

ماکروی PY_COERCE_C_LOCALE را تعریف نکنید.

PYTHONCOERCECLOCALE و PEP 538 را ببینید.

--with-platlibdir=DIRNAME

نام پوشه کتابخانه پایتون (پیش‌فرض lib است).

Fedora و SuSE در پلتفرم‌های ۶۴ بیتی از lib64 استفاده می‌کنند.

به sys.platlibdir مراجعه کنید.

اضافه شده در نسخه‌ی 3.9.

--with-wheel-pkg-dir=PATH

پوشه‌ی بسته‌های wheel مورد استفاده‌ی ماژول ensurepip (به‌طور پیش‌فرض هیچ‌کدام).

برخی از سیاست‌های بسته‌بندی توزیع‌های لینوکس توصیه می‌کنند که وابستگی‌ها همراه بسته نشوند. برای مثال، فدورا بسته‌های 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: configure حتی وقتی pkg-config موجود باشد، از آن استفاده نمی‌کند

اضافه شده در نسخه‌ی 3.11.

--enable-pystats

فعال کردن گردآوری آمار کارایی داخلی پایتون.

به‌طور پیش‌فرض، گردآوری آمار خاموش است. برای روشن کردن گردآوری آمار در زمان راه‌اندازی پایتون، از دستور python3 -X pystats استفاده کنید یا متغیر محیطی PYTHONSTATS=1 را تنظیم کنید.

هنگام خروج پایتون، اگر گردآوری آمار فعال بوده و پاک‌سازی نشده باشد، آمار برون‌ریزی می‌شود.

اثرات:

  • افزودن گزینه خط فرمان -X pystats.

  • افزودن متغیر محیطی PYTHONSTATS.

  • ماکرو Py_STATS را تعریف کنید.

  • افزودن توابع به ماژول sys:

    • sys._stats_on(): گردآوری آمار را فعال می‌کند.

    • sys._stats_off(): گردآوری آمار را غیرفعال می‌کند.

    • sys._stats_clear(): آمار را پاک می‌کند.

    • sys._stats_dump(): آمار را به پرونده برون‌ریزی می‌کند و آن را پاک می‌کند.

آمار به یک پرونده‌ی دلخواه (احتمالاً یکتا) در /tmp/py_stats/ (یونیکس) یا C:\temp\py_stats\ (ویندوز) برون‌ریزی می‌شود. اگر آن پوشه وجود نداشته باشد، نتایج روی stderr چاپ خواهند شد.

برای خواندن آمار از Tools/scripts/summarize_stats.py استفاده کنید.

آمار:

  • آپ‌کد:

    • تخصصی‌سازی: موفقیت، شکست، برخورد، معوق، عدم‌برخورد (miss)، بهینه‌سازی‌زدایی (deopt)، شکست‌ها؛

    • تعداد اجرا؛

    • تعداد جفت‌ها.

  • فراخوانی:

    • فراخوانی‌های درون‌خطی (inlined) پایتون؛

    • فراخوانی‌های PyEval؛

    • فریم‌ها هل داده می‌شوند؛

    • شیء فریم ایجاد شد؛

    • فراخوانی‌های ارزیابی (Eval): برداری (vector)، تولیدگر، قدیمی، تابع VECTORCALL، ساخت کلاس، جایگاه، تابع "ex"، API، متد.

  • شیء:

    • incref و decref؛

    • افزایش و کاهش شمارش ارجاع مفسر (incref و decref)؛

    • تخصیص‌ها: همه، ۵۱۲ بایت، ۴ کیبی‌بایت، بزرگ؛

    • آزاد؛

    • به/از فهرست‌های آزاد؛

    • دیکشنری مادی‌شده/نامادی‌شده؛

    • نهانگاه نوع؛

    • تلاش‌های بهینه‌سازی؛

    • ایجاد/اجرای ردگیری‌های بهینه‌سازی؛

    • ریزعملیات‌های اجرا‌شده (uops).

  • زباله‌روب:

    • زباله‌روبی‌ها؛

    • اشیاء بازدید‌شده؛

    • اشیاء جمع‌آوری شدند.

اضافه شده در نسخه‌ی 3.11.

--disable-gil

پشتیبانی از اجرای پایتون بدون قفل مفسر سراسری (GIL) را فعال می‌کند: ساخت‌ نخ‌آزاد.

ماکروی Py_GIL_DISABLED را تعریف می‌کند و "t" را به sys.abiflags اضافه می‌کند.

برای جزئیات بیشتر به سی‌پایتون نخ‌آزاد مراجعه کنید.

اضافه شده در نسخه‌ی 3.13.

--enable-experimental-jit=[no|yes|yes-off|interpreter]

نشان دهید که چگونه کامپایلر در لحظه (JIT) آزمایشی را ادغام کنید.

  • no: کامپایلر در لحظه ساخته نمی‌شود.

  • 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 فعال، مطمئن شوید که پایتون 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
BZIP2_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای پیوند دادن پایتون با libbz2، که توسط ماژول bz2 استفاده می‌شوند و pkg-config را نادیده می‌گیرند.

CURSES_CFLAGS
CURSES_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libncurses یا libncursesw، که توسط ماژول curses استفاده می‌شوند و pkg-config را نادیده می‌گیرند.

GDBM_CFLAGS
GDBM_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای gdbm.

LIBEDIT_CFLAGS
LIBEDIT_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libedit، که ماژول readline از آن استفاده می‌کند؛ این پرچم‌ها بر pkg-config اولویت دارند.

LIBFFI_CFLAGS
LIBFFI_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libffi که ماژول ctypes از آن استفاده می‌کند، و pkg-config را نادیده می‌گیرند.

LIBMPDEC_CFLAGS
LIBMPDEC_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libmpdec، که توسط ماژول decimal استفاده می‌شود و pkg-config را نادیده می‌گیرد.

توجه

این متغیرهای محیطی هیچ تأثیری ندارند، مگر اینکه --with-system-libmpdec مشخص شود.

LIBLZMA_CFLAGS
LIBLZMA_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای liblzma، که توسط ماژول lzma استفاده می‌شوند و به‌جای pkg-config به کار می‌روند.

LIBREADLINE_CFLAGS
LIBREADLINE_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libreadline، که توسط ماژول readline استفاده می‌شوند و بر pkg-config غلبه می‌کنند.

LIBSQLITE3_CFLAGS
LIBSQLITE3_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libsqlite3، که توسط ماژول sqlite3 استفاده می‌شود و pkg-config را نادیده می‌گیرد.

LIBUUID_CFLAGS
LIBUUID_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libuuid، که توسط ماژول uuid استفاده می‌شوند و pkg-config را نادیده می‌گیرند.

LIBZSTD_CFLAGS
LIBZSTD_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libzstd، که توسط ماژول compression.zstd استفاده می‌شود، pkg-config را نادیده می‌گیرد.

اضافه شده در نسخه‌ی 3.14.

PANEL_CFLAGS
PANEL_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای PANEL، که pkg-config را نادیده می‌گیرند.

پرچم‌های کامپایلر C و پیونددهنده برای libpanel یا libpanelw، که توسط ماژول curses.panel استفاده می‌شوند و بر pkg-config اولویت دارند.

TCLTK_CFLAGS
TCLTK_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای TCLTK، که pkg-config را نادیده می‌گیرند.

ZLIB_CFLAGS
ZLIB_LIBS

پرچم‌های کامپایلر C و پیونددهنده برای libzlib، که توسط ماژول gzip استفاده می‌شود و pkg-config را بازنویسی می‌کند.

3.3.5. گزینه‌های WebAssembly

--enable-wasm-dynamic-linking

فعال کردن پشتیبانی از پیوند‌دهی پویا برای WASM.

پیوندسازی پویا dlopen را ممکن می‌سازد. حجم پرونده اجرایی به دلیل محدود بودن حذف کد مرده و ویژگی‌های اضافی افزایش می‌یابد.

اضافه شده در نسخه‌ی 3.11.

--enable-wasm-pthreads

فعال کردن پشتیبانی از pthreads برای WASM.

اضافه شده در نسخه‌ی 3.11.

3.3.6. گزینه‌های نصب

--prefix=PREFIX

پرونده‌های مستقل از معماری را در PREFIX نصب کنید. در یونیکس، مقدار پیش‌فرض آن /usr/local است.

این مقدار را می‌توان در زمان اجرا با استفاده از sys.prefix بازیابی کرد.

به عنوان مثال، می‌توان از --prefix="$HOME/.local/" برای نصب یک پایتون در پوشه خانگی خود استفاده کرد.

--exec-prefix=EPREFIX

پرونده‌های وابسته به معماری را در EPREFIX نصب می‌کند؛ مقدار پیش‌فرض آن --prefix است.

این مقدار را می‌توان در زمان اجرا با استفاده از sys.exec_prefix بازیابی کرد.

--disable-test-modules

ماژول‌های آزمون مانند بسته‌ی test یا ماژول توسعه‌ای _testcapi (که به‌صورت پیش‌فرض ساخته و نصب می‌شوند) را نسازید و نصب نکنید.

اضافه شده در نسخه‌ی 3.10.

--with-ensurepip=[upgrade|install|no]

فرمان ensurepip را که هنگام نصب پایتون اجرا می‌شود انتخاب کنید:

  • upgrade (پیش‌فرض): اجرای دستور python -m ensurepip --altinstall --upgrade.

  • install: اجرای دستور python -m ensurepip --altinstall؛

  • no: ensurepip اجرا نشود؛

اضافه شده در نسخه‌ی 3.6.

3.3.7. گزینه‌های کارایی

پیکربندی پایتون با استفاده از --enable-optimizations --with-lto (PGO + LTO) برای بهترین عملکرد توصیه می‌شود. همچنین می‌توان از پرچم آزمایشی --enable-bolt برای بهبود عملکرد استفاده کرد.

--enable-optimizations

فعال‌سازی بهینه‌سازی هدایت‌شده توسط پروفایل (PGO) با استفاده از PROFILE_TASK (به‌طور پیش‌فرض غیرفعال است).

کامپایلر C با نام Clang برای PGO به برنامه‌ی llvm-profdata نیاز دارد. در macOS، GCC نیز به آن نیاز دارد: GCC در macOS تنها یک نام مستعار برای Clang است.

در صورت استفاده از --enable-shared و GCC، میان‌جای‌گذاری معنایی (semantic interposition) را نیز در libpython غیرفعال کنید: -fno-semantic-interposition را به پرچم‌های کامپایلر و پیونددهنده اضافه کنید.

توجه

در حین ساخت، ممکن است با هشدارهایی از سوی کامپایلر مبنی بر اینکه داده‌های پروفایل برای برخی از پرونده‌های منبع در دسترس نیست مواجه شوید. این هشدارها بی‌ضرر هستند، زیرا در طول گردآوری داده‌های پروفایل تنها زیرمجموعه‌ای از کد اجرا می‌شود. برای غیرفعال کردن این هشدارها در Clang، با افزودن -Wno-profile-instr-unprofiled به CFLAGS آن‌ها را به‌صورت دستی سرکوب کنید.

اضافه شده در نسخه‌ی 3.6.

تغییر یافته در نسخه‌ی 3.10: از -fno-semantic-interposition در GCC استفاده کنید.

PROFILE_TASK

متغیر محیطی استفاده‌شده در Makefile: آرگومان‌های خط فرمان پایتون برای وظیفه‌ی تولید PGO.

پیش‌فرض: -m test --pgo --timeout=$(TESTTIMEOUT).

اضافه شده در نسخه‌ی 3.8.

تغییر یافته در نسخه‌ی 3.13: شکست وظیفه دیگر به‌صورت بی‌صدا نادیده گرفته نمی‌شود.

--with-lto=[full|thin|no|yes]

فعال کردن بهینه‌سازی زمان پیوند (LTO) در هر ساخت (به‌طور پیش‌فرض غیرفعال است).

کامپایلر C یعنی Clang برای LTO نیازمند llvm-ar (در macOS، ar) و همچنین یک پیونددهنده آگاه از LTO (ld.gold یا lld) است.

اضافه شده در نسخه‌ی 3.6.

اضافه شده در نسخه‌ی 3.11: برای بهره‌گیری از ویژگی ThinLTO، در Clang از --with-lto=thin استفاده کنید.

تغییر یافته در نسخه‌ی 3.12: اگر کامپایلر این پرچم را بپذیرد، از ThinLTO به‌عنوان سیاست بهینه‌سازی پیش‌فرض در Clang استفاده کنید.

--enable-bolt

فعال‌سازی استفاده از بهینه‌ساز دودویی پس از پیوند BOLT (به‌طور پیش‌فرض غیرفعال است).

BOLT بخشی از پروژه LLVM است، اما همیشه در توزیع‌های دودویی آن‌ها گنجانده نمی‌شود. این پرچم مستلزم آن است که llvm-bolt و merge-fdata دسترس‌پذیر باشند.

BOLT هنوز پروژه‌ای نسبتاً جدید است، بنابراین این پرچم فعلاً باید آزمایشی در نظر گرفته شود. از آنجا که این ابزار روی کد ماشین کار می‌کند، موفقیت آن به ترکیبی از محیط ساخت + سایر آرگومان‌های configure مربوط به بهینه‌سازی + معماری CPU وابسته است و همه ترکیب‌ها پشتیبانی نمی‌شوند. مشخص است که نسخه‌های BOLT پیش از LLVM 16 در برخی سناریوها باعث فروپاشی BOLT می‌شوند. استفاده از LLVM 16 یا جدیدتر برای بهینه‌سازی BOLT به‌شدت توصیه می‌شود.

می‌توان متغیرهای BOLT_INSTRUMENT_FLAGS و BOLT_APPLY_FLAGS در configure را تعریف کرد تا به ترتیب مجموعه‌ی پیش‌فرض آرگومان‌های llvm-bolt برای ابزارگذاری (instrument) و اعمال داده‌های BOLT روی پرونده‌های دودویی را نادیده بگیرند.

اضافه شده در نسخه‌ی 3.12.

BOLT_APPLY_FLAGS

آرگومان‌های llvm-bolt هنگام ساخت دودویی بهینه‌شده با BOLT.

اضافه شده در نسخه‌ی 3.12.

BOLT_INSTRUMENT_FLAGS

آرگومان‌های llvm-bolt هنگام ابزارگذاری (instrumenting) پرونده‌های دودویی.

اضافه شده در نسخه‌ی 3.12.

--with-computed-gotos

فعال کردن گوتوهای محاسبه‌شده (computed goto) در حلقه ارزیابی (به‌طور پیش‌فرض روی کامپایلرهای پشتیبانی‌شده فعال است).

--with-tail-call-interp

فعال کردن مفسرهایی که در سی‌پایتون از فراخوانی‌های دمی استفاده می‌کنند. در صورت فعال بودن، فعال‌سازی PGO (--enable-optimizations) به‌شدت توصیه می‌شود. این گزینه به‌طور خاص به کامپایلر C با پشتیبانی مناسب از فراخوانی دمی و قرارداد فراخوانی preserve_none نیاز دارد. برای مثال، Clang 19 و نسخه‌های جدیدتر از این قابلیت پشتیبانی می‌کنند.

اضافه شده در نسخه‌ی 3.14.

--without-mimalloc

غیرفعال کردن تخصیص‌دهنده‌ی سریع mimalloc (به‌طور پیش‌فرض فعال است).

این گزینه را نمی‌توان همراه با --disable-gil استفاده کرد، زیرا ساخت‌ نخ‌آزاد به mimalloc نیاز دارد.

همچنین متغیر محیطی PYTHONMALLOC را ببینید.

--without-pymalloc

غیرفعال کردن تخصیص‌دهنده حافظه‌ی تخصصی پایتون pymalloc (که به‌طور پیش‌فرض فعال است).

همچنین متغیر محیطی PYTHONMALLOC را ببینید.

--without-doc-strings

غیرفعال‌سازی رشته‌های مستند ایستا برای کاهش مصرف حافظه (به‌صورت پیش‌فرض فعال است). رشته‌های مستند تعریف‌شده در پایتون تحت تأثیر قرار نمی‌گیرند.

ماکروی WITH_DOC_STRINGS را تعریف نکنید.

ماکرو PyDoc_STRVAR() را ببینید.

--enable-profiling

فعال‌سازی پروفایل‌گیری کد سطح C با gprof (به‌طور پیش‌فرض غیرفعال است).

--with-strict-overflow

پرچم -fstrict-overflow را به پرچم‌های کامپایلر C اضافه کنید (به‌صورت پیش‌فرض، ما به‌جای آن -fno-strict-overflow را اضافه می‌کنیم).

--without-remote-debug

پشتیبانی از اشکال‌زدایی از راه دور که در PEP 768 توصیف‌شده است را غیرفعال می‌کند (به‌صورت پیش‌فرض فعال است). با ارائه این پرچم، کدی که به مفسر اجازه می‌دهد اجرای یک پرونده پایتون را در فرایندی جداگانه زمان‌بندی کند (همان‌طور که در PEP 768 توصیف‌شده است)، کامپایل نمی‌شود. این شامل هر دو کارکرد زمان‌بندی کدی که باید اجرا شود و کارکرد دریافت کدی که باید اجرا شود است.

Py_REMOTE_DEBUG

این ماکرو به‌طور پیش‌فرض تعریف شده است، مگر اینکه پایتون با --without-remote-debug پیکربندی شده باشد.

توجه داشته باشید که حتی اگر ماکرو تعریف شده باشد، ممکن است اشکال‌زدایی از راه دور دسترس‌پذیر نباشد (برای مثال، روی پلتفرمی نا‌سازگار).

اضافه شده در نسخه‌ی 3.14.

3.3.8. ساخت‌ اشکال‌زدایی پایتون

نسخه‌ی اشکال‌زدایی پایتونی است که با گزینه‌ی پیکربندی --with-pydebug ساخته شده است.

اثرات ساخت‌ اشکال‌زدایی:

  • نمایش همه‌ی هشدارها به‌طور پیش‌فرض: فهرست فیلترهای هشدار پیش‌فرض در ماژول 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 را ببینید). بررسی‌های اصلی ران‌تایم:

    • بررسی‌های درستی (sanity check) را بر روی آرگومان‌های تابع اضافه کنید.

    • شیءهای یونیکد و int به‌گونه‌ای ساخته می‌شوند که حافظه‌شان با یک الگو پر شده باشد تا استفاده از شیءهای مقداردهی‌نشده تشخیص داده شود.

    • مطمئن شوید که توابعی که می‌توانند استثنای فعلی را پاک کنند یا جایگزین کنند، در حالی که استثنایی برخاسته (raise) است، فراخوانی نمی‌شوند.

    • بررسی کنید که توابع آزادساز حافظه استثنای فعلی را تغییر ندهند.

    • زباله‌روب (تابع gc.collect()) برخی بررسی‌های پایه روی سازگاری اشیاء انجام می‌دهد.

    • ماکروی Py_SAFE_DOWNCAST() هنگام تبدیل نوع به پایین (downcasting) از نوع‌های پهن به نوع‌های باریک، زیرریز و سرریز عدد صحیح را بررسی می‌کند.

همچنین حالت توسعه پایتون و گزینه‌ی پیکربندی --with-trace-refs را ببینید.

تغییر یافته در نسخه‌ی 3.8: ساخت‌های نهایی اکنون از نظر ABI با ساخت‌های دیباگ سازگار هستند: تعریف ماکروی Py_DEBUG دیگر مستلزم ماکروی Py_TRACE_REFS نیست (گزینه‌ی --with-trace-refs را ببینید). با این حال، ساخت‌های دیباگ همچنان نمادهای بیشتری نسبت به ساخت‌های نهایی نمایان می‌کنند و کدی که بر پایه‌ی یک ساخت‌ دیباگ ساخته شده باشد، لزوماً با ساخت‌ نهایی سازگار نیست.

3.3.9. گزینه‌های اشکال‌زدایی

--with-pydebug

ساخت پایتون در حالت اشکال‌زدایی: ماکرو Py_DEBUG را تعریف کنید (به‌صورت پیش‌فرض غیرفعال است).

--with-trace-refs

فعال‌سازی ردگیری ارجاع‌ها به منظور اشکال‌زدایی (به‌طور پیش‌فرض غیرفعال است).

اثرات:

می‌توان از متغیر محیطی PYTHONDUMPREFS برای برون‌ریزی اشیاء و شمارش ارجاع‌هایی که هنگام خروج پایتون هنوز زنده‌اند استفاده کرد.

اشیاء تخصیص‌یافته به‌صورت ایستا ردگیری نمی‌شوند.

اضافه شده در نسخه‌ی 3.8.

تغییر یافته در نسخه‌ی 3.13: این ساخت‌ اکنون از نظر ABI با ساخت‌ انتشار و ساخت‌ اشکال‌زدایی سازگار است.

--with-assertions

ساخت با ادعاهای C فعال‌شده (پیش‌فرض: خیر): assert(...); و _PyObject_ASSERT(...);.

در صورت تنظیم، ماکروی NDEBUG در متغیر کامپایلر OPT تعریف نمی‌شود.

همچنین گزینه‌ی --with-pydebug (ساخت اشکال‌زدایی) را ببینید که ادعاها را نیز فعال می‌کند.

اضافه شده در نسخه‌ی 3.6.

--with-valgrind

فعال‌سازی پشتیبانی از Valgrind (پیش‌فرض: خیر).

--with-dtrace

فعال‌سازی پشتیبانی از DTrace (پیش‌فرض خیر است).

به ابزارگذاری (instrumenting) سی‌پایتون با DTrace و SystemTap مراجعه کنید.

اضافه شده در نسخه‌ی 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. گزینه‌های پیونددهنده

--enable-shared

فعال‌سازی ساخت کتابخانه‌ی اشتراکی پایتون: libpython (پیش‌فرض: خیر).

--without-static-libpython

libpythonMAJOR.MINOR.a ساخته نمی‌شود و python.o نصب نمی‌شود (به‌طور پیش‌فرض ساخته و فعال می‌شوند).

اضافه شده در نسخه‌ی 3.10.

3.3.11. گزینه‌های کتابخانه‌ها

--with-libs='lib1 ...'

لینک شدن با کتابخانه‌های اضافی (پیش‌فرض: خیر).

--with-system-expat

ماژول pyexpat را با استفاده از یک کتابخانه‌ی expat نصب‌شده بسازید (پیش‌فرض: خیر).

--with-system-libmpdec

ماژول توسعه‌ای _decimal را با استفاده از کتابخانه‌ی نصب‌شده‌ی mpdecimal بسازید؛ به ماژول decimal مراجعه کنید (پیش‌فرض بله است).

اضافه شده در نسخه‌ی 3.3.

تغییر یافته در نسخه‌ی 3.13: به‌طور پیش‌فرض از کتابخانه‌ی نصب‌شده‌ی mpdecimal استفاده می‌کند.

تغییر یافته در نسخه‌ی 3.15: اگر کتابخانه‌ی نصب‌شده‌ی mpdecimal یافت نشود، دیگر نسخه‌ی همراه کتابخانه به‌صورت ضمنی انتخاب نمی‌شود. تنها در پایتون 3.15 می‌توان آن را همچنان به‌صورت صریح با استفاده از --with-system-libmpdec=no یا --without-system-libmpdec انتخاب کرد.

منسوخ شده از نسخه‌ی 3.13, در نسخه‌ی 3.16 حذف خواهد شد: دیگر نسخه‌ای از کدهای منبع کتابخانه mpdecimal همراه با پایتون 3.16 توزیع نخواهد شد.

همچنین ملاحظه نمائید

LIBMPDEC_CFLAGS و LIBMPDEC_LIBS.

--with-readline=readline|editline

یک کتابخانه بک‌اند برای ماژول readline تعیین می‌کند.

  • readline: استفاده از readline به عنوان بک‌اند.

  • editline: استفاده از editline به‌عنوان بک‌اند.

اضافه شده در نسخه‌ی 3.10.

--without-readline

ماژول readline را نسازید (به‌طور پیش‌فرض ساخته می‌شود).

ماکرو HAVE_LIBREADLINE را تعریف نکنید.

اضافه شده در نسخه‌ی 3.10.

--with-libm=STRING

نادیده گرفتن کتابخانه ریاضی libm و استفاده از STRING به جای آن (پیش‌فرض وابسته به سیستم است).

--with-libc=STRING

جایگزین کردن کتابخانه C یعنی libc با STRING (پیش‌فرض به سیستم بستگی دارد).

--with-openssl=DIR

ریشه‌ی پوشه‌ی OpenSSL.

اضافه شده در نسخه‌ی 3.7.

--with-openssl-rpath=[no|auto|DIR]

تنظیم پوشه کتابخانه در زمان اجرا (rpath) برای کتابخانه‌های OpenSSL:

  • no (پیش‌فرض): rpath تنظیم نشود؛

  • auto: تشخیص خودکار rpath از --with-openssl و pkg-config؛

  • 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 (پیش‌فرض): استفاده از انتخاب ترجیحی پایتون؛

  • openssl: پیش‌فرض‌های OpenSSL را دست‌نخورده بگذارید؛

  • STRING: استفاده از یک رشته‌ی سفارشی

به ماژول ssl مراجعه کنید.

اضافه شده در نسخه‌ی 3.7.

تغییر یافته در نسخه‌ی 3.10: تنظیمات python و STRING نیز TLS 1.2 را به عنوان حداقل نسخه‌ی پروتکل تنظیم می‌کنند.

--disable-safety

گزینه‌های کامپایلری را که به دلایل امنیتی و بدون هیچ سربار عملکردی recommended by OpenSSF هستند، غیرفعال می‌کند. اگر این گزینه فعال نباشد، سی‌پایتون بر اساس گزینه‌های امنیتی کامپایلر و بدون هیچ کندی ساخته می‌شود. در صورت فعال بودن این گزینه، سی‌پایتون با گزینه‌های کامپایلری فهرست‌شده در ادامه ساخته نخواهد شد.

گزینه‌های کامپایلر زیر با --disable-safety غیرفعال می‌شوند:

  • -fstack-protector-strong: فعال‌سازی بررسی‌های زمان اجرا برای سرریز بافر مبتنی بر پشته.

  • -Wtrampolines: فعال کردن هشدارهای مربوط به ترامپولین‌هایی که به پشته‌های اجرایی نیاز دارند.

اضافه شده در نسخه‌ی 3.14.

--enable-slower-safety

فعال کردن گزینه‌های کامپایلر که به دلایل امنیتی recommended by OpenSSF شده‌اند و نیازمند سربار هستند. اگر این گزینه فعال نشده باشد، سی‌پایتون بر اساس گزینه‌های امن کامپایلر که بر کارایی تأثیر می‌گذارند ساخته نخواهد شد. هنگامی که این گزینه فعال باشد، سی‌پایتون با گزینه‌های کامپایلر فهرست‌شده در زیر ساخته خواهد شد.

گزینه‌های کامپایلر زیر با --enable-slower-safety فعال می‌شوند:

  • -D_FORTIFY_SOURCE=3: کدهای منبع را با بررسی‌های زمان کامپایل و زمان اجرا برای استفاده ناامن از libc و سرریز بافر تقویت می‌کند.

اضافه شده در نسخه‌ی 3.14.

3.3.13. گزینه‌های macOS

‏:source:Mac/README.rst را ببینید.

--enable-universalsdk
--enable-universalsdk=SDKDIR

یک ساخت دودویی همگانی ایجاد کنید. SDKDIR مشخص می‌کند که از کدام macOS SDK باید برای انجام ساخت استفاده شود (پیش‌فرض: no).

--enable-framework
--enable-framework=INSTALLDIR

به‌جای نصب سنتی یونیکس، یک Python.framework ایجاد می‌کند. 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).

توجه داشته باشید که مقادیر این آیتم پیکربندی با شناسه‌های استفاده‌شده برای چرخ‌های دودویی همگانی (universal binary wheels) در macOS یکسان نیستند. برای جزئیات درباره‌ی برچسب‌های سازگاری پلتفرم بسته‌بندی استفاده‌شده در macOS به راهنمای کاربر بسته‌بندی پایتون مراجعه کنید

--with-framework-name=FRAMEWORK

نام چارچوب پایتون در macOS را مشخص می‌کند؛ تنها زمانی معتبر است که --enable-framework تنظیم شده باشد (پیش‌فرض: Python).

--with-app-store-compliance
--with-app-store-compliance=PATCH-FILE

کتابخانه استاندارد پایتون شامل رشته‌هایی است که شناخته شده است هنگام ارسال برای توزیع از طریق App Store‌های macOS و iOS، خطاهای ابزار بازرسی خودکار را ایجاد می‌کنند. در صورت فعال بودن، این گزینه فهرست وصل‌هایی را اعمال می‌کند که شناخته شده است سازگاری با فروشگاه برنامه را اصلاح می‌کنند. همچنین می‌توان یک پرونده وصل سفارشی مشخص کرد. این گزینه به‌طور پیش‌فرض غیرفعال است.

اضافه شده در نسخه‌ی 3.13.

3.3.14. گزینه‌های iOS

به iOS/README.rst مراجعه کنید.

--enable-framework=INSTALLDIR

ایجاد یک Python.framework. برخلاف macOS، آرگومان INSTALLDIR که مسیر نصب را مشخص می‌کند، الزامی است.

--with-framework-name=FRAMEWORK

نام چارچوب را مشخص کنید (پیش‌فرض: Python).

3.3.15. گزینه‌های کامپایل متقاطع

کامپایل متقاطع (cross compiling)، که با نام ساخت متقاطع (cross building) نیز شناخته می‌شود، می‌تواند برای ساخت پایتون برای معماری CPU یا پلتفرم دیگری به کار رود. کامپایل متقاطع به یک مفسر پایتون برای پلتفرم ساخت نیاز دارد. نسخه‌ی پایتون ساخت باید با نسخه‌ی پایتون میزبانی که به‌صورت متقاطع کامپایل شده است مطابقت داشته باشد.

--build=BUILD

پیکربندی برای ساخت روی BUILD، که معمولاً توسط config.guess حدس زده می‌شود.

--host=HOST

کامپایل متقاطع برای ساخت برنامه‌هایی که روی HOST (پلتفرم هدف) اجرا می‌شوند

--with-build-python=path/to/python

مسیر دودویی python ساخت برای کامپایل متقاطع

اضافه شده در نسخه‌ی 3.11.

CONFIG_SITE=file

متغیر محیطی که به پرونده‌ای حاوی بازنویسی‌های configure اشاره می‌کند.

نمونه پرونده config.site:

# config.site-aarch64
ac_cv_buggy_getaddrinfo=no
ac_cv_file__dev_ptmx=yes
ac_cv_file__dev_ptc=no
HOSTRUNNER

برنامه‌ای برای اجرای سی‌پایتون روی پلتفرم میزبان به منظور کامپایل متقاطع.

اضافه شده در نسخه‌ی 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. سیستم ساخت پایتون

3.4.1. پرونده‌های اصلی سیستم ساخت

  • configure.ac => configure;

  • Makefile.pre.in => Makefile (ایجاد‌شده توسط configure);

  • pyconfig.h (ایجادشده توسط configure

  • Modules/Setup: ماژول‌های توسعه‌ای C که توسط Makefile و با استفاده از اسکریپت پوسته‌ی Module/makesetup ساخته می‌شوند؛

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

در بیشتر موارد، هنگام بازساخت پس از ویرایش مقداری کد یا به‌روزرسانی چک‌اوت (checkout) خود از مخزن بالادستی، کافی است make را اجرا کنید که (طبق معناشناسی Make) هدف پیش‌فرض، یعنی نخستین هدف تعریف‌شده در Makefile، را می‌سازد. طبق سنت (از جمله در پروژه‌ی سی‌پایتون)، این معمولاً هدف 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) بسازید. می‌توانید از گزینه‌ی --enable-optimizations در configure استفاده کنید تا این کار به هدف پیش‌فرض دستور make تبدیل شود (make all یا فقط make).

3.4.3.4. make clean

پرونده‌های ساخته‌شده را حذف کنید.

3.4.3.5. make distclean

علاوه بر کاری که make clean انجام می‌دهد، پرونده‌هایی را که اسکریپت configure ایجاد کرده است حذف می‌کند. configure باید پیش از ساخت مجدد اجرا شود. [6]

3.4.3.6. make install

هدف all را بسازید و پایتون را نصب کنید.

3.4.3.7. make test

هدف all را بسازید و بدنه‌ی آزمون‌های پایتون را با گزینه‌ی --fast-ci و بدون آزمون‌های رابط گرافیکی (GUI) اجرا کنید. متغیرها:

  • TESTOPTS: گزینه‌های اضافی خط فرمان regrtest.

  • TESTPYTHONOPTS: گزینه‌های اضافی خط فرمان پایتون.

  • TESTTIMEOUT: مهلت زمانی بر حسب ثانیه (پیش‌فرض: ۱۰ دقیقه).

3.4.3.8. make ci

این شبیه به make test است، اما از -ugui استفاده می‌کند تا آزمون‌های GUI را نیز اجرا کند.

اضافه شده در نسخه‌ی 3.14.

3.4.3.9. make buildbottest

این مشابه make test است، اما به‌جای گزینه‌ی --fast-ci، از گزینه‌ی --slow-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 ساخته می‌شوند. مثال در لینوکس 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 استفاده کنید.

اگر ماکروی Py_BUILD_CORE_BUILTIN به‌اشتباه در یک افزونه‌ی C که به‌صورت کتابخانه‌ی اشتراکی ساخته شده است استفاده شود، تابع PyInit_xxx() آن اکسپورت نمی‌شود و هنگام ایمپورت، باعث بروز ImportError می‌شود.

3.5. پرچم‌های کامپایلر و پیونددهنده

گزینه‌هایی که توسط اسکریپت ./configure و متغیرهای محیطی تعیین می‌شوند و توسط Makefile استفاده می‌شوند.

3.5.1. پرچم‌های پیش‌پردازنده

CONFIGURE_CPPFLAGS

مقدار متغیر CPPFLAGS که به اسکریپت ./configure پاس داده می‌شود.

اضافه شده در نسخه‌ی 3.6.

CPPFLAGS

پرچم‌های پیش‌پردازنده‌ی (Objective) C/C++، مثلاً -Iinclude_dir اگر سرآیندهایی در پوشه‌ی غیراستاندارد include_dir داشته باشید.

هر دو CPPFLAGS و LDFLAGS باید شامل مقدار پوسته باشند تا بتوان ماژول‌های توسعه‌ای را با استفاده از پوشه‌های مشخص‌شده در متغیرهای محیطی ساخت.

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 کتابخانه استاندارد استفاده می‌شود. زمانی از آن استفاده کنید که یک پرچم کامپایلر پس از نصب پایتون نباید بخشی از CFLAGS باشد (gh-65320).

به‌طور خاص، CFLAGS نباید شامل موارد زیر باشد:

  • پرچم کامپایلر -I (برای تنظیم مسیر جست‌وجوی پرونده‌های include). پرچم‌های -I از چپ به راست پردازش می‌شوند و هر پرچمی که در CFLAGS باشد، بر پرچم‌های -I ارائه‌شده توسط کاربر و بسته اولویت خواهد داشت.

  • پرچم‌های سخت‌سازی (hardening) مانند -Werror، زیرا توزیع‌ها نمی‌توانند کنترل کنند که آیا بسته‌های نصب‌شده توسط کاربران با چنین استانداردهای بالاتری مطابقت دارند یا خیر.

اضافه شده در نسخه‌ی 3.5.

COMPILEALL_OPTS

گزینه‌هایی که هنگام ساخت پرونده‌های PYC در make install به خط فرمان compileall ارسال می‌شوند. پیش‌فرض: -j0.

اضافه شده در نسخه‌ی 3.12.

EXTRA_CFLAGS

پرچم‌های اضافی کامپایلر C.

CONFIGURE_CFLAGS

مقدار متغیر CFLAGS که به اسکریپت ./configure پاس داده می‌شود.

اضافه شده در نسخه‌ی 3.2.

CONFIGURE_CFLAGS_NODIST

مقدار متغیر CFLAGS_NODIST که به اسکریپت ./configure پاس داده‌شده است.

اضافه شده در نسخه‌ی 3.5.

BASECFLAGS

پرچم‌های پایه‌ی کامپایلر.

OPT

پرچم‌های بهینه‌سازی.

CFLAGS_ALIASING

پرچم‌های آلیاسینگ (aliasing) سخت‌گیرانه یا غیرسخت‌گیرانه که برای کامپایل Python/dtoa.c استفاده می‌شوند.

اضافه شده در نسخه‌ی 3.7.

CFLAGS_CEVAL

پرچم‌های استفاده‌شده برای کامپایل Python/ceval.c.

اضافه شده در نسخه‌ی 3.14.5.

CCSHARED

پرچم‌های کامپایلر استفاده‌شده برای ساخت یک کتابخانه اشتراکی.

برای مثال، -fPIC در لینوکس و BSD استفاده می‌شود.

CFLAGSFORSHARED

پرچم‌های اضافی C که برای ساخت پرونده‌های شیء مفسر افزوده می‌شوند.

پیش‌فرض: $(CCSHARED) هنگامی که از --enable-shared استفاده می‌شود، یا در غیر این صورت یک رشته خالی.

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. پرچم‌های پیونددهنده (linker flags)

LINKCC

فرمان پیونددهنده که برای ساخت برنامه‌هایی مانند python و _testembed استفاده می‌شود.

پیش‌فرض: $(PURIFY) $(CC).

CONFIGURE_LDFLAGS

مقدار متغیر LDFLAGS که به اسکریپت ./configure ارسال می‌شود.

از انتساب CFLAGS، LDFLAGS و غیره خودداری کنید تا کاربران بتوانند از آن‌ها در خط فرمان برای افزودن به این مقادیر استفاده کنند، بدون اینکه مقادیر از پیش تنظیم‌شده را از بین ببرند.

اضافه شده در نسخه‌ی 3.2.

LDFLAGS_NODIST

LDFLAGS_NODIST به همان شیوه‌ی CFLAGS_NODIST استفاده می‌شود. از آن زمانی استفاده کنید که یک پرچم پیونددهنده (linker flag) پس از نصب پایتون بخشی از LDFLAGS نباشد (gh-65320).

به‌ویژه، LDFLAGS نباید شامل موارد زیر باشد:

  • پرچم کامپایلر -L (برای تنظیم مسیر جستجوی کتابخانه‌ها). پرچم‌های -L از چپ به راست پردازش می‌شوند، و هر پرچم موجود در LDFLAGS بر پرچم‌های -L تأمین‌شده از سوی کاربر و بسته اولویت خواهد داشت.

CONFIGURE_LDFLAGS_NODIST

مقدار متغیر LDFLAGS_NODIST که به اسکریپت ./configure پاس داده می‌شود.

اضافه شده در نسخه‌ی 3.8.

LDFLAGS

پرچم‌های پیونددهنده، برای مثال -Llib_dir اگر کتابخانه‌ها را در پوشه‌ی غیراستاندارد lib_dir دارید.

هر دو CPPFLAGS و LDFLAGS باید شامل مقدار پوسته باشند تا بتوان ماژول‌های توسعه‌ای را با استفاده از پوشه‌های مشخص‌شده در متغیرهای محیطی ساخت.

LIBS

پرچم‌های پیونددهنده برای فرستادن کتابخانه‌ها به پیونددهنده هنگام پیوند دادن پرونده اجرایی پایتون.

مثال: -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.

پانوشت‌ها