Bazel বিভিন্ন হার্ডওয়্যার, অপারেটিং সিস্টেম এবং সিস্টেম কনফিগারেশনে কোড তৈরি এবং পরীক্ষা করতে পারে, বিল্ড টুলের বিভিন্ন সংস্করণ যেমন লিঙ্কার এবং কম্পাইলার ব্যবহার করে। এই জটিলতা পরিচালনা করতে, Bazel এর সীমাবদ্ধতা এবং প্ল্যাটফর্মের একটি ধারণা রয়েছে। একটি সীমাবদ্ধতা হল একটি মাত্রা যেখানে নির্মাণ বা উৎপাদন পরিবেশ ভিন্ন হতে পারে, যেমন CPU আর্কিটেকচার, একটি GPU-এর উপস্থিতি বা অনুপস্থিতি, বা সিস্টেম-ইনস্টল করা কম্পাইলারের সংস্করণ। একটি প্ল্যাটফর্ম হল এই সীমাবদ্ধতার জন্য পছন্দের একটি নামকৃত সংগ্রহ, যা কিছু পরিবেশে উপলব্ধ নির্দিষ্ট সংস্থানগুলিকে প্রতিনিধিত্ব করে।
পরিবেশকে একটি প্ল্যাটফর্ম হিসাবে মডেল করা বেজেলকে স্বয়ংক্রিয়ভাবে বিল্ড অ্যাকশনের জন্য উপযুক্ত টুলচেইন নির্বাচন করতে সহায়তা করে। কনফিগারযোগ্য বৈশিষ্ট্যগুলি লিখতে config_setting নিয়মের সাথে প্ল্যাটফর্মগুলিও ব্যবহার করা যেতে পারে।
ব্যাজেল তিনটি ভূমিকা স্বীকার করে যা একটি প্ল্যাটফর্ম পরিবেশন করতে পারে:
- হোস্ট - যে প্ল্যাটফর্মে বাজেল নিজেই চলে।
- এক্সিকিউশন - একটি প্ল্যাটফর্ম যেখানে বিল্ড টুলগুলি মধ্যবর্তী এবং চূড়ান্ত আউটপুট তৈরি করতে বিল্ড অ্যাকশনগুলি চালায়।
- লক্ষ্য - একটি প্ল্যাটফর্ম যেখানে একটি চূড়ান্ত আউটপুট থাকে এবং কার্যকর করে।
Bazel প্ল্যাটফর্ম সম্পর্কিত নিম্নলিখিত বিল্ড পরিস্থিতিতে সমর্থন করে:
একক-প্ল্যাটফর্ম বিল্ড (ডিফল্ট) - হোস্ট, এক্সিকিউশন এবং টার্গেট প্ল্যাটফর্ম একই। উদাহরণস্বরূপ, একটি Intel x64 CPU-তে চলমান উবুন্টুতে একটি লিনাক্স এক্সিকিউটেবল তৈরি করা।
ক্রস-কম্পাইলেশন বিল্ড - হোস্ট এবং এক্সিকিউশন প্ল্যাটফর্ম একই, কিন্তু লক্ষ্য প্ল্যাটফর্ম ভিন্ন। উদাহরণস্বরূপ, ম্যাকবুক প্রোতে চলমান macOS-এ একটি iOS অ্যাপ তৈরি করা।
মাল্টি-প্ল্যাটফর্ম বিল্ড - হোস্ট, এক্সিকিউশন এবং টার্গেট প্ল্যাটফর্ম সবই আলাদা।
সীমাবদ্ধতা এবং প্ল্যাটফর্ম সংজ্ঞায়িত করা
BUILD
ফাইলের মধ্যে constraint_setting
এবং constraint_value
নিয়মগুলি ব্যবহার করে প্ল্যাটফর্মগুলির জন্য সম্ভাব্য পছন্দের স্থান নির্ধারণ করা হয়। constraint_setting
একটি নতুন মাত্রা তৈরি করে, যখন constraint_value
একটি প্রদত্ত মাত্রার জন্য একটি নতুন মান তৈরি করে; একসাথে তারা কার্যকরভাবে একটি enum এবং এর সম্ভাব্য মান সংজ্ঞায়িত করে। উদাহরণস্বরূপ, একটি BUILD
ফাইলের নিম্নলিখিত স্নিপেট দুটি সম্ভাব্য মান সহ সিস্টেমের glibc সংস্করণের জন্য একটি সীমাবদ্ধতা প্রবর্তন করে।
constraint_setting(name = "glibc_version")
constraint_value(
name = "glibc_2_25",
constraint_setting = ":glibc_version",
)
constraint_value(
name = "glibc_2_26",
constraint_setting = ":glibc_version",
)
সীমাবদ্ধতা এবং তাদের মান কর্মক্ষেত্রে বিভিন্ন প্যাকেজ জুড়ে সংজ্ঞায়িত করা যেতে পারে। তারা লেবেল দ্বারা উল্লেখ করা হয় এবং স্বাভাবিক দৃশ্যমানতা নিয়ন্ত্রণ সাপেক্ষে. যদি দৃশ্যমানতা অনুমতি দেয়, আপনি এটির জন্য আপনার নিজস্ব মান নির্ধারণ করে একটি বিদ্যমান সীমাবদ্ধতা সেটিং প্রসারিত করতে পারেন।
platform
নিয়ম সীমাবদ্ধতার মানগুলির নির্দিষ্ট পছন্দ সহ একটি নতুন প্ল্যাটফর্ম প্রবর্তন করে। নিম্নলিখিতটি linux_x86
নামে একটি প্ল্যাটফর্ম তৈরি করে এবং বলে যে এটি 2.25 এর glibc সংস্করণ সহ একটি x86_64 আর্কিটেকচারে একটি লিনাক্স অপারেটিং সিস্টেম চালায় এমন যেকোনো পরিবেশের বর্ণনা দেয়। (বেজেলের অন্তর্নির্মিত সীমাবদ্ধতা সম্পর্কে আরও জানতে নীচে দেখুন।)
platform(
name = "linux_x86",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
":glibc_2_25",
],
)
সাধারণত দরকারী সীমাবদ্ধতা এবং প্ল্যাটফর্ম
ইকোসিস্টেমকে সামঞ্জস্যপূর্ণ রাখতে, Bazel টিম সর্বাধিক জনপ্রিয় CPU আর্কিটেকচার এবং অপারেটিং সিস্টেমের জন্য সীমাবদ্ধ সংজ্ঞা সহ একটি সংগ্রহস্থল বজায় রাখে। এগুলি সবই https://github.com/bazelbuild/platforms- এ অবস্থিত।
নিম্নলিখিত বিশেষ প্ল্যাটফর্ম সংজ্ঞা সহ Bazel জাহাজ: @local_config_platform//:host
। এটি স্বয়ংক্রিয়ভাবে সনাক্ত করা হোস্ট প্ল্যাটফর্মের মান - ব্যাজেল যে সিস্টেমে চলছে তার জন্য স্বয়ংক্রিয়ভাবে সনাক্ত করা প্ল্যাটফর্মের প্রতিনিধিত্ব করে৷
একটি নির্মাণের জন্য একটি প্ল্যাটফর্ম নির্দিষ্ট করা
আপনি নিম্নলিখিত কমান্ড-লাইন পতাকাগুলি ব্যবহার করে একটি বিল্ডের জন্য হোস্ট এবং লক্ষ্য প্ল্যাটফর্মগুলি নির্দিষ্ট করতে পারেন:
-
--host_platform
- ডিফল্ট@bazel_tools//platforms:host_platform
-
--platforms
-@bazel_tools//platforms:target_platform
বেমানান টার্গেট এড়িয়ে যাওয়া
একটি নির্দিষ্ট লক্ষ্য প্ল্যাটফর্মের জন্য তৈরি করার সময় প্রায়শই সেই প্ল্যাটফর্মে কাজ করবে না এমন লক্ষ্যগুলি এড়িয়ে যাওয়া বাঞ্ছনীয়। উদাহরণস্বরূপ, আপনার উইন্ডোজ ডিভাইস ড্রাইভার সম্ভবত //...
সহ একটি লিনাক্স মেশিনে তৈরি করার সময় প্রচুর কম্পাইলার ত্রুটি তৈরি করতে চলেছে। আপনার কোডে কোন টার্গেট প্ল্যাটফর্মের সীমাবদ্ধতা রয়েছে তা বেজেলকে জানাতে target_compatible_with
অ্যাট্রিবিউট ব্যবহার করুন।
এই বৈশিষ্ট্যের সহজতম ব্যবহার একটি লক্ষ্যকে একটি একক প্ল্যাটফর্মে সীমাবদ্ধ করে। লক্ষ্যটি এমন কোনও প্ল্যাটফর্মের জন্য তৈরি করা হবে না যা সমস্ত সীমাবদ্ধতাকে সন্তুষ্ট করে না। নিম্নলিখিত উদাহরণ win_driver_lib.cc
64-বিট উইন্ডোজে সীমাবদ্ধ করে।
cc_library(
name = "win_driver_lib",
srcs = ["win_driver_lib.cc"],
target_compatible_with = [
"@platforms//cpu:x86_64",
"@platforms//os:windows",
],
)
:win_driver_lib
শুধুমাত্র 64-বিট উইন্ডোজ তৈরির জন্য সামঞ্জস্যপূর্ণ এবং অন্য সব কিছুর সাথে বেমানান। অসামঞ্জস্যতা ট্রানজিটিভ। যেকোন লক্ষ্যমাত্রা যা একটি বেমানান লক্ষ্যের উপর নির্ভরশীলভাবে নির্ভর করে নিজেদেরকে বেমানান বলে বিবেচিত হয়।
লক্ষ্য বাদ দেওয়া হয় কখন?
লক্ষ্যগুলি এড়িয়ে যায় যখন সেগুলি বেমানান বলে বিবেচিত হয় এবং একটি লক্ষ্য প্যাটার্ন সম্প্রসারণের অংশ হিসাবে বিল্ডে অন্তর্ভুক্ত করা হয়। উদাহরণস্বরূপ, নিম্নলিখিত দুটি আমন্ত্রণ লক্ষ্য প্যাটার্ন সম্প্রসারণে পাওয়া যেকোন বেমানান লক্ষ্যগুলিকে এড়িয়ে যায়।
$ bazel build --platforms=//:myplatform //...
$ bazel build --platforms=//:myplatform //:all
test_suite
এ অসামঞ্জস্যপূর্ণ পরীক্ষাগুলি একইভাবে বাদ দেওয়া হয় যদি test_suite
কমান্ড লাইনে --expand_test_suites
এর সাথে নির্দিষ্ট করা থাকে। অন্য কথায়, কমান্ড লাইনে test_suite
টার্গেটগুলি এরকম আচরণ করে :all
এবং ...
। --noexpand_test_suites
ব্যবহার করা সম্প্রসারণকে বাধা দেয় এবং বেমানান পরীক্ষার সাথে test_suite
লক্ষ্যগুলিও বেমানান হতে পারে।
কমান্ড লাইনে একটি বেমানান টার্গেট স্পষ্টভাবে উল্লেখ করার ফলে একটি ত্রুটি বার্তা এবং একটি ব্যর্থ বিল্ড হয়।
$ bazel build --platforms=//:myplatform //:target_incompatible_with_myplatform
...
ERROR: Target //:target_incompatible_with_myplatform is incompatible and cannot be built, but was explicitly requested.
...
FAILED: Build did NOT complete successfully
আরো অভিব্যক্তিপূর্ণ সীমাবদ্ধতা
সীমাবদ্ধতা প্রকাশে আরও নমনীয়তার জন্য, @platforms//:incompatible
constraint_value
ব্যবহার করুন যা কোনো প্ল্যাটফর্ম সন্তুষ্ট নয়।
আরও জটিল বিধিনিষেধ প্রকাশ করতে @platforms//:incompatible
এর সংমিশ্রণে select()
ব্যবহার করুন। উদাহরণস্বরূপ, মৌলিক বা যুক্তি প্রয়োগ করতে এটি ব্যবহার করুন। নিম্নলিখিতটি ম্যাকওএস এবং লিনাক্সের সাথে সামঞ্জস্যপূর্ণ একটি লাইব্রেরি চিহ্নিত করে, তবে অন্য কোনও প্ল্যাটফর্ম নেই।
cc_library(
name = "unixish_lib",
srcs = ["unixish_lib.cc"],
target_compatible_with = select({
"@platforms//os:osx": [],
"@platforms//os:linux": [],
"//conditions:default": ["@platforms//:incompatible"],
}),
)
উপরেরটি নিম্নরূপ ব্যাখ্যা করা যেতে পারে:
- macOS কে টার্গেট করার সময়, টার্গেটের কোন সীমাবদ্ধতা নেই।
- লিনাক্স টার্গেট করার সময়, টার্গেটের কোন সীমাবদ্ধতা নেই।
- অন্যথায়, টার্গেটে
@platforms//:incompatible
সীমাবদ্ধতা রয়েছে। কারণ@platforms//:incompatible
কোনো প্ল্যাটফর্মের অংশ নয়, লক্ষ্যটিকে বেমানান বলে মনে করা হয়।
আপনার সীমাবদ্ধতাগুলিকে আরও পাঠযোগ্য করতে, skylib এর selects.with_or()
ব্যবহার করুন।
আপনি একইভাবে বিপরীত সামঞ্জস্য প্রকাশ করতে পারেন। নিম্নলিখিত উদাহরণটি একটি লাইব্রেরি বর্ণনা করে যা এআরএম ছাড়া সবকিছুর সাথে সামঞ্জস্যপূর্ণ।
cc_library(
name = "non_arm_lib",
srcs = ["non_arm_lib.cc"],
target_compatible_with = select({
"@platforms//cpu:arm": ["@platforms//:incompatible"],
"//conditions:default": [],
],
)
bazel cquery
ব্যবহার করে বেমানান লক্ষ্য শনাক্ত করা
সামঞ্জস্যপূর্ণ লক্ষ্যগুলি থেকে বেমানান লক্ষ্যগুলিকে আলাদা করতে আপনি bazel cquery
এর Starlark আউটপুট বিন্যাসে IncompatiblePlatformProvider
ব্যবহার করতে পারেন।
এটি বেমানান লক্ষ্যগুলি ফিল্টার করতে ব্যবহার করা যেতে পারে। নীচের উদাহরণটি শুধুমাত্র সামঞ্জস্যপূর্ণ লক্ষ্যগুলির জন্য লেবেলগুলি প্রিন্ট করবে৷ বেমানান লক্ষ্য মুদ্রিত হয় না.
$ cat example.cquery
def format(target):
if "IncompatiblePlatformProvider" not in providers(target):
return target.label
return ""
$ bazel cquery //... --output=starlark --starlark:file=example.cquery
জ্ঞাত সমস্যা
অসঙ্গত লক্ষ্যগুলি দৃশ্যমানতার সীমাবদ্ধতা উপেক্ষা করে ।