مجموعات التنفيذ

تتيح مجموعات التنفيذ منصات تنفيذ متعددة ضمن هدف واحد. ولكل مجموعة من مجموعات التنفيذ ارتباطاتها الخاصة على toolchain، كما أنها تُجري دقة سلسلة الأدوات الخاصة بها.

الخلفية

وتسمح مجموعات التنفيذ لمؤلف القاعدة بتحديد مجموعات من الإجراءات، لكل منها منصّة تنفيذ محتملة. يمكن أن تتيح منصّات التنفيذ المتعددة تنفيذ الإجراءات بشكل مختلف، مثل تجميع تطبيق iOS على مشغّل عن بُعد (نظام التشغيل Linux)، ثم ربط التوقيع/الرمز الخاص بعامل تشغيل Mac محلي.

تساعد إمكانية تحديد مجموعات من الإجراءات أيضًا في تخفيف استخدام الإجراءات كخادم وكيل لتحديد الإجراءات. ولا نضمن لك أن تكون وسائل الاستدلال فريدة ويمكن أن تشير إلى إجراء واحد فقط. ويُعدّ هذا الإجراء مفيدًا على وجه الخصوص في تخصيص موارد إضافية لذاكرة معيّنة ومعالجة إجراءات مكثّفة مثل ربط إصدارات C++ بدون تخصيص زائد للمهام الأكثر أهمية.

تعريف مجموعات التنفيذ

أثناء تعريف القاعدة، يمكن للمؤلفين تحديد مجموعة من مجموعات التنفيذ. في كل مجموعة تنفيذ، يمكن لمؤلف القاعدة تحديد كل ما يلزم لاختيار نظام أساسي للتنفيذ لمجموعة التنفيذ هذه، وتحديدًا أي قيود عبر exec_compatible_with وأنواع سلاسل الأدوات عبر toolchain.

# foo.bzl
my_rule = rule(
    _impl,
    exec_groups = {
        “link”: exec_group(
            exec_compatible_with = [ "@platforms//os:linux" ]
            toolchains = ["//foo:toolchain_type"],
        ),
        “test”: exec_group(
            toolchains = ["//foo_tools:toolchain_type"],
        ),
    },
    attrs = {
        "_compiler": attr.label(cfg = config.exec("link"))
    },
)

في مقتطف الرمز أعلاه، يمكنك أن ترى أيضًا أن تبعيات الأداة يمكن أن تحدد أيضًا نقل مجموعة تنفيذ تنفيذ باستخدام معلمة سمة cfg ووحدة config. تعرِض الوحدة دالة exec التي تستخدِم معلّمة سلسلة واحدة، وهي اسم مجموعة التنفيذ التي يجب أن تعتمد عليها الاعتمادية.

كما هو الحال مع القواعد الأصلية، تتوفّر مجموعة تنفيذ test تلقائيًا في قواعد اختبار Starlark.

توريث مجموعة التنفيذ

بالإضافة إلى تحديد القيود وسلاسل الأدوات الخاصة بها، يمكن لمجموعة التنفيذ الجديدة الإعلان عن أنها ترغب في اكتساب الإعدادات من مجموعة التنفيذ التلقائية للقاعدة، من خلال تمرير المعلمة copy_from_rule = True. خطأ في ضبط copy_from_rule على "صحيح" وتمرير exec_compatible_with أو toolchains أيضًا.

مجموعة التنفيذ المكتسَبة من النُسخ التلقائية لمجموعة التنفيذ، والتي تخضع للقيود وسلاسل الأدوات وخصائص التنفيذ من الإعداد التلقائي. ويتضمّن ذلك القيود وخصائص التنفيذ التي تم ضبطها على مستوى الاستهداف، وليس فقط القيود التي حدّدتها القاعدة نفسها. بمعنى آخر، نظرًا لما يلي:

# foo.bzl
my_rule = rule(
    _impl,
    exec_groups = {
        “copied”: exec_group(
            copy_from_rule = True,
            # This will inherit exec_compatible_with and toolchains.
            # Setting them here directly would be an error, however.
        ),
    },
    toolchains = ["//foo_tools:toolchain_type"],
    exec_compatible_with = ["@platforms//os:linux"],
)

# BUILD

my_rule(
    name = "demo",
    exec_compatible_with = [":local_constraint"],
)

ستتضمّن مجموعة تنفيذ copied للهدف demo الذي تم ضبطه كل ما يلي: - //fool_tools:toolchain_type - @platforms//os:linux - :local_constraint

الوصول إلى مجموعات التنفيذ

في تنفيذ القاعدة، يمكنك الإعلان بأنه يجب تشغيل الإجراءات على النظام الأساسي للتنفيذ لمجموعة تنفيذ. ويمكنك إجراء ذلك باستخدام معلَمة exec_group لإنشاء إجراءات، وخاصةً ctx.actions.run و ctx.actions.run_shell.

# foo.bzl
def _impl(ctx):
  ctx.actions.run(
     inputs = [ctx.attr._some_tool, ctx.srcs[0]]
     exec_group = "compile",
     # ...
  )

وسيتمكن مؤلفو القواعد أيضًا من الوصول إلى سلاسل الأدوات التي تم حلّها لمجموعات التنفيذ، كما هو الحال في كيفية الوصول إلى سلسلة الأدوات التي تم حلها:

# foo.bzl
def _impl(ctx):
  foo_info = ctx.exec_groups["link"].toolchains["//foo:toolchain_type"].fooinfo
  ctx.actions.run(
     inputs = [foo_info, ctx.srcs[0]]
     exec_group = "link",
     # ...
  )

استخدام مجموعات التنفيذ لتحديد مواقع التنفيذ

يتم دمج مجموعات التنفيذ مع السمة exec_properties المتوفّرة في كل قاعدة وتسمح للكاتب المستهدف بتحديد سلسلة سلسلة من الخصائص التي يتم تمريرها بعد ذلك إلى جهاز التنفيذ. على سبيل المثال، إذا أردت ضبط خاصية معيّنة، مثل الذاكرة، للهدف وامنح إجراءات معيّنة تخصيصًا أعلى للذاكرة، يمكنك كتابة إدخال exec_properties باستخدام مفتاح محسّن تنفيذ المجموعة، مثل:

# BUILD
my_rule(
    name = 'my_target',
    exec_properties = {
        'mem': '12g',
        'link.mem': '16g'
    }
    …
)

في كل الإجراءات التي تستخدم exec_group = "link"، يتم عرض قواميس التنفيذ بطريقة {"mem": "16g"}. كما ترى هنا، فإن الإعدادات على مستوى التنفيذ تلغي الإعدادات على مستوى الاستهداف.

مجموعات التنفيذ للقواعد الأصلية

تتوفّر مجموعات التنفيذ التالية للإجراءات المحدّدة من خلال القواعد الأصلية:

  • test: إجراءات تنفيذ الاختبار.
  • cpp_link: +C+ إجراءات الربط.

إنشاء مجموعات exec لتحديد خصائص exec

قد ترغب أحيانًا في استخدام مجموعة تنفيذ بتنسيق (exec) لمنح إجراءات تنفيذ محددة إجراءات مختلفة ولكن لا تحتاج في الواقع إلى سلاسل أدوات أو قيود مختلفة عن القاعدة. في هذه الحالات، يمكنك إنشاء مجموعات exec باستخدام معلمة copy_from_rule:

# foo.bzl

# Creating an exec group with `copy_from_rule=True` is the same as explicitly
# setting the exec group's toolchains and constraints to the same values as the
# rule's respective parameters.
my_rule = rule(
    _impl,
    exec_compatible_with = ["@platforms//os:linux"],
    toolchains = ["//foo:toolchain_type"],
    exec_groups = {
        # The following two groups have the same toolchains and constraints:
        “foo”: exec_group(copy_from_rule = True),
        "bar": exec_group(
            exec_compatible_with = ["@platforms//os:linux"],
            toolchains = ["//foo:toolchain_type"],
        ),
    },
)

#

مجموعات التنفيذ وخصائص تنفيذ النظام الأساسي

من الممكن تحديد exec_properties لمجموعات التنفيذ العشوائية على أهداف الأنظمة الأساسية (على عكس exec_properties التي تم ضبطها مباشرةً على هدف، حيث يتم رفض خصائص مجموعات التنفيذ غير المعروفة). وتكتسب الاستهدافات exec_propertiesالنظام الأساسي للتنفيذ، الذي يؤثر في مجموعة التنفيذ التلقائية وأي مجموعات تنفيذ أخرى ذات صلة.

على سبيل المثال، لنفترض أن إجراء اختبار C++ يتطلب توفر بعض الموارد، ولكنه ليس مطلوبًا للتجميع والربط، يمكن تصميم ذلك على النحو التالي:

constraint_setting(name = "resource")
constraint_value(name = "has_resource", constraint_setting = ":resource")

platform(
    name = "platform_with_resource",
    constraint_values = [":has_resource"],
    exec_properties = {
        "test.resource": "...",
    },
)

cc_test(
    name = "my_test",
    srcs = ["my_test.cc"],
    exec_compatible_with = [":has_resource"],
)

تكون للمعرّفات exec_properties المحدّدة مباشرةً في الاستهداف الأولوية على الأهداف الموروثة من النظام الأساسي للتنفيذ.