3. پیکربندی پایتون¶
3.1. نیازمندیهای ساخت¶
برای ساخت سیپایتون، به موارد زیر نیاز خواهید داشت:
یک کامپایلر C11. ویژگیهای اختیاری C11 الزامی نیستند.
در ویندوز، Microsoft Visual Studio 2017 یا نسخههای جدیدتر آن لازم است.
پشتیبانی از اعداد ممیز شناور IEEE 754 و عدد نیست ممیز شناور (NaN).
پشتیبانی از نخها.
تغییر یافته در نسخهی 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.
اگر مفسر سیپایتون را بدون ماژولهای اختیاری توزیع میکنید، بهترین روش این است که کاربران را آگاه کنید، زیرا آنها معمولاً انتظار دارند ماژولهای کتابخانه استاندارد در دسترس باشند.
وابستگیهای ساخت ماژولهای اختیاری عبارتاند از:
وابستگی |
حداقل نسخه |
ماژول پایتون |
|---|---|---|
3.3.0 توصیهشده |
||
2.5.0 |
||
|
||
3.0.18 توصیهشده
(حداقل 1.1.1)
|
||
3.15.2 |
||
8.5.12 |
||
1.2.2.1 |
||
1.4.5 |
توجه داشته باشید که این جدول شامل تمام ماژولهای اختیاری نیست؛ بهطور خاص، ماژولهای مخصوص پلتفرم مانند winreg در اینجا فهرست نشدهاند.
همچنین ملاحظه نمائید
راهنمای توسعه (devguide) شامل فهرست کاملی از وابستگیهای مورد نیاز برای ساخت تمام ماژولها و دستورالعملهایی درباره نحوه نصب آنها در پلتفرمهای رایج است.
--with-system-expatامکان ساخت با یک کتابخانهی خارجی libexpat را فراهم میکند.
تغییر یافته در نسخهی 3.1: نسخهی 8.3.1 از Tcl/Tk اکنون برای tkinter لازم است.
تغییر یافته در نسخهی 3.5: اکنون نسخهی 8.4 از Tcl/Tk برای tkinter لازم است.
تغییر یافته در نسخهی 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¶
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بازیابی کرد.
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.
-
Py_REMOTE_DEBUG¶
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¶
فعالسازی ردگیری ارجاعها به منظور اشکالزدایی (بهطور پیشفرض غیرفعال است).
اثرات:
ماکرو
Py_TRACE_REFSرا تعریف کنید.تابع
sys.getobjects()اضافه شد.افزودن متغیر محیطی
PYTHONDUMPREFS.
میتوان از متغیر محیطی
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. گزینههای پیونددهنده¶
فعالسازی ساخت کتابخانهی اشتراکی پایتون:
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 توزیع نخواهد شد.همچنین ملاحظه نمائید
- --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.
پانوشتها
git clean -fdx راهی باز هم افراطیتر برای «تمیز کردن» چکاوت (checkout) شماست. این دستور تمام پروندههایی را که Git آنها را نمیشناسد حذف میکند. هنگام جستوجوی اشکال با استفاده از git bisect، انجام این کار بین کاوشها توصیه میشود تا یک ساخت کاملاً تمیز تضمین شود. با احتیاط استفاده کنید، زیرا تمام پروندههایی را که در Git ثبت نشدهاند حذف خواهد کرد، از جمله کارهای جدید و کامیتنشدهی شما.