بررسی اجمالی
برای فراخوانی کامپایلر با گزینههای مناسب، 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
یاfeatures
rule 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
را در نظر بگیرید تا زنجیره ابزار مستقل تر شود.