بررسی اجمالی
برای فراخوانی کامپایلر با گزینههای مناسب، Bazel به اطلاعاتی در مورد اجزای داخلی کامپایلر نیاز دارد، مانند شامل دایرکتوریها و پرچمهای مهم. به عبارت دیگر، Bazel برای درک عملکرد آن به یک مدل ساده شده از کامپایلر نیاز دارد.
بازل باید موارد زیر را بداند:
- این که آیا کامپایلر از thinLTO، ماژول ها، پیوندهای پویا یا PIC (کد مستقل از موقعیت) پشتیبانی می کند.
- مسیرهای دسترسی به ابزارهای مورد نیاز مانند gcc، ld، ar، objcopy و غیره.
- سیستم داخلی شامل دایرکتوری ها می شود. Bazel به این موارد نیاز دارد تا تأیید کند که تمام سرصفحههایی که در فایل منبع گنجانده شدهاند به درستی در فایل
BUILDاعلام شدهاند. - sysroot پیش فرض
- از کدام پرچم ها برای کامپایل، پیوند، بایگانی استفاده کنید.
- کدام پرچم برای حالت های کامپایل پشتیبانی شده (opt، dbg، fastbuild) استفاده شود.
- متغیرهایی را ایجاد کنید که به طور خاص توسط کامپایلر مورد نیاز است.
اگر کامپایلر از چندین معماری پشتیبانی می کند، Bazel باید آنها را جداگانه پیکربندی کند.
CcToolchainConfigInfo ارائهدهندهای است که سطح لازم از جزئیات را برای پیکربندی رفتار قوانین C++ Bazel ارائه میکند. به طور پیش فرض، Bazel به طور خودکار CcToolchainConfigInfo را برای ساخت شما پیکربندی می کند، اما شما می توانید آن را به صورت دستی پیکربندی کنید. برای آن، به یک قانون Starlark نیاز دارید که CcToolchainConfigInfo را ارائه میکند و باید ویژگی toolchain_config cc_toolchain را به قانون خود اشاره کنید. می توانید با فراخوانی CcToolchainConfigInfo cc_common.create_cc_toolchain_config_info() را ایجاد کنید. میتوانید سازندههای Starlark را برای همه ساختارهایی که در این فرآیند به آنها نیاز دارید، در @rules_cc//cc:cc_toolchain_config_lib.bzl کنید.
هنگامی که یک هدف ++C وارد فاز تجزیه و تحلیل می شود، Bazel هدف cc_toolchain مناسب را بر اساس فایل BUILD انتخاب می کند و ارائه دهنده CcToolchainConfigInfo را از هدف مشخص شده در ویژگی cc_toolchain.toolchain_config می کند. هدف cc_toolchain این اطلاعات را از طریق یک CcToolchainProvider به هدف C++ ارسال می کند.
به عنوان مثال، یک اقدام کامپایل یا پیوند، که توسط قاعدهای مانند cc_binary یا cc_library ، به اطلاعات زیر نیاز دارد:
- کامپایلر یا پیوند دهنده مورد استفاده
- پرچم های خط فرمان برای کامپایلر/لینکر
- پرچم های پیکربندی از میان گزینه های
--copt/--linkoptمی کند - متغیرهای محیطی
- مصنوعات مورد نیاز در جعبه شنی که در آن اکشن اجرا می شود
تمام اطلاعات بالا به جز مصنوعات مورد نیاز در جعبه شنی در هدف Starlark که cc_toolchain به آن اشاره می کند مشخص شده است.
مصنوعاتی که باید به sandbox ارسال شوند در هدف cc_toolchain اعلام شده اند. برای مثال، با ویژگی cc_toolchain.linker_files میتوانید کتابخانههای باینری و زنجیره ابزار پیوند دهنده را برای ارسال به sandbox مشخص کنید.
انتخاب زنجیره ابزار
منطق انتخاب زنجیره ابزار به صورت زیر عمل می کند:
کاربر یک هدف
cc_toolchain_suiteرا در فایلBUILDمشخص می کند و Bazel را با استفاده از گزینه--crosstool_topبه هدف نشان می دهد.هدف
cc_toolchain_suiteبه چندین زنجیره ابزار اشاره دارد. مقادیر پرچمهای--cpuو--compilerتعیین میکنند که کدام یک از آن زنجیرههای ابزار انتخاب شده است، یا فقط بر اساس مقدار پرچم--cpuیا بر اساس یک--cpu | --compiler-- ارزش--cpu | --compiler. مراحل انتخاب به شرح زیر است:اگر گزینه
--compilerمشخص شده باشد، Bazel ورودی مربوطه را از ویژگیcc_toolchain_suite.toolchainsبا--cpu | --compiler. اگر بازل ورودی مربوطه را پیدا نکند، خطا می دهد.اگر گزینه
--compilerمشخص نشده باشد، Bazel ورودی مربوطه را از ویژگیcc_toolchain_suite.toolchainsفقط با--cpuمی کند.اگر هیچ پرچمی مشخص نشده باشد،
--cpuسیستم میزبان را بررسی می کند و بر اساس یافته های خود یک مقدار cpu- را انتخاب می کند. کد مکانیسم بازرسی را ببینید.
هنگامی که یک زنجیره ابزار انتخاب شد، feature متناظر و اشیاء action_config در قانون Starlark بر پیکربندی ساخت (یعنی مواردی که بعدا توضیح داده می شوند) نظارت می کنند. این پیامها امکان پیادهسازی ویژگیهای C++ را در Bazel بدون تغییر باینری Bazel میدهند. قوانین C++ چندین عمل منحصر به فرد را که با جزئیات در کد منبع Bazel مستند شده است پشتیبانی می کند.
امکانات
یک ویژگی موجودیتی است که به پرچم های خط فرمان، اقدامات، محدودیت های محیط اجرا یا تغییرات وابستگی نیاز دارد. یک ویژگی می تواند به سادگی اجازه دادن به فایل های BUILD برای انتخاب پیکربندی پرچم ها، مانند treat_warnings_as_errors ، یا تعامل با قوانین C++ و شامل اعمال کامپایل جدید و ورودی های کامپایل، مانند header_modules یا thin_lto باشد.
در حالت ایدهآل، CcToolchainConfigInfo حاوی لیستی از ویژگیها است، که در آن هر ویژگی از یک یا چند گروه پرچم تشکیل شده است، که هر کدام فهرستی از پرچمها را تعریف میکنند که برای اقدامات خاص Bazel اعمال میشوند.
یک ویژگی با نام مشخص شده است که امکان جداسازی کامل پیکربندی قانون Starlark از نسخه های Bazel را فراهم می کند. به عبارت دیگر، نسخه Bazel بر رفتار پیکربندیهای CcToolchainConfigInfo تا زمانی که این پیکربندیها به استفاده از ویژگیهای جدید نیاز نداشته باشند.
یک ویژگی به یکی از روش های زیر فعال می شود:
- فیلد
enabledاین ویژگی رویtrueتنظیم شده است. - Bazel یا صاحب قانون به صراحت آن را فعال می کند.
- کاربر آن را از طریق گزینه
--featureیاfeaturesrule rule فعال می کند.
ویژگیها میتوانند وابستگیهای متقابل داشته باشند، به پرچمهای خط فرمان، تنظیمات فایل BUILD و سایر متغیرها بستگی دارند.
روابط ویژگی
وابستگی ها معمولاً مستقیماً با Bazel مدیریت می شوند، که به سادگی الزامات را اعمال می کند و تضادهای ذاتی مربوط به ماهیت ویژگی های تعریف شده در ساخت را مدیریت می کند. مشخصات زنجیره ابزار اجازه می دهد تا محدودیت های دانه ای بیشتری برای استفاده مستقیم در قانون Starlark وجود داشته باشد که بر پشتیبانی و گسترش ویژگی ها نظارت می کند. اینها هستند:
| محدودیت | شرح |
requires = [
feature_set (features = [
'feature-name-1',
'feature-name-2'
]),
] | سطح ویژگی. این ویژگی تنها در صورتی پشتیبانی می شود که ویژگی های مورد نیاز مشخص شده فعال باشند. به عنوان مثال، زمانی که یک ویژگی فقط در حالتهای ساخت خاصی پشتیبانی میشود ( opt ، dbg ، یا fastbuild ). اگر «نیازمند» شامل «مجموعه_ویژگی»های متعدد باشد، در صورت برآورده شدن هر یک از «مجموعه_ویژگی ها» (زمانی که همه ویژگی های مشخص شده فعال باشند) این ویژگی پشتیبانی می شود. |
implies = ['feature'] | سطح ویژگی. این ویژگی بر ویژگی(های) مشخص شده دلالت دارد. فعال کردن یک ویژگی همچنین به طور ضمنی تمام ویژگی های ضمنی آن را فعال می کند (یعنی به صورت بازگشتی عمل می کند). همچنین توانایی فاکتورسازی زیرمجموعه های مشترک عملکرد را از مجموعه ای از ویژگی ها، مانند قسمت های مشترک ضدعفونی کننده ها، فراهم می کند. ویژگی های ضمنی را نمی توان غیرفعال کرد. |
provides = ['feature'] | سطح ویژگی. نشان می دهد که این ویژگی یکی از چندین ویژگی جایگزین متقابل است. به عنوان مثال، همه ضدعفونی کننده ها می توانند اگر کاربر دو یا چند ویژگی متقابل منحصر به فرد را همزمان بخواهد، با فهرست کردن گزینههای جایگزین، مدیریت خطا را بهبود میبخشد. |
with_features = [
with_feature_set(
features = ['feature-1'],
not_features = ['feature-2'],
),
] | سطح تنظیم پرچم یک ویژگی می تواند مجموعه پرچم های متعدد را با چندگانه مشخص کند. وقتی with_features مشخص شده باشد، مجموعه پرچم تنها در صورتی به دستور build گسترش مییابد که حداقل یک with_feature_set وجود داشته باشد که تمام ویژگیهای مجموعه features مشخصشده برای آن فعال باشد، و همه ویژگیهای مشخصشده در مجموعه not_features غیرفعال باشند. اگر with_features مشخص نشده باشد، مجموعه پرچم بدون قید و شرط برای هر اقدام مشخص شده اعمال می شود. |
اقدامات
کنشها انعطافپذیری را برای تغییر شرایطی که تحت آن یک کنش اجرا میشود، بدون فرض اینکه آن عمل چگونه اجرا میشود، فراهم میکند. یک action_config ابزار باینری را مشخص میکند که یک عمل فراخوانی میکند، در حالی که یک feature پیکربندی (پرچمها) را مشخص میکند که نحوه رفتار آن ابزار را هنگام فراخوانی عمل مشخص میکند.
دارای اقدامات مرجع برای سیگنال دادن به اقدامات Bazel که آنها بر آنها تأثیر می گذارند زیرا اقدامات می توانند نمودار عملکرد Bazel را تغییر دهند. ارائهدهنده CcToolchainConfigInfo شامل اقداماتی است که دارای پرچمها و ابزارهای مرتبط با آنها است، مانند c++-compile . پرچمها با مرتبط کردن آنها با یک ویژگی به هر عمل اختصاص داده میشوند.
هر نام اقدام نشان دهنده یک نوع عمل است که توسط Bazel انجام می شود، مانند کامپایل یا پیوند دادن. با این حال، یک رابطه چند به یک بین اکشن ها و انواع کنش های Bazel وجود دارد، که در آن نوع عمل Bazel به یک کلاس جاوا اشاره دارد که یک عمل را اجرا می کند (مانند CppCompileAction ). به طور خاص، "اقدامات اسمبلر" و "عملکردهای کامپایلر" در جدول زیر CppCompileAction هستند، در حالی که اقدامات پیوند CppLinkAction هستند.
اقدامات مونتاژ کننده
| عمل | شرح |
preprocess-assemble | با پیش پردازش جمع آوری کنید. به طور معمول برای فایل های .S . |
assemble | بدون پیش پردازش مونتاژ کنید. معمولا برای فایل های .s . |
اقدامات کامپایلر
| عمل | شرح |
cc-flags-make-variable | CC_FLAGS را در ژانرها منتشر می کند. |
c-compile | کامپایل به صورت C. |
c++-compile | کامپایل به صورت C++. |
c++-header-parsing | تجزیه کننده کامپایلر را روی یک فایل هدر اجرا کنید تا اطمینان حاصل کنید که هدر مستقل است، زیرا در غیر این صورت خطاهای کامپایل ایجاد می کند. فقط برای زنجیرههای ابزاری که ماژولها را پشتیبانی میکنند کاربرد دارد. |
پیوند اقدامات
| عمل | شرح |
c++-link-dynamic-library | یک کتابخانه مشترک حاوی تمام وابستگی های آن را پیوند دهید. |
c++-link-nodeps-dynamic-library | پیوند یک کتابخانه مشترک فقط حاوی منابع cc_library . |
c++-link-executable | یک کتابخانه آماده نهایی را پیوند دهید. |
اقدامات AR
کنشهای AR فایلهای شی را از طریق ar در کتابخانههای آرشیو (فایلهای a.) جمعآوری میکنند و برخی از .a را در نام رمزگذاری میکنند.
| عمل | شرح |
c++-link-static-library | یک کتابخانه ثابت (بایگانی) ایجاد کنید. |
اقدامات LTO
| عمل | شرح |
lto-backend | اقدام ThinLTO کامپایل بیت کدها در اشیاء بومی. |
lto-index | اقدام ThinLTO که شاخص جهانی ایجاد می کند. |
با استفاده از action_config
action_config یک ساختار Starlark است که یک عمل Bazel را با تعیین ابزار (باینری) برای فراخوانی در طول عمل و مجموعههایی از پرچمها که توسط ویژگیها تعریف میشوند، توصیف میکند. این پرچم ها محدودیت هایی را برای اجرای عمل اعمال می کنند.
action_config() دارای پارامترهای زیر است:
| صفت | شرح |
action_name | عمل بازل که این عمل با آن مطابقت دارد. Bazel از این ویژگی برای کشف ابزار هر اقدام و الزامات اجرا استفاده می کند. |
tools | قابل اجرا برای فراخوانی. ابزار اعمال شده بر روی اکشن، اولین ابزار در لیست با مجموعه ویژگی هایی خواهد بود که با پیکربندی ویژگی مطابقت دارد. مقدار پیش فرض باید ارائه شود. |
flag_sets | فهرستی از پرچمها که برای گروهی از اقدامات اعمال میشود. همانند یک ویژگی. |
env_sets | لیستی از محدودیت های محیطی که برای گروهی از اقدامات اعمال می شود. همانند یک ویژگی. |
یک action_config میتواند به ویژگیها و action_config های دیگری نیاز داشته باشد و دلالت بر آن داشته باشد که توسط روابط ویژگی که قبلاً توضیح داده شد دیکته شده است. این رفتار شبیه به یک ویژگی است.
دو ویژگی آخر در برابر ویژگیهای مربوطه در ویژگیها اضافی هستند و گنجانده شدهاند زیرا برخی از اقدامات Bazel به پرچمها یا متغیرهای محیطی خاصی نیاز دارند و هدف جلوگیری از جفتهای غیرضروری action_config + feature است. به طور معمول، اشتراک گذاری یک ویژگی واحد در چندین action_config ترجیح داده می شود.
شما نمی توانید بیش از یک action_config را با یک action_name در یک زنجیره ابزار تعریف کنید. این امر از ابهام در مسیرهای ابزار جلوگیری میکند و این هدف را در پشت action_config - اینکه ویژگیهای یک عمل به وضوح در یک مکان در زنجیره ابزار توضیح داده میشوند.
با استفاده از سازنده ابزار
یک action_config می تواند مجموعه ای از ابزارها را از طریق پارامتر tools خود مشخص کند. سازنده tool() پارامترهای زیر را می گیرد:
| رشته | شرح |
tool_path | مسیر ابزار مورد نظر (نسبت به مکان فعلی). |
with_features | لیستی از مجموعه ویژگی هایی که حداقل یکی از آنها باید برای اعمال این ابزار راضی باشد. |
برای یک action_config معین، تنها یک tool مسیر ابزار و الزامات اجرای خود را برای اکشن Bazel اعمال میکند. یک ابزار با تکرار از طریق ویژگی tools در یک action_config تا زمانی که ابزاری با مجموعه with_feature مطابق با پیکربندی ویژگی پیدا شود (برای اطلاعات بیشتر به روابط ویژگیها قبلاً در این صفحه مراجعه کنید). شما باید لیست ابزار خود را با یک ابزار پیش فرض که مربوط به پیکربندی ویژگی خالی است پایان دهید.
مثال استفاده
ویژگیها و اقدامات را میتوان با هم برای پیادهسازی اکشنهای Bazel با معناشناسی متقابل پلتفرم مختلف استفاده کرد. به عنوان مثال، تولید نماد اشکال زدایی در macOS نیازمند تولید نمادها در عمل کامپایل، سپس فراخوانی یک ابزار تخصصی در حین عمل پیوند برای ایجاد بایگانی فشرده dsym، و سپس خارج کردن آن بایگانی برای تولید بسته نرم افزاری و فایل های .plist قابل مصرف توسط Xcode است.
با Bazel، این فرآیند می تواند به صورت زیر پیاده سازی شود، با unbundle-debuginfo یک عمل Bazel است:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
config_name = ACTION_NAMES.cpp_link_executable,
action_name = ACTION_NAMES.cpp_link_executable,
tools = [
tool(
with_features = [
with_feature(features=["generate-debug-symbols"]),
],
tool_path = "toolchain/mac/ld-with-dsym-packaging",
),
tool (tool_path = "toolchain/mac/ld"),
],
),
]
features = [
feature(
name = "generate-debug-symbols",
flag_sets = [
flag_set (
actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile
],
flag_groups = [
flag_group(
flags = ["-g"],
),
],
)
],
implies = ["unbundle-debuginfo"],
),
]
همین ویژگی را می توان به طور کاملا متفاوت برای لینوکس، که از fission استفاده می کند، یا برای ویندوز، که فایل های .pdb را تولید می کند، پیاده سازی کرد. به عنوان مثال، پیاده سازی برای تولید نماد اشکال زدایی مبتنی بر fission ممکن است به صورت زیر باشد:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
name = ACTION_NAMES.cpp_compile,
tools = [
tool(
tool_path = "toolchain/bin/gcc",
),
],
),
]
features = [
feature (
name = "generate-debug-symbols",
requires = [with_feature_set(features = ["dbg"])],
flag_sets = [
flag_set(
actions = [ACTION_NAMES.cpp_compile],
flag_groups = [
flag_group(
flags = ["-gsplit-dwarf"],
),
],
),
flag_set(
actions = [ACTION_NAMES.cpp_link_executable],
flag_groups = [
flag_group(
flags = ["-Wl", "--gdb-index"],
),
],
),
],
),
]
گروه های پرچم
CcToolchainConfigInfo به شما امکان می دهد پرچم ها را در گروه هایی قرار دهید که هدف خاصی را دنبال می کنند. شما می توانید یک پرچم را با استفاده از متغیرهای از پیش تعریف شده در مقدار پرچم مشخص کنید، که کامپایلر هنگام افزودن پرچم به دستور ساخت، آن را گسترش می دهد. مثلا:
flag_group (
flags = ["%{output_file_path}"],
)
در این صورت محتویات پرچم با مسیر فایل خروجی اکشن جایگزین می شود.
گروه های پرچم به ترتیبی که در لیست ظاهر می شوند، از بالا به پایین، از چپ به راست به دستور ساخت گسترش می یابند.
برای پرچم هایی که نیاز به تکرار با مقادیر مختلف هنگام اضافه شدن به دستور ساخت دارند، گروه پرچم می تواند متغیرهای نوع list را تکرار کند. به عنوان مثال، متغیر include_path از نوع list :
flag_group (
iterate_over = "include_paths",
flags = ["-I%{include_paths}"],
)
برای هر عنصر مسیر در لیست include_paths به -I<path> گسترش می یابد. همه پرچمها (یا flag_group ) در بدنه یک اعلامیه گروه پرچم به عنوان یک واحد گسترش مییابند. مثلا:
flag_group (
iterate_over = "include_paths",
flags = ["-I", "%{include_paths}"],
)
برای هر عنصر مسیر در لیست include_paths به -I <path> گسترش می یابد.
یک متغیر می تواند چندین بار تکرار شود. مثلا:
flag_group (
iterate_over = "include_paths",
flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)
گسترش می یابد به:
-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
متغیرها می توانند با ساختارهای قابل دسترسی با استفاده از علامت نقطه مطابقت داشته باشند. مثلا:
flag_group (
flags = ["-l%{libraries_to_link.name}"],
)
سازه ها می توانند تودرتو باشند و همچنین ممکن است دارای توالی باشند. برای جلوگیری از تداخل نام و صریح بودن، باید مسیر کامل را از طریق فیلدها مشخص کنید. مثلا:
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
],
)
گسترش مشروط
گروههای پرچم از بسط شرطی بر اساس وجود یک متغیر خاص یا فیلد آن با استفاده از expand_if_available ، expand_if_not_available ، expand_if_true ، expand_if_false یا expand_if_equal میکنند. مثلا:
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flag_groups = [
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--whole_archive"],
),
flag_group (
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--no_whole_archive"],
),
],
),
],
)
مرجع ccToolchainConfigInfo
این بخش مرجعی از متغیرهای ساخت، ویژگی ها و سایر اطلاعات مورد نیاز برای پیکربندی موفقیت آمیز قوانین C++ را ارائه می دهد.
متغیرهای ساخت ccToolchainConfigInfo
در زیر مرجعی از متغیرهای ساخت CcToolchainConfigInfo است.
| متغیر | عمل | شرح |
source_file | گردآوری | فایل منبع برای کامپایل. |
input_file | نوار | مصنوع برای برهنه کردن. |
output_file | گردآوری | خروجی کامپایل. |
output_assembly_file | گردآوری | فایل اسمبلی ارسال شده فقط زمانی اعمال می شود که عمل compile متن اسمبلی را منتشر می کند، معمولاً هنگام استفاده از پرچم --save_temps . محتویات مانند output_file است. |
output_preprocess_file | گردآوری | خروجی از پیش پردازش شده فقط برای کامپایلهایی اعمال میشود که فقط فایلهای منبع را پیش پردازش میکنند، معمولاً هنگام استفاده از پرچم --save_temps . محتویات مانند output_file است. |
includes | گردآوری | دنباله فایل هایی که کامپایلر باید بدون قید و شرط در منبع کامپایل شده قرار دهد. |
include_paths | گردآوری | دایرکتوری های دنباله ای که در آن کامپایلر سرصفحه هایی را جستجو می کند که شامل #include<foo.h> و #include "foo.h" می شود. |
quote_include_paths | گردآوری | دنباله ای از -iquote شامل - دایرکتوری هایی است که در آنها کامپایلر سرصفحه های شامل #include "foo.h" می کند. |
system_include_paths | گردآوری | دنباله ای از -isystem شامل - دایرکتوری هایی است که در آنها کامپایلر سرصفحه های موجود را با استفاده از #include <foo.h> می کند. |
dependency_file | گردآوری | فایل وابستگی .d که توسط کامپایلر تولید می شود. |
preprocessor_defines | گردآوری | دنباله ای از defines ها مانند --DDEBUG . |
pic | گردآوری | خروجی را به صورت کد مستقل از موقعیت کامپایل می کند. |
gcov_gcno_file | گردآوری | فایل پوشش gcov . |
per_object_debug_info_file | گردآوری | فایل اطلاعات اشکال زدایی هر شی ( .dwp ). |
stripotps | نوار | دنباله ای از stripopts . |
legacy_compile_flags | گردآوری | دنباله ای از پرچم ها از فیلدهای CROSSTOOL قدیمی مانند compiler_flag ، optional_compiler_flag ، cxx_flag ، و optional_cxx_flag . |
user_compile_flags | گردآوری | دنباله ای از پرچم ها از ویژگی copt rule یا پرچم های --copt ، --cxxopt و --conlyopt . |
unfiltered_compile_flags | گردآوری | دنباله ای از پرچم ها از قسمت unfiltered_cxx_flag میراث CROSSTOOL یا ویژگی unfiltered_compile_flags . اینها با ویژگی قانون nocopts فیلتر نمی شوند. |
sysroot | sysroot . | |
runtime_library_search_directories | ارتباط دادن | ورودیهای مسیر جستجوی زمان اجرا پیوند دهنده (معمولاً با پرچم -rpath تنظیم میشوند). |
library_search_directories | ارتباط دادن | ورودی های مسیر جستجوی پیوند دهنده (معمولاً با پرچم -L تنظیم می شود). |
libraries_to_link | ارتباط دادن | پرچمگذاری فایلها برای پیوند به عنوان ورودی در فراخوانی پیونددهنده. |
def_file_path | ارتباط دادن | محل فایل def مورد استفاده در ویندوز با MSVC. |
linker_param_file | ارتباط دادن | محل فایل param پیوند دهنده ایجاد شده توسط bazel برای غلبه بر محدودیت طول خط فرمان. |
output_execpath | ارتباط دادن | مسیر اجرایی خروجی پیوند دهنده. |
generate_interface_library | ارتباط دادن | "yes" یا "no" بسته به اینکه آیا کتابخانه رابط باید تولید شود. |
interface_library_builder_path | ارتباط دادن | مسیر ابزار سازنده کتابخانه رابط. |
interface_library_input_path | ارتباط دادن | ورودی برای ابزار سازنده کتابخانه رابط ifso . |
interface_library_output_path | ارتباط دادن | مسیری که برای ایجاد کتابخانه رابط با استفاده از ابزار ifso builder. |
legacy_link_flags | ارتباط دادن | پرچمهای پیوند دهنده که از فیلدهای قدیمی CROSSTOOL . |
user_link_flags | ارتباط دادن | پرچم های پیوند دهنده که از ویژگی --linkopt یا linkopts می آیند. |
linkstamp_paths | ارتباط دادن | یک متغیر ساخت که مسیرهای لینک استپ را ارائه می دهد. |
force_pic | ارتباط دادن | وجود این متغیر نشان می دهد که کد PIC/PIE باید تولید شود (گزینه Bazel `--force_pic` پاس شد). |
strip_debug_symbols | ارتباط دادن | وجود این متغیر نشان می دهد که نمادهای اشکال زدایی باید حذف شوند. |
is_cc_test | ارتباط دادن | درست زمانی که اقدام فعلی یک اقدام پیوند cc_test باشد، در غیر این صورت نادرست است. |
is_using_fission | کامپایل، پیوند دادن | وجود این متغیر نشان می دهد که شکافت (اطلاعات اشکال زدایی هر شی) فعال شده است. اطلاعات اشکالزدایی به جای فایلهای .o در فایلهای .dwo خواهد بود و کامپایلر و پیوند دهنده باید این را بدانند. |
fdo_instrument_path | کامپایل، پیوند دادن | مسیر به دایرکتوری که نمایه ابزار دقیق FDO را ذخیره می کند. |
fdo_profile_path | گردآوری | مسیر به نمایه FDO |
fdo_prefetch_hints_path | گردآوری | مسیر به نمایه واکشی اولیه حافظه پنهان. |
csfdo_instrument_path | کامپایل، پیوند دادن | مسیری به دایرکتوری که نمایه ابزار دقیق FDO حساس به زمینه را ذخیره می کند. |
ویژگی های شناخته شده
در زیر به ویژگی ها و شرایط فعال سازی آنها اشاره می شود.
| ویژگی | مستندات |
opt | dbg | fastbuild | به طور پیش فرض بر اساس حالت کامپایل فعال می شود. |
static_linking_mode | dynamic_linking_mode | به طور پیش فرض بر اساس حالت پیوند فعال است. |
per_object_debug_info | اگر ویژگی supports_fission مشخص و فعال باشد و حالت کامپایل فعلی در پرچم --fission مشخص شده باشد فعال می شود. |
supports_start_end_lib | اگر فعال باشد (و گزینه --start_end_lib تنظیم شده باشد)، Bazel در برابر کتابخانه های ثابت پیوند نمی دهد، بلکه از گزینه های پیوند دهنده --start-lib/--end-lib برای پیوند مستقیم با اشیا استفاده می کند. این امر باعث افزایش سرعت ساخت می شود زیرا Bazel نیازی به ساخت کتابخانه های ثابت ندارد. |
supports_interface_shared_libraries | اگر فعال باشد (و گزینه --interface_shared_objects تنظیم شده باشد)، Bazel اهدافی را که linkstatic تنظیم شده اند به False (به طور پیش فرض cc_test s) با کتابخانه های مشترک رابط پیوند می دهد. این باعث می شود که پیوند مجدد افزایشی سریعتر شود. |
supports_dynamic_linker | اگر فعال باشد، قوانین C++ متوجه میشوند که زنجیره ابزار میتواند کتابخانههای مشترک تولید کند. |
static_link_cpp_runtimes | اگر فعال باشد، Bazel زمان اجرا C++ را به صورت ایستا در حالت پیوند استاتیک و به صورت پویا در حالت پیوند پویا پیوند می دهد. مصنوعات مشخص شده در ویژگی cc_toolchain.static_runtime_lib یا cc_toolchain.dynamic_runtime_lib (بسته به حالت پیوند) به اقدامات پیوند اضافه خواهند شد. |
supports_pic | اگر فعال باشد، زنجیره ابزار می داند که از اشیاء PIC برای کتابخانه های پویا استفاده کند. هر زمان که نیاز به کامپایل PIC باشد، متغیر «pic» وجود دارد. اگر به طور پیشفرض فعال نباشد و «--force_pic» تصویب شود، Bazel «supports_pic» را درخواست میکند و فعال بودن ویژگی را تأیید میکند. اگر این ویژگی وجود ندارد، یا نمیتوان آن را فعال کرد، «--force_pic» نمیتواند استفاده شود. |
static_linking_mode | dynamic_linking_mode | به طور پیش فرض بر اساس حالت پیوند فعال است. |
no_legacy_features | از افزودن ویژگیهای قدیمی به پیکربندی C++ در زمان حضور Bazel جلوگیری میکند. لیست کامل ویژگی ها را در زیر مشاهده کنید. |
ویژگی های میراث وصله منطقی
Bazel تغییرات زیر را در ویژگی های زنجیره ابزار برای سازگاری به عقب اعمال می کند:
- ویژگی
legacy_compile_flagsرا به بالای زنجیره ابزار منتقل می کند - ویژگی
default_compile_flagsرا به بالای زنجیره ابزار منتقل می کند - ویژگی
dependency_file(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند - ویژگی
pic(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
per_object_debug_info(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند - ویژگی
preprocessor_defines(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند - افزودن
includesویژگی (اگر موجود نباشد) به بالای زنجیره ابزار است -
include_paths(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
fdo_instrument(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
fdo_optimize(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
cs_fdo_instrument(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
cs_fdo_optimize(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
fdo_prefetch_hints(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
autofdo(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
build_interface_libraries(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند - ویژگی
dynamic_library_linker_tool(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند. -
shared_flag(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
linkstamps(در صورت عدم وجود) را به بالای زنجیره ابزار اضافه می کند -
output_execpath_flags(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
runtime_library_search_directories(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند. -
library_search_directories(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند - ویژگی
archiver_flags(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند - ویژگی
libraries_to_link(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
force_pic_flags(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
user_link_flags(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
legacy_link_flags(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
static_libgcc(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
fission_support(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
strip_debug_symbols(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند. - ویژگی
coverage(در صورت عدم وجود) را به بالای زنجیره ابزار اضافه می کند -
llvm_coverage_map_format(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
gcc_coverage_map_format(اگر موجود نباشد) را به بالای زنجیره ابزار اضافه می کند -
fully_static_link(اگر موجود نباشد) را به پایین زنجیره ابزار اضافه می کند -
user_compile_flags(در صورت عدم وجود) را به پایین زنجیره ابزار اضافه می کند -
sysroot(اگر موجود نباشد) را به پایین زنجیره ابزار اضافه می کند - ویژگی
unfiltered_compile_flags(اگر موجود نباشد) را به پایین زنجیره ابزار اضافه می کند. -
linker_param_file(اگر موجود نباشد) را به پایین زنجیره ابزار اضافه می کند - ویژگی
compiler_input_flags(اگر موجود نباشد) را به پایین زنجیره ابزار اضافه می کند - ویژگی
compiler_output_flags(اگر موجود نباشد) را به پایین زنجیره ابزار اضافه می کند
این یک لیست طولانی از ویژگی ها است. برنامه این است که پس از اتمام Crosstool در Starlark از شر آنها خلاص شوید. برای خواننده کنجکاو، پیاده سازی را در CppActionConfigs ببینید ، و برای زنجیره های ابزار تولید، اضافه کردن no_legacy_features را در نظر بگیرید تا زنجیره ابزار مستقل تر شود.