এক্সিকিউশন গ্রুপ

এক্সিকিউশন গ্রুপগুলি একক টার্গেটের মধ্যে একাধিক এক্সিকিউশন প্ল্যাটফর্মের অনুমতি দেয়। প্রতিটি এক্সিকিউশন গ্রুপের নিজস্ব টুলচেন নির্ভরতা রয়েছে এবং এটি নিজস্ব টুলচেন রেজোলিউশন সম্পাদন করে।

পটভূমি

এক্সিকিউশন গ্রুপগুলি নিয়ম লেখককে অ্যাকশনের সেট সংজ্ঞায়িত করার অনুমতি দেয়, প্রতিটি একটি সম্ভাব্য ভিন্ন এক্সিকিউশন প্ল্যাটফর্ম সহ। একাধিক এক্সিকিউশন প্ল্যাটফর্মগুলি বিভিন্নভাবে ক্রিয়া সম্পাদনের অনুমতি দিতে পারে, উদাহরণস্বরূপ একটি দূরবর্তী (লিনাক্স) কর্মীতে একটি iOS অ্যাপ কম্পাইল করা এবং তারপরে স্থানীয় ম্যাক ওয়ার্কারে লিঙ্ক/কোড সাইন করা।

কর্মের গোষ্ঠীগুলিকে সংজ্ঞায়িত করতে সক্ষম হওয়া কর্ম নির্দিষ্ট করার জন্য একটি প্রক্সি হিসাবে অ্যাকশন স্মৃতিবিদ্যার ব্যবহার হ্রাস করতে সহায়তা করে। স্মৃতিবিদ্যা অনন্য হওয়ার নিশ্চয়তা নেই এবং শুধুমাত্র একটি একক ক্রিয়া উল্লেখ করতে পারে। এটি নির্দিষ্ট মেমরিতে অতিরিক্ত সংস্থান বরাদ্দ করতে এবং কম চাহিদাপূর্ণ কাজগুলিতে অতিরিক্ত বরাদ্দ না করে C++ বিল্ডে লিঙ্ক করার মতো নিবিড় ক্রিয়াগুলি প্রক্রিয়াকরণে বিশেষভাবে সহায়ক।

মৃত্যুদন্ডের গোষ্ঠী সংজ্ঞায়িত করা

নিয়মের সংজ্ঞার সময়, নিয়ম লেখকরা মৃত্যুদন্ডের গোষ্ঠীর একটি সেট ঘোষণা করতে পারেন। প্রতিটি এক্সিকিউশন গ্রুপে, নিয়ম লেখক সেই এক্সিকিউশন গ্রুপের জন্য একটি এক্সিকিউশন প্ল্যাটফর্ম নির্বাচন করার জন্য প্রয়োজনীয় সবকিছু নির্দিষ্ট করতে পারেন, যেমন exec_compatible_with এর মাধ্যমে এবং toolchain মাধ্যমে exec_compatible_with ধরন।

# 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 গ্রুপের জন্য রূপান্তর নির্দিষ্ট করতে পারে। মডিউলটি একটি exec ফাংশন প্রকাশ করে যা একটি একক স্ট্রিং প্যারামিটার নেয় যা exec গ্রুপের নাম যার জন্য নির্ভরতা তৈরি করা উচিত।

নেটিভ নিয়ম অনুসারে, স্টারলার্ক পরীক্ষার নিয়মে ডিফল্টরূপে test কার্যকরী গ্রুপ উপস্থিত থাকে।

এক্সিকিউশন গ্রুপের উত্তরাধিকার

এর নিজস্ব সীমাবদ্ধতা এবং টুলচেন সংজ্ঞায়িত করার পাশাপাশি, একটি নতুন এক্সিকিউশন গ্রুপ ঘোষণা করতে পারে যে এটি নিয়মের ডিফল্ট এক্সিকিউশন গ্রুপ থেকে উত্তরাধিকারী হতে চায়, 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"],
)

কনফিগার করা টার্গেট demo জন্য copied করা এক্সিকিউশন গ্রুপে এই সমস্তগুলি অন্তর্ভুক্ত থাকবে: - //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 এন্ট্রি লিখবেন একটি execute-group-augmented key সহ:

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

exec_group = "link" সহ সমস্ত ক্রিয়াগুলি exec বৈশিষ্ট্য {"mem": "16g"} হিসাবে দেখতে পাবে। আপনি এখানে দেখতে পাচ্ছেন, এক্সিকিউশন-গ্রুপ-লেভেল সেটিংস লক্ষ্য-স্তরের সেটিংসকে ওভাররাইড করে।

দেশীয় নিয়মের জন্য মৃত্যুদন্ড গোষ্ঠী

স্থানীয় নিয়ম দ্বারা সংজ্ঞায়িত কর্মের জন্য নিম্নলিখিত মৃত্যুদন্ড গোষ্ঠী উপলব্ধ:

  • test : রানার অ্যাকশন পরীক্ষা করুন।
  • cpp_link : C++ লিঙ্কিং অ্যাকশন।

exec বৈশিষ্ট্য সেট করতে exec গ্রুপ তৈরি করা

কখনও কখনও আপনি নির্দিষ্ট ক্রিয়াগুলিকে বিভিন্ন exec বৈশিষ্ট্য দেওয়ার জন্য একটি exec গ্রুপ ব্যবহার করতে চান তবে আসলে নিয়মের চেয়ে আলাদা টুলচেইন বা সীমাবদ্ধতা চান না। এই পরিস্থিতিতে, আপনি copy_from_rule প্যারামিটার ব্যবহার করে exec গ্রুপ তৈরি করতে পারেন:

# 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 সরাসরি টার্গেটের উপর সংজ্ঞায়িত করা হয় যেগুলি এক্সিকিউশন প্ল্যাটফর্ম থেকে উত্তরাধিকারসূত্রে পাওয়া যায়।