BazelCon 2022 16-17 নভেম্বর নিউ ইয়র্ক এবং অনলাইনে আসছে।
নিবন্ধন আজ!

প্ল্যাটফর্মের নিয়ম

সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।

নিয়ম

সীমাবদ্ধতা_সেটিং

constraint_setting(name, default_constraint_value, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, tags, testonly, visibility)

এই নিয়মটি একটি নতুন সীমাবদ্ধতার ধরণ প্রবর্তন করতে ব্যবহৃত হয় যার জন্য একটি প্ল্যাটফর্ম একটি মান নির্দিষ্ট করতে পারে। উদাহরণস্বরূপ, আপনি glibc লাইব্রেরির বিভিন্ন সংস্করণ ইনস্টল করার জন্য প্ল্যাটফর্মের ক্ষমতা উপস্থাপন করতে "glibc_version" নামে একটি constraint_setting সংজ্ঞায়িত করতে পারেন। আরো বিস্তারিত জানার জন্য, প্ল্যাটফর্ম পৃষ্ঠা দেখুন।

প্রতিটি constraint_setting এর সাথে সম্পর্কিত constraint_value একটি এক্সটেনসিবল সেট রয়েছে। সাধারণত এইগুলি একই প্যাকেজে সংজ্ঞায়িত করা হয়, তবে কখনও কখনও একটি ভিন্ন প্যাকেজ একটি বিদ্যমান সেটিংসের জন্য নতুন মান প্রবর্তন করে। উদাহরণস্বরূপ, পূর্বনির্ধারিত সেটিং @platforms//cpu:cpu একটি অস্পষ্ট cpu আর্কিটেকচারকে লক্ষ্য করে একটি প্ল্যাটফর্ম সংজ্ঞায়িত করার জন্য একটি কাস্টম মান সহ বাড়ানো যেতে পারে।

যুক্তি

গুণাবলী
name

Name ; required

এই লক্ষ্যের জন্য একটি অনন্য নাম।

default_constraint_value

Name ; optional

এই সেটিং এর জন্য ডিফল্ট মানের লেবেল, কোন মান দেওয়া না থাকলে ব্যবহার করা হবে। যদি এই অ্যাট্রিবিউটটি উপস্থিত থাকে, তাহলে এটি যে constraint_value নির্দেশ করে তা অবশ্যই এই constraint_setting এর মতো একই প্যাকেজে সংজ্ঞায়িত করা উচিত।

যদি একটি সীমাবদ্ধতার সেটিংসের একটি ডিফল্ট মান থাকে, তাহলে যখনই একটি প্ল্যাটফর্ম সেই সেটিংসের জন্য কোনো সীমাবদ্ধতার মান অন্তর্ভুক্ত করে না, তখন প্ল্যাটফর্মটি ডিফল্ট মান নির্দিষ্ট করার মতোই। অন্যথায়, যদি কোন ডিফল্ট মান না থাকে, তাহলে সীমাবদ্ধতা সেটিংটিকে সেই প্ল্যাটফর্মের দ্বারা অনির্দিষ্ট বলে মনে করা হয়। সেই ক্ষেত্রে, প্ল্যাটফর্মটি কোনও সীমাবদ্ধতা তালিকার সাথে মেলে না (যেমন একটি config_setting জন্য) যে সেটিংটির জন্য একটি নির্দিষ্ট মান প্রয়োজন।

সীমাবদ্ধতা_মূল্য

constraint_value(name, constraint_setting, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, tags, testonly, visibility)
এই নিয়মটি প্রদত্ত সীমাবদ্ধতার প্রকারের জন্য একটি নতুন মান প্রবর্তন করে। আরো বিস্তারিত জানার জন্য, প্ল্যাটফর্ম পৃষ্ঠা দেখুন।

উদাহরণ

নিম্নলিখিতটি পূর্বনির্ধারিত constraint_value জন্য একটি নতুন সম্ভাব্য মান তৈরি করে যা cpu আর্কিটেকচারের প্রতিনিধিত্ব করে।

constraint_value(
    name = "mips",
    constraint_setting = "@platforms//cpu:cpu",
)
প্ল্যাটফর্মগুলি তখন ঘোষণা করতে পারে যে তাদের কাছে x86_64 , arm , ইত্যাদির বিকল্প হিসাবে mips আর্কিটেকচার রয়েছে৷

যুক্তি

গুণাবলী
name

Name ; required

এই লক্ষ্যের জন্য একটি অনন্য নাম।

constraint_setting

Label ; required

constraint_setting যার জন্য এই constraint_value একটি সম্ভাব্য পছন্দ।

প্ল্যাটফর্ম

platform(name, constraint_values, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, parents, remote_execution_properties, tags, testonly, visibility)

এই নিয়মটি একটি নতুন প্ল্যাটফর্মকে সংজ্ঞায়িত করে -- সীমাবদ্ধতার পছন্দগুলির একটি নামকৃত সংগ্রহ (যেমন cpu আর্কিটেকচার বা কম্পাইলার সংস্করণ) একটি পরিবেশ বর্ণনা করে যেখানে বিল্ডের অংশটি চলতে পারে। আরো বিস্তারিত জানার জন্য, প্ল্যাটফর্ম পৃষ্ঠা দেখুন।

উদাহরণ

এটি একটি প্ল্যাটফর্মকে সংজ্ঞায়িত করে যা এআরএম-এ লিনাক্স চলমান যেকোনো পরিবেশকে বর্ণনা করে।

platform(
    name = "linux_arm",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)

প্ল্যাটফর্ম উত্তরাধিকার

প্ল্যাটফর্মগুলি অন্য একটি প্ল্যাটফর্ম নির্দিষ্ট করতে parents বৈশিষ্ট্যগুলি ব্যবহার করতে পারে যেগুলি থেকে তারা সীমাবদ্ধতার মানগুলি উত্তরাধিকার সূত্রে পাবে৷ যদিও parents বৈশিষ্ট্য একটি তালিকা নেয়, বর্তমানে একটি একক মান সমর্থিত নয় এবং একাধিক অভিভাবক নির্দিষ্ট করা একটি ত্রুটি।

একটি প্ল্যাটফর্মে একটি সীমাবদ্ধতার সেটিংসের মান পরীক্ষা করার সময়, প্রথমে সরাসরি সেট করা মানগুলি ( constraint_values ​​অ্যাট্রিবিউটের মাধ্যমে) চেক করা হয় এবং তারপরে অভিভাবকের উপর সীমাবদ্ধতার মানগুলি পরীক্ষা করা হয়। এটি অভিভাবক প্ল্যাটফর্মের চেইনটি পুনরাবৃত্তিমূলকভাবে চলতে থাকে। এই পদ্ধতিতে, একটি প্ল্যাটফর্মে সরাসরি সেট করা যেকোনো মান অভিভাবকের উপর সেট করা মানগুলিকে ওভাররাইড করবে।

প্ল্যাটফর্মগুলি প্যারেন্ট প্ল্যাটফর্ম থেকে exec_properties অ্যাট্রিবিউটের উত্তরাধিকারী হয়। অভিভাবক এবং শিশু প্ল্যাটফর্মের exec_properties এ অভিধান এন্ট্রিগুলিকে একত্রিত করা হবে। অভিভাবক এবং সন্তানের exec_properties উভয় ক্ষেত্রে একই কী উপস্থিত হলে, সন্তানের মান ব্যবহার করা হবে। যদি চাইল্ড প্ল্যাটফর্ম একটি মান হিসাবে একটি খালি স্ট্রিং নির্দিষ্ট করে, তাহলে সংশ্লিষ্ট সম্পত্তি আনসেট হবে।

প্ল্যাটফর্মগুলি মূল প্ল্যাটফর্ম থেকে (অপ্রচলিত) remote_execution_properties অ্যাট্রিবিউটের উত্তরাধিকারী হতে পারে। দ্রষ্টব্য: নতুন কোড এর পরিবর্তে exec_properties ব্যবহার করা উচিত। নীচে বর্ণিত যুক্তিটি উত্তরাধিকারী আচরণের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য বজায় রাখা হয়েছে তবে ভবিষ্যতে সরানো হবে৷ একটি মূল প্ল্যাটফর্ম থাকলে remote_execution_platform সেট করার যুক্তি নিম্নরূপ:

  1. যদি চাইল্ড প্ল্যাটফর্মে remote_execution_property সেট করা না থাকে, তাহলে অভিভাবকের remote_execution_properties ব্যবহার করা হবে।
  2. যদি remote_execution_property চাইল্ড প্ল্যাটফর্মে সেট করা থাকে এবং এতে আক্ষরিক স্ট্রিং {PARENT_REMOTE_EXECUTION_PROPERTIES} থাকে, তাহলে সেই ম্যাক্রোটি অভিভাবকের remote_execution_property বৈশিষ্ট্যের বিষয়বস্তুর সাথে প্রতিস্থাপিত হবে।
  3. যদি remote_execution_property চাইল্ড প্ল্যাটফর্মে সেট করা থাকে এবং এতে ম্যাক্রো না থাকে, তাহলে সন্তানের remote_execution_property অপরিবর্তিত ব্যবহার করা হবে।

যেহেতু remote_execution_properties করা হয়েছে এবং পর্যায়ক্রমে আউট করা হবে, একই উত্তরাধিকার শৃঙ্খলে remote_execution_properties এবং exec_properties মিশ্রিত করার অনুমতি নেই। অপসারিত remote_execution_properties এর উপর exec_properties ব্যবহার করতে পছন্দ করুন।

উদাহরণ: সীমাবদ্ধতা মান

platform(
    name = "parent",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)
platform(
    name = "child_a",
    parents = [":parent"],
    constraint_values = [
        "@platforms//cpu:x86_64",
    ],
)
platform(
    name = "child_b",
    parents = [":parent"],
)

এই উদাহরণে, চাইল্ড প্ল্যাটফর্মের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • child_a এর সীমাবদ্ধতা মান রয়েছে @platforms//os:linux (অভিভাবকের কাছ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত) এবং @platforms//cpu:x86_64 (সরাসরি প্ল্যাটফর্মে সেট করা)।
  • child_b কাছ থেকে সমস্ত সীমাবদ্ধতার মান উত্তরাধিকার সূত্রে পায়, এবং তার নিজস্ব কোনো সেট করে না।

উদাহরণ: এক্সিকিউশন বৈশিষ্ট্য

platform(
    name = "parent",
    exec_properties = {
      "k1": "v1",
      "k2": "v2",
    },
)
platform(
    name = "child_a",
    parents = [":parent"],
)
platform(
    name = "child_b",
    parents = [":parent"],
    exec_properties = {
      "k1": "child"
    }
)
platform(
    name = "child_c",
    parents = [":parent"],
    exec_properties = {
      "k1": ""
    }
)
platform(
    name = "child_d",
    parents = [":parent"],
    exec_properties = {
      "k3": "v3"
    }
)

এই উদাহরণে, চাইল্ড প্ল্যাটফর্মের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • child_a পিতামাতার "exec_properties" উত্তরাধিকার সূত্রে পায় এবং তার নিজস্ব সেট করে না।
  • child_b পিতামাতার k1 উত্তরাধিকার সূত্রে পায় এবং exec_properties এর মান ওভাররাইড করে। এর exec_properties হবে: { "k1": "child", "k2": "v2" }
  • child_c পিতামাতার exec_properties উত্তরাধিকার সূত্রে পায় এবং k1 আনসেট করে। এর exec_properties হবে: { "k2": "v2" }
  • child_d পিতামাতার exec_properties উত্তরাধিকারী হয় এবং একটি নতুন সম্পত্তি যোগ করে। এর exec_properties হবে: { "k1": "v1", "k2": "v2", "k3": "v3" }

যুক্তি

গুণাবলী
name

Name ; required

এই লক্ষ্যের জন্য একটি অনন্য নাম।

constraint_values

List of labels ; optional

এই প্ল্যাটফর্মটি গঠিত সীমাবদ্ধতার বিকল্পগুলির সংমিশ্রণ। একটি প্রদত্ত পরিবেশে প্রয়োগ করার জন্য একটি প্ল্যাটফর্মের জন্য, পরিবেশের এই তালিকায় অন্তত মান থাকতে হবে।

এই তালিকার প্রতিটি constraint_value একটি ভিন্ন constraint_setting এর জন্য হতে হবে। উদাহরণস্বরূপ, আপনি এমন একটি প্ল্যাটফর্মকে সংজ্ঞায়িত করতে পারবেন না যার জন্য cpu আর্কিটেকচারকে @platforms//cpu:x86_64 এবং @platforms//cpu:arm উভয়ই হতে হবে।

exec_properties

Dictionary: String -> String; optional

স্ট্রিংগুলির একটি মানচিত্র যা দূরবর্তীভাবে কাজ চালানোর পদ্ধতিকে প্রভাবিত করে। Bazel এটি ব্যাখ্যা করার কোন চেষ্টা করে না, এটি অস্বচ্ছ ডেটা হিসাবে বিবেচিত হয় যা রিমোট এক্সিকিউশন প্রোটোকলের প্ল্যাটফর্ম ক্ষেত্রের মাধ্যমে ফরোয়ার্ড করা হয়। এর মধ্যে প্যারেন্ট প্ল্যাটফর্মের exec_properties অ্যাট্রিবিউটের যেকোন ডেটা অন্তর্ভুক্ত থাকে। যদি শিশু এবং পিতামাতার প্ল্যাটফর্ম একই কীগুলি সংজ্ঞায়িত করে, তবে সন্তানের মানগুলি রাখা হয়। একটি খালি স্ট্রিং একটি মান সঙ্গে যুক্ত কোনো কী অভিধান থেকে সরানো হয়. এই বৈশিষ্ট্যটি remote_execution_properties এর সম্পূর্ণ প্রতিস্থাপন।
parents

List of labels ; optional

একটি platform টার্গেটের লেবেল যা এই প্ল্যাটফর্ম থেকে উত্তরাধিকারসূত্রে পাওয়া উচিত৷ যদিও অ্যাট্রিবিউটটি একটি তালিকা নেয়, সেখানে একটির বেশি প্ল্যাটফর্ম থাকা উচিত নয়। এই প্ল্যাটফর্মে সরাসরি সেট করা না হওয়া যেকোনো সীমাবদ্ধতা মূল প্ল্যাটফর্মে পাওয়া যাবে। বিস্তারিত জানার জন্য প্ল্যাটফর্ম উত্তরাধিকারের বিভাগটি দেখুন।
remote_execution_properties

String; optional

বঞ্চিত। পরিবর্তে exec_properties বৈশিষ্ট্য ব্যবহার করুন. দূরবর্তী এক্সিকিউশন প্ল্যাটফর্ম কনফিগার করতে ব্যবহৃত একটি স্ট্রিং। প্রকৃত বিল্ডগুলি এটি ব্যাখ্যা করার কোন চেষ্টা করে না, এটি অস্বচ্ছ ডেটা হিসাবে বিবেচিত হয় যা একটি নির্দিষ্ট SpawnRunner দ্বারা ব্যবহার করা যেতে পারে। এতে ম্যাক্রো "{PARENT_REMOTE_EXECUTION_PROPERTIES}" ব্যবহার করে প্যারেন্ট প্ল্যাটফর্মের "remote_execution_properties" অ্যাট্রিবিউট থেকে ডেটা অন্তর্ভুক্ত করা যেতে পারে। বিস্তারিত জানার জন্য প্ল্যাটফর্ম উত্তরাধিকারের বিভাগটি দেখুন।

টুলচেইন

toolchain(name, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)

এই নিয়মটি একটি নির্দিষ্ট টুলচেইনের ধরন এবং সীমাবদ্ধতা ঘোষণা করে যাতে টুলচেন রেজোলিউশনের সময় এটি নির্বাচন করা যায়। আরো বিস্তারিত জানার জন্য টুলচেইন পৃষ্ঠা দেখুন।

যুক্তি

গুণাবলী
name

Name ; required

এই লক্ষ্যের জন্য একটি অনন্য নাম।

exec_compatible_with

List of labels ; optional; nonconfigurable

এই টুলচেনটিকে সেই প্ল্যাটফর্মে একটি টার্গেট বিল্ডিংয়ের জন্য নির্বাচন করার জন্য একটি এক্সিকিউশন প্ল্যাটফর্মকে অবশ্যই constraint_value একটি তালিকা সন্তুষ্ট করতে হবে।
target_compatible_with

List of labels ; optional; nonconfigurable

এই টুলচেনটিকে সেই প্ল্যাটফর্মের জন্য একটি লক্ষ্য বিল্ডিংয়ের জন্য নির্বাচন করার জন্য constraint_value একটি তালিকা যা লক্ষ্য প্ল্যাটফর্মের দ্বারা অবশ্যই সন্তুষ্ট হতে হবে।
target_settings

List of labels ; optional

config_setting এর একটি তালিকা যা টুলচেন রেজোলিউশনের সময় এই টুলচেন নির্বাচন করার জন্য লক্ষ্য কনফিগারেশন দ্বারা সন্তুষ্ট হওয়া আবশ্যক।
toolchain

Name ; required

আসল টুল বা টুল স্যুটের প্রতিনিধিত্বকারী টার্গেট যা এই টুলচেন নির্বাচন করা হলে উপলব্ধ করা হয়।
toolchain_type

Label ; required; nonconfigurable

একটি toolchain_type টার্গেটের লেবেল যা এই টুলচেনটি যে ভূমিকা পালন করে তা উপস্থাপন করে।

টুলচেন_টাইপ

toolchain_type(name, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

এই নিয়মটি একটি নতুন ধরনের টুলচেনকে সংজ্ঞায়িত করে -- একটি সাধারণ লক্ষ্য যা বিভিন্ন প্ল্যাটফর্মের জন্য একই ভূমিকা পালন করে এমন একটি শ্রেণির সরঞ্জামকে প্রতিনিধিত্ব করে।

আরো বিস্তারিত জানার জন্য টুলচেইন পৃষ্ঠা দেখুন।

উদাহরণ

এটি একটি কাস্টম নিয়মের জন্য একটি টুলচেন প্রকার সংজ্ঞায়িত করে।

toolchain_type(
    name = "bar_toolchain_type",
)

এটি একটি bzl ফাইলে ব্যবহার করা যেতে পারে।

bar_binary = rule(
    implementation = _bar_binary_impl,
    attrs = {
        "srcs": attr.label_list(allow_files = True),
        ...
        # No `_compiler` attribute anymore.
    },
    toolchains = ["//bar_tools:toolchain_type"]
)

যুক্তি

গুণাবলী
name

Name ; required

এই লক্ষ্যের জন্য একটি অনন্য নাম।