پیکربندی زنجیره ابزار C++

بررسی اجمالی

برای فراخوانی کامپایلر با گزینه‌های مناسب، 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 مشخص کنید.

انتخاب زنجیره ابزار

منطق انتخاب زنجیره ابزار به صورت زیر عمل می کند:

  1. کاربر یک هدف cc_toolchain_suite را در فایل BUILD مشخص می کند و Bazel را با استفاده از گزینه --crosstool_top به هدف نشان می دهد.

  2. هدف 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']

سطح ویژگی. نشان می دهد که این ویژگی یکی از چندین ویژگی جایگزین متقابل است. به عنوان مثال، همه ضدعفونی کننده ها می توانند provides = ["sanitizer"] مشخص کنند.

اگر کاربر دو یا چند ویژگی متقابل منحصر به فرد را همزمان بخواهد، با فهرست کردن گزینه‌های جایگزین، مدیریت خطا را بهبود می‌بخشد.

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 را در نظر بگیرید تا زنجیره ابزار مستقل تر شود.