در این صفحه نحوه ادغام با قوانین C++ در سطوح مختلف توضیح داده شده است.
دسترسی به زنجیره ابزار C++
به دلیل مهاجرت مداوم قوانین ++C به پلتفرمها و زنجیرههای ابزار، باید از تابع کمکی موجود در @bazel_tools//tools/cpp:toolchain_utils.bzl استفاده کنید، که هم زمانی که زنجیرههای ابزار غیرفعال و هم فعال هستند، کار میکند. برای وابستگی به زنجیره ابزار C++ در قانون خود، یک ویژگی Label
به نام _cc_toolchain
اضافه کنید و آن را به @bazel_tools//tools/cpp:current_cc_toolchain
(نمونهای از قانون cc_toolchain_alias
، که به زنجیره ابزار C++ انتخاب شده اشاره میکند) قرار دهید. سپس، در اجرای قانون، از find_cpp_toolchain(ctx)
برای دریافت CcToolchainInfo
استفاده کنید. یک مثال کار کامل را می توان در نمونه های rules_cc یافت.
ایجاد خطوط فرمان و متغیرهای محیطی با استفاده از زنجیره ابزار C++
به طور معمول، شما میتوانید با زنجیره ابزار C++ یکپارچه شوید تا پرچمهای خط فرمان مشابه قوانین C++ را داشته باشید، اما بدون استفاده مستقیم از اقدامات C++. این به این دلیل است که هنگام نوشتن اکشنهای خودمان، آنها باید با زنجیره ابزار C++ رفتار کنند - برای مثال، پرچمهای خط فرمان C++ را به ابزاری ارسال میکنند که کامپایلر C++ را در پشت صحنه فراخوانی میکند.
قوانین C++ از روش خاصی برای ساخت خطوط فرمان بر اساس پیکربندی ویژگی استفاده می کنند. برای ساخت یک خط فرمان به موارد زیر نیاز دارید:
-
features
وaction_configs
- اینها ازCcToolchainConfigInfo
آمده و درCcToolchainInfo
محصور شدهاند. -
FeatureConfiguration
- توسط cc_common.configure_features برگردانده شده است - متغیرهای پیکربندی زنجیره ابزار cc - توسط cc_common.create_compile_variables یا cc_common.create_link_variables برگردانده شده است.
هنوز گیرنده های مخصوص ابزار مانند compiler_executable وجود دارد. get_tool_for_action
را به اینها ترجیح دهید، زیرا گیرنده های خاص ابزار در نهایت حذف خواهند شد.
یک مثال کار کامل را می توان در نمونه های rules_cc یافت.
اجرای قوانین Starlark که به قوانین C++ و/یا قوانین C++ میتوانند به آن بستگی داشته باشند
اکثر قوانین ++C CcInfo
را ارائه میکنند، ارائهدهندهای حاوی CompilationContext
و LinkingContext
. از این طریق می توان به اطلاعاتی مانند تمام سرصفحه ها یا کتابخانه های انتقالی برای پیوند دسترسی پیدا کرد. قوانین CcToolchainInfo
سفارشی از CcInfo
و از CcToolchainInfo باید بتوانند تمام اطلاعات مورد نیاز خود را دریافت کنند.
اگر یک قانون سفارشی Starlark CcInfo
را ارائه دهد، این یک سیگنال به قوانین C++ است که میتوانند به آن وابسته باشند. با این حال، مراقب باشید - اگر فقط باید CcInfo
را از طریق نمودار به قانون باینری که سپس از آن استفاده میکند منتشر کنید، CcInfo
در ارائهدهنده دیگری قرار دهید. برای مثال، اگر قانون java_library
میخواهد وابستگیهای بومی را تا java_binary
کند، نباید CcInfo
را مستقیماً ارائه کند ( cc_binary
بسته به java_library
معنی ندارد)، باید آن را به عنوان مثال در JavaCcInfo
قرار دهد.
یک مثال کار کامل را می توان در نمونه های rules_cc یافت.
استفاده مجدد از منطق و اعمال قوانین C++
هنوز پایدار نیست؛ این بخش پس از تثبیت API به روز می شود. برای اطلاعات به روز شماره 4570 را دنبال کنید.