ওভারভিউ
সঠিক বিকল্পগুলির সাথে কম্পাইলারকে আমন্ত্রণ জানাতে, Bazel-এর কম্পাইলার অভ্যন্তরীণ সম্পর্কে কিছু জ্ঞান প্রয়োজন, যেমন ডিরেক্টরি এবং গুরুত্বপূর্ণ ফ্ল্যাগ অন্তর্ভুক্ত করা। অন্য কথায়, Bazel এর কাজ বোঝার জন্য কম্পাইলারের একটি সরলীকৃত মডেল প্রয়োজন।
Bazel নিম্নলিখিত জানতে হবে:
- কম্পাইলার থিনএলটিও, মডিউল, ডাইনামিক লিঙ্কিং, বা পিআইসি (পজিশন ইন্ডিপেন্ডেন্ট কোড) সমর্থন করে কিনা।
- প্রয়োজনীয় টুলের পাথ যেমন gcc, ld, ar, objcopy, ইত্যাদি।
- অন্তর্নির্মিত সিস্টেম ডিরেক্টরি অন্তর্ভুক্ত. সোর্স ফাইলে অন্তর্ভুক্ত সমস্ত শিরোনামগুলি
BUILD
ফাইলে সঠিকভাবে ঘোষণা করা হয়েছে তা যাচাই করার জন্য Bazel-এর এইগুলি প্রয়োজন৷ - ডিফল্ট sysroot.
- কম্পাইলেশন, লিঙ্কিং, আর্কাইভ করার জন্য কোন পতাকা ব্যবহার করতে হবে।
- সমর্থিত সংকলন মোডগুলির জন্য কোন পতাকা ব্যবহার করতে হবে (অপ্ট, ডিবিজি, ফাস্টবিল্ড)।
- কম্পাইলার দ্বারা বিশেষভাবে প্রয়োজনীয় ভেরিয়েবল তৈরি করুন।
কম্পাইলারের একাধিক আর্কিটেকচারের জন্য সমর্থন থাকলে, Bazel-কে আলাদাভাবে কনফিগার করতে হবে।
CcToolchainConfigInfo
হল একটি প্রদানকারী যেটি Bazel-এর C++ নিয়মের আচরণ কনফিগার করার জন্য প্রয়োজনীয় স্তরের গ্রানুলারিটি প্রদান করে। ডিফল্টরূপে, Bazel স্বয়ংক্রিয়ভাবে আপনার বিল্ডের জন্য CcToolchainConfigInfo
কনফিগার করে, কিন্তু আপনার কাছে এটি ম্যানুয়ালি কনফিগার করার বিকল্প রয়েছে। এর জন্য, আপনার একটি Starlark নিয়ম প্রয়োজন যা CcToolchainConfigInfo
প্রদান করে এবং আপনাকে আপনার নিয়মে cc_toolchain
এর toolchain_config
বৈশিষ্ট্য নির্দেশ করতে হবে। আপনি cc_common.create_cc_toolchain_config_info()
কল করে CcToolchainConfigInfo
তৈরি করতে পারেন। আপনি @rules_cc//cc:cc_toolchain_config_lib.bzl
এ প্রক্রিয়ার জন্য প্রয়োজনীয় সমস্ত স্ট্রাকটের জন্য Starlark কনস্ট্রাক্টর খুঁজে পেতে পারেন।
যখন একটি C++ লক্ষ্য বিশ্লেষণের পর্যায়ে প্রবেশ করে, তখন Bazel BUILD
ফাইলের উপর ভিত্তি করে উপযুক্ত cc_toolchain
লক্ষ্য নির্বাচন করে এবং cc_toolchain.toolchain_config
বৈশিষ্ট্যে নির্দিষ্ট লক্ষ্য থেকে CcToolchainConfigInfo
প্রদানকারী প্রাপ্ত করে। cc_toolchain
টার্গেট একটি CcToolchainProvider
এর মাধ্যমে C++ টার্গেটে এই তথ্য পাঠায়।
উদাহরণ স্বরূপ, cc_binary
বা cc_library
এর মতো নিয়ম দ্বারা কম্পাইল বা লিঙ্ক অ্যাকশনের জন্য নিম্নলিখিত তথ্যের প্রয়োজন হয়:
- ব্যবহার করার জন্য কম্পাইলার বা লিঙ্কার
- কম্পাইলার/লিঙ্কারের জন্য কমান্ড-লাইন পতাকা
- কনফিগারেশন ফ্ল্যাগগুলি
--copt/--linkopt
বিকল্পগুলির মাধ্যমে পাস করা হয়েছে - পরিবেশ পরিবর্তনশীল
- স্যান্ডবক্সে আর্টিফ্যাক্টের প্রয়োজন যেখানে অ্যাকশন চালানো হয়
স্যান্ডবক্সে প্রয়োজনীয় আর্টিফ্যাক্ট ব্যতীত উপরের সমস্ত তথ্য স্টারলার্ক টার্গেটে উল্লেখ করা হয়েছে যেটি cc_toolchain
নির্দেশ করে।
স্যান্ডবক্সে পাঠানো শিল্পকর্মগুলি cc_toolchain
লক্ষ্যে ঘোষণা করা হয়। উদাহরণস্বরূপ, cc_toolchain.linker_files
অ্যাট্রিবিউটের সাহায্যে আপনি স্যান্ডবক্সে পাঠানোর জন্য লিঙ্কার বাইনারি এবং টুলচেন লাইব্রেরি নির্দিষ্ট করতে পারেন।
টুলচেন নির্বাচন
টুলচেইন নির্বাচন লজিক নিম্নরূপ কাজ করে:
ব্যবহারকারী
BUILD
ফাইলে একটিcc_toolchain_suite
টার্গেট নির্দিষ্ট করে এবং--crosstool_top
বিকল্প ব্যবহার করে Bazel-কে লক্ষ্যে নির্দেশ করে।cc_toolchain_suite
টার্গেট একাধিক টুলচেন উল্লেখ করে।--cpu
এবং--compiler
পতাকার মান নির্ধারণ করে যে কোন টুলচেইন নির্বাচন করা হয়েছে, হয় শুধুমাত্র--cpu
পতাকা মানের উপর ভিত্তি করে, অথবা যৌথ--cpu | --compiler
মান। নির্বাচন প্রক্রিয়া নিম্নরূপ:যদি
--compiler
বিকল্পটি নির্দিষ্ট করা থাকে, Bazelcc_toolchain_suite.toolchains
অ্যাট্রিবিউট থেকে--cpu | --compiler
। Bazel একটি সংশ্লিষ্ট এন্ট্রি খুঁজে না পেলে, এটি একটি ত্রুটি নিক্ষেপ করে।যদি
--compiler
বিকল্পটি নির্দিষ্ট না করা হয়, Bazel শুধুমাত্র--cpu
এর সাথেcc_toolchain_suite.toolchains
অ্যাট্রিবিউট থেকে সংশ্লিষ্ট এন্ট্রি নির্বাচন করে।কোনো পতাকা নির্দিষ্ট না থাকলে, Bazel হোস্ট সিস্টেম পরিদর্শন করে এবং তার ফলাফলের উপর ভিত্তি করে একটি
--cpu
মান নির্বাচন করে। পরিদর্শন প্রক্রিয়া কোড দেখুন.
একবার একটি টুলচেইন নির্বাচন করা হলে, স্টারলার্ক নিয়মে সংশ্লিষ্ট feature
এবং action_config
অবজেক্টগুলি বিল্ডের কনফিগারেশনকে নিয়ন্ত্রণ করে (অর্থাৎ, পরে বর্ণিত আইটেমগুলি)। এই বার্তাগুলি Bazel বাইনারি পরিবর্তন না করেই Bazel-এ সম্পূর্ণরূপে উন্নত C++ বৈশিষ্ট্যগুলি বাস্তবায়নের অনুমতি দেয়৷ C++ নিয়মগুলি Bazel সোর্স কোডে বিস্তারিতভাবে নথিভুক্ত একাধিক অনন্য ক্রিয়াকে সমর্থন করে।
বৈশিষ্ট্য
একটি বৈশিষ্ট্য হল এমন একটি সত্তা যার জন্য কমান্ড-লাইন পতাকা, ক্রিয়াকলাপ, কার্যকর করার পরিবেশে সীমাবদ্ধতা বা নির্ভরতা পরিবর্তনের প্রয়োজন। একটি বৈশিষ্ট্য BUILD
ফাইলগুলিকে পতাকাগুলির কনফিগারেশন নির্বাচন করার অনুমতি দেওয়ার মতো সহজ কিছু হতে পারে, যেমন treat_warnings_as_errors
, বা C++ নিয়মগুলির সাথে ইন্টারঅ্যাক্ট করতে এবং সংকলনে নতুন কম্পাইল অ্যাকশন এবং ইনপুটগুলি অন্তর্ভুক্ত করতে পারে, যেমন header_modules
বা thin_lto
।
আদর্শভাবে, CcToolchainConfigInfo
বৈশিষ্ট্যগুলির একটি তালিকা ধারণ করে, যেখানে প্রতিটি বৈশিষ্ট্য এক বা একাধিক ফ্ল্যাগ গ্রুপ নিয়ে গঠিত, প্রতিটি নির্দিষ্ট ব্যাজেল অ্যাকশনের জন্য প্রযোজ্য পতাকার একটি তালিকা নির্ধারণ করে।
একটি বৈশিষ্ট্য নাম দ্বারা নির্দিষ্ট করা হয়েছে, যা Bazel রিলিজ থেকে Starlark নিয়ম কনফিগারেশনের সম্পূর্ণ ডিকপলিংকে অনুমতি দেয়। অন্য কথায়, একটি Bazel রিলিজ CcToolchainConfigInfo
কনফিগারেশনের আচরণকে প্রভাবিত করে না যতক্ষণ না সেই কনফিগারেশনগুলিতে নতুন বৈশিষ্ট্যগুলির ব্যবহার প্রয়োজন হয় না।
নিম্নলিখিত উপায়ে একটি বৈশিষ্ট্য সক্রিয় করা হয়েছে:
- বৈশিষ্ট্যটির
enabled
ক্ষেত্রটিtrue
সেট করা হয়েছে৷ - Bazel বা নিয়ম মালিক স্পষ্টভাবে এটি সক্রিয়.
- ব্যবহারকারী এটিকে
--feature
Bazel বিকল্প বাfeatures
নিয়ম বৈশিষ্ট্যের মাধ্যমে সক্ষম করে।
বৈশিষ্ট্যগুলির আন্তঃনির্ভরতা থাকতে পারে, কমান্ড লাইন ফ্ল্যাগ, BUILD
ফাইল সেটিংস এবং অন্যান্য ভেরিয়েবলের উপর নির্ভর করে।
বৈশিষ্ট্য সম্পর্ক
নির্ভরতাগুলি সাধারণত ব্যাজেলের সাথে সরাসরি পরিচালিত হয়, যা কেবল প্রয়োজনীয়তাগুলি প্রয়োগ করে এবং বিল্ডে সংজ্ঞায়িত বৈশিষ্ট্যগুলির প্রকৃতির সাথে অন্তর্নিহিত দ্বন্দ্বগুলি পরিচালনা করে। টুলচেন স্পেসিফিকেশন স্টারলার্ক নিয়মের মধ্যে সরাসরি ব্যবহারের জন্য আরও দানাদার সীমাবদ্ধতার অনুমতি দেয় যা বৈশিষ্ট্য সমর্থন এবং সম্প্রসারণ পরিচালনা করে। এইগুলো:
সীমাবদ্ধতা | বর্ণনা |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] | বৈশিষ্ট্য-স্তর। নির্দিষ্ট প্রয়োজনীয় বৈশিষ্ট্যগুলি সক্ষম হলেই বৈশিষ্ট্যটি সমর্থিত। উদাহরণস্বরূপ, যখন একটি বৈশিষ্ট্য শুধুমাত্র নির্দিষ্ট বিল্ড মোডে সমর্থিত হয় ( opt , dbg , বা fastbuild )। যদি `requires`-এ একাধিক `feature_set`s থাকে তাহলে কোনো `feature_set` সন্তুষ্ট হলে বৈশিষ্ট্যটি সমর্থিত হয় (যখন সমস্ত নির্দিষ্ট বৈশিষ্ট্য সক্রিয় থাকে)। |
implies = ['feature'] | বৈশিষ্ট্য-স্তর। এই বৈশিষ্ট্যটি নির্দিষ্ট বৈশিষ্ট্য(গুলি) বোঝায়। একটি বৈশিষ্ট্য সক্রিয় করা এটি দ্বারা উহ্য সমস্ত বৈশিষ্ট্যগুলিকেও অন্তর্নিহিতভাবে সক্ষম করে (অর্থাৎ, এটি পুনরাবৃত্তিমূলকভাবে কাজ করে)। এছাড়াও স্যানিটাইজারগুলির সাধারণ অংশগুলির মতো বৈশিষ্ট্যগুলির একটি সেট থেকে কার্যকারিতার সাধারণ উপসেটগুলিকে ফ্যাক্টর করার ক্ষমতা প্রদান করে। উহ্য বৈশিষ্ট্য নিষ্ক্রিয় করা যাবে না. |
provides = ['feature'] | বৈশিষ্ট্য-স্তর। নির্দেশ করে যে এই বৈশিষ্ট্যটি বেশ কয়েকটি পারস্পরিক একচেটিয়া বিকল্প বৈশিষ্ট্যগুলির মধ্যে একটি। উদাহরণ স্বরূপ, সমস্ত স্যানিটাইজার ব্যবহারকারী একবারে দুই বা তার বেশি পারস্পরিক একচেটিয়া বৈশিষ্ট্যের জন্য জিজ্ঞাসা করলে বিকল্পগুলি তালিকাভুক্ত করে এটি ত্রুটি পরিচালনার উন্নতি করে। |
with_features = [ with_feature_set( features = ['feature-1'], not_features = ['feature-2'], ), ] | পতাকা সেট-স্তর। একটি বৈশিষ্ট্য একাধিক সহ একাধিক পতাকা সেট নির্দিষ্ট করতে পারে। যখন with_features নির্দিষ্ট করা হয়, তখন পতাকা সেটটি শুধুমাত্র বিল্ড কমান্ডে প্রসারিত হবে যদি কমপক্ষে একটি with_feature_set যার জন্য নির্দিষ্ট features সেটের সমস্ত বৈশিষ্ট্য সক্রিয় করা থাকে এবং not_features সেটে নির্দিষ্ট করা সমস্ত বৈশিষ্ট্য নিষ্ক্রিয় থাকে। যদি with_features নির্দিষ্ট করা না থাকে, তাহলে নির্দিষ্ট করা প্রতিটি কর্মের জন্য পতাকা সেট নিঃশর্তভাবে প্রয়োগ করা হবে। |
কর্ম
অ্যাকশনগুলি এমন পরিস্থিতিতে পরিবর্তন করার নমনীয়তা প্রদান করে যার অধীনে একটি অ্যাকশন কীভাবে চালানো হবে তা অনুমান না করেই কার্যকর করা হয়। একটি action_config
টুল বাইনারি নির্দিষ্ট করে যেটি একটি অ্যাকশন আহ্বান করে, যখন একটি feature
কনফিগারেশন (পতাকা) নির্দিষ্ট করে যা নির্ধারণ করে যে ক্রিয়াটি আহ্বান করার সময় সেই টুলটি কীভাবে আচরণ করে।
ব্যাজেল অ্যাকশনগুলি কোন ব্যাজেল অ্যাকশনগুলিকে প্রভাবিত করে তা সংকেত দিতে বৈশিষ্ট্যগুলি উল্লেখ করে কারণ অ্যাকশনগুলি Bazel অ্যাকশন গ্রাফ পরিবর্তন করতে পারে৷ CcToolchainConfigInfo
প্রদানকারীতে এমন ক্রিয়া রয়েছে যেগুলির সাথে যুক্ত পতাকা এবং সরঞ্জাম রয়েছে, যেমন c++-compile
। পতাকাগুলিকে একটি বৈশিষ্ট্যের সাথে সংযুক্ত করে প্রতিটি ক্রিয়াকে বরাদ্দ করা হয়৷
প্রতিটি কর্মের নাম Bazel দ্বারা সম্পাদিত একক ধরনের ক্রিয়াকে প্রতিনিধিত্ব করে, যেমন কম্পাইল করা বা লিঙ্ক করা। যাইহোক, অ্যাকশন এবং ব্যাজেল অ্যাকশন টাইপের মধ্যে বহু-থেকে-এক সম্পর্ক রয়েছে, যেখানে একটি ব্যাজেল অ্যাকশন টাইপ একটি জাভা ক্লাসকে বোঝায় যা একটি অ্যাকশন (যেমন CppCompileAction
) প্রয়োগ করে। বিশেষ করে, নীচের সারণীতে "অ্যাসেম্বলার অ্যাকশন" এবং "কম্পাইলার অ্যাকশন" হল CppCompileAction
, যেখানে লিঙ্ক অ্যাকশনগুলি হল CppLinkAction
।
সংযোজনকারী কর্ম
কর্ম | বর্ণনা |
preprocess-assemble | প্রিপ্রসেসিং দিয়ে একত্রিত করুন। সাধারণত .S ফাইলের জন্য। |
assemble | প্রিপ্রসেসিং ছাড়াই একত্রিত করুন। সাধারণত .s ফাইলের জন্য। |
কম্পাইলার কর্ম
কর্ম | বর্ণনা |
cc-flags-make-variable | CC_FLAGS কে জেনরুলে প্রচার করে। |
c-compile | সি হিসাবে কম্পাইল করুন। |
c++-compile | C++ হিসেবে কম্পাইল করুন। |
c++-header-parsing | হেডারটি স্বয়ংসম্পূর্ণ কিনা তা নিশ্চিত করতে একটি হেডার ফাইলে কম্পাইলারের পার্সার চালান, কারণ এটি অন্যথায় সংকলন ত্রুটি তৈরি করবে। শুধুমাত্র মডিউল সমর্থন করে এমন টুলচেইনে প্রযোজ্য। |
লিঙ্ক কর্ম
কর্ম | বর্ণনা |
c++-link-dynamic-library | একটি শেয়ার্ড লাইব্রেরি লিঙ্ক করুন যাতে এর সমস্ত নির্ভরতা রয়েছে। |
c++-link-nodeps-dynamic-library | শুধুমাত্র cc_library উৎস সমন্বিত একটি শেয়ার করা লাইব্রেরি লিঙ্ক করুন। |
c++-link-executable | চালানোর জন্য একটি চূড়ান্ত লাইব্রেরি লিঙ্ক করুন। |
এআর অ্যাকশন
AR অ্যাকশনগুলি আর্কাইভ লাইব্রেরিতে (. .a
ফাইল) অবজেক্ট ফাইলগুলিকে ar
এর মাধ্যমে একত্রিত করে এবং নামের মধ্যে কিছু শব্দার্থ এনকোড করে।
কর্ম | বর্ণনা |
c++-link-static-library | একটি স্ট্যাটিক লাইব্রেরি (আর্কাইভ) তৈরি করুন। |
LTO কর্ম
কর্ম | বর্ণনা |
lto-backend | ThinLTO অ্যাকশন বিটকোডগুলিকে নেটিভ অবজেক্টে কম্পাইল করে। |
lto-index | ThinLTO অ্যাকশন তৈরি করে গ্লোবাল ইনডেক্স। |
action_config ব্যবহার করে
action_config
হল একটি স্টারলার্ক স্ট্রাকট যা একটি ব্যাজেল অ্যাকশনকে বর্ণনা করে যা অ্যাকশনের সময় ব্যবহার করার জন্য টুল (বাইনারী) উল্লেখ করে এবং বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত ফ্ল্যাগের সেট। এই ফ্ল্যাগগুলি ক্রিয়া সম্পাদনে বাধা প্রয়োগ করে৷
action_config()
কনস্ট্রাক্টরের নিম্নলিখিত পরামিতি রয়েছে:
বৈশিষ্ট্য | বর্ণনা |
action_name | Bazel অ্যাকশন যার সাথে এই ক্রিয়াটি মিলে যায়৷ Bazel এই বৈশিষ্ট্যটি ব্যবহার করে পার-অ্যাকশন টুল এবং এক্সিকিউশনের প্রয়োজনীয়তা আবিষ্কার করতে। |
tools | আহবান করার জন্য নির্বাহযোগ্য। অ্যাকশনে প্রয়োগ করা টুলটি হবে ফিচার কনফিগারেশনের সাথে মেলে এমন একটি ফিচার সেট সহ তালিকার প্রথম টুল। ডিফল্ট মান প্রদান করা আবশ্যক. |
flag_sets | পতাকার একটি তালিকা যা কর্মের একটি গ্রুপে প্রযোজ্য। একটি বৈশিষ্ট্য জন্য একই. |
env_sets | পরিবেশের সীমাবদ্ধতার একটি তালিকা যা কর্মের একটি গোষ্ঠীতে প্রযোজ্য। একটি বৈশিষ্ট্য জন্য একই. |
একটি action_config
এর প্রয়োজন হতে পারে এবং পূর্বে বর্ণিত বৈশিষ্ট্য সম্পর্কের দ্বারা নির্দেশিত অন্যান্য বৈশিষ্ট্য এবং action_config
গুলিকে বোঝাতে পারে। এই আচরণটি একটি বৈশিষ্ট্যের মতোই।
শেষ দুটি বৈশিষ্ট্য বৈশিষ্ট্যের সংশ্লিষ্ট বৈশিষ্ট্যগুলির বিপরীতে অপ্রয়োজনীয় এবং অন্তর্ভুক্ত করা হয়েছে কারণ কিছু Bazel অ্যাকশনের জন্য নির্দিষ্ট ফ্ল্যাগ বা পরিবেশের ভেরিয়েবলের প্রয়োজন হয় এবং লক্ষ্য হল অপ্রয়োজনীয় action_config
+ feature
জোড়া এড়ানো। সাধারণত, একাধিক action_config
s জুড়ে একটি একক বৈশিষ্ট্য ভাগ করা পছন্দনীয়।
আপনি একই action_name
মধ্যে একই action_name দিয়ে একাধিক action_config
সংজ্ঞায়িত করতে পারবেন না। এটি টুল পাথগুলিতে অস্পষ্টতা প্রতিরোধ করে এবং action_config
এর পিছনে উদ্দেশ্যকে প্রয়োগ করে - যে একটি অ্যাকশনের বৈশিষ্ট্যগুলি টুলচেইনের একক জায়গায় স্পষ্টভাবে বর্ণনা করা হয়।
টুল কনস্ট্রাক্টর ব্যবহার করে
একটি action_config
তার tools
প্যারামিটারের মাধ্যমে টুলগুলির একটি সেট নির্দিষ্ট করতে পারে। tool()
কনস্ট্রাক্টর নিম্নলিখিত পরামিতিগুলি গ্রহণ করে:
মাঠ | বর্ণনা |
tool_path | প্রশ্নে থাকা টুলের পাথ (বর্তমান অবস্থানের সাথে সম্পর্কিত)। |
with_features | বৈশিষ্ট্যের একটি তালিকা যার মধ্যে অন্তত একজনকে এই টুলটি প্রয়োগ করার জন্য সন্তুষ্ট হতে হবে। |
একটি প্রদত্ত action_config
এর জন্য, শুধুমাত্র একটি একক tool
তার টুল পাথ এবং এক্সিকিউশন প্রয়োজনীয়তাগুলি Bazel অ্যাকশনে প্রয়োগ করে। বৈশিষ্ট্য কনফিগারেশনের সাথে মিলে যাওয়া with_feature
সেট সহ একটি টুল পাওয়া না যাওয়া পর্যন্ত একটি action_config
এ tools
অ্যাট্রিবিউটের মাধ্যমে পুনরাবৃত্তি করে একটি টুল নির্বাচন করা হয় (আরো তথ্যের জন্য এই পৃষ্ঠায় আগে বৈশিষ্ট্য সম্পর্ক দেখুন)। আপনার টুল তালিকাগুলি একটি ডিফল্ট টুল দিয়ে শেষ করা উচিত যা একটি খালি বৈশিষ্ট্য কনফিগারেশনের সাথে সম্পর্কিত।
উদাহরণ ব্যবহার
বিভিন্ন ক্রস-প্ল্যাটফর্ম শব্দার্থবিদ্যা সহ Bazel অ্যাকশন বাস্তবায়নের জন্য বৈশিষ্ট্য এবং ক্রিয়াগুলি একসাথে ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ, macOS-এ ডিবাগ সিম্বল জেনারেশনের জন্য কম্পাইল অ্যাকশনে সিম্বল তৈরি করতে হবে, তারপর কম্প্রেসড dsym আর্কাইভ তৈরি করতে লিঙ্ক অ্যাকশনের সময় একটি বিশেষ টুল ব্যবহার করতে হবে, এবং তারপর সেই আর্কাইভটিকে ডিকম্প্রেস করে অ্যাপ্লিকেশান বান্ডেল তৈরি করতে হবে এবং .plist
ফাইলগুলি Xcode দ্বারা ব্যবহারযোগ্য।
Bazel-এর সাথে, এই প্রক্রিয়াটি পরিবর্তে নিম্নরূপ প্রয়োগ করা যেতে পারে, unbundle-debuginfo
একটি Bazel অ্যাকশন হচ্ছে:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
config_name = ACTION_NAMES.cpp_link_executable,
action_name = ACTION_NAMES.cpp_link_executable,
tools = [
tool(
with_features = [
with_feature(features=["generate-debug-symbols"]),
],
tool_path = "toolchain/mac/ld-with-dsym-packaging",
),
tool (tool_path = "toolchain/mac/ld"),
],
),
]
features = [
feature(
name = "generate-debug-symbols",
flag_sets = [
flag_set (
actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile
],
flag_groups = [
flag_group(
flags = ["-g"],
),
],
)
],
implies = ["unbundle-debuginfo"],
),
]
এই একই বৈশিষ্ট্যটি লিনাক্সের জন্য সম্পূর্ণ ভিন্নভাবে প্রয়োগ করা যেতে পারে, যা fission
ব্যবহার করে, অথবা উইন্ডোজের জন্য, যা .pdb
ফাইল তৈরি করে। উদাহরণ স্বরূপ, fission
-ভিত্তিক ডিবাগ সিম্বল জেনারেশনের বাস্তবায়ন নিম্নরূপ দেখতে পারে:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
name = ACTION_NAMES.cpp_compile,
tools = [
tool(
tool_path = "toolchain/bin/gcc",
),
],
),
]
features = [
feature (
name = "generate-debug-symbols",
requires = [with_feature_set(features = ["dbg"])],
flag_sets = [
flag_set(
actions = [ACTION_NAMES.cpp_compile],
flag_groups = [
flag_group(
flags = ["-gsplit-dwarf"],
),
],
),
flag_set(
actions = [ACTION_NAMES.cpp_link_executable],
flag_groups = [
flag_group(
flags = ["-Wl", "--gdb-index"],
),
],
),
],
),
]
পতাকা গ্রুপ
CcToolchainConfigInfo
আপনাকে একটি নির্দিষ্ট উদ্দেশ্য পরিবেশন করে এমন গোষ্ঠীগুলিতে পতাকা বান্ডিল করার অনুমতি দেয়। আপনি ফ্ল্যাগ মানের মধ্যে পূর্ব-নির্ধারিত ভেরিয়েবল ব্যবহার করে একটি পতাকা নির্দিষ্ট করতে পারেন, যা বিল্ড কমান্ডে পতাকা যোগ করার সময় কম্পাইলার প্রসারিত করে। উদাহরণ স্বরূপ:
flag_group (
flags = ["%{output_file_path}"],
)
এই ক্ষেত্রে, পতাকার বিষয়বস্তু কর্মের আউটপুট ফাইল পাথ দ্বারা প্রতিস্থাপিত হবে।
পতাকা গোষ্ঠীগুলিকে বিল্ড কমান্ডে প্রসারিত করা হয় যে ক্রমে তারা তালিকায় প্রদর্শিত হয়, উপরে-থেকে-নিচে, বাম-থেকে-ডানে।
বিল্ড কমান্ডে যোগ করার সময় বিভিন্ন মানের সাথে পুনরাবৃত্তি করা প্রয়োজন এমন পতাকার জন্য, ফ্ল্যাগ গ্রুপ টাইপ list
ভেরিয়েবলগুলিকে পুনরাবৃত্তি করতে পারে। উদাহরণস্বরূপ, প্রকার list
পরিবর্তনশীল include_path
:
flag_group (
iterate_over = "include_paths",
flags = ["-I%{include_paths}"],
)
অন্তর্ভুক্ত_পথ তালিকার প্রতিটি পাথ উপাদানের জন্য include_paths
-I<path>
এ প্রসারিত হয়। একটি পতাকা গোষ্ঠী ঘোষণার মূল অংশে সমস্ত পতাকা (বা flag_group
) একটি ইউনিট হিসাবে প্রসারিত হয়। উদাহরণ স্বরূপ:
flag_group (
iterate_over = "include_paths",
flags = ["-I", "%{include_paths}"],
)
অন্তর্ভুক্ত_পথ তালিকার প্রতিটি পাথ উপাদানের জন্য include_paths
-I <path>
এ প্রসারিত হয়।
একটি ভেরিয়েবল একাধিকবার পুনরাবৃত্তি করতে পারে। উদাহরণ স্বরূপ:
flag_group (
iterate_over = "include_paths",
flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)
এতে প্রসারিত হয়:
-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
ভেরিয়েবলগুলি ডট-নোটেশন ব্যবহার করে অ্যাক্সেসযোগ্য কাঠামোর সাথে মিলিত হতে পারে। উদাহরণ স্বরূপ:
flag_group (
flags = ["-l%{libraries_to_link.name}"],
)
স্ট্রাকচারগুলি নেস্ট করা যেতে পারে এবং এতে সিকোয়েন্সও থাকতে পারে। নামের সংঘর্ষ রোধ করতে এবং স্পষ্ট হওয়ার জন্য, আপনাকে অবশ্যই ক্ষেত্রগুলির মাধ্যমে সম্পূর্ণ পথ নির্দিষ্ট করতে হবে। উদাহরণ স্বরূপ:
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
],
)
শর্তাধীন সম্প্রসারণ
ফ্ল্যাগ গোষ্ঠীগুলি expand_if_available
, expand_if_not_available
, expand_if_true
, expand_if_false
, বা expand_if_equal
বৈশিষ্ট্যগুলি ব্যবহার করে একটি নির্দিষ্ট ভেরিয়েবল বা এর ক্ষেত্রের উপস্থিতির উপর ভিত্তি করে শর্তাধীন সম্প্রসারণ সমর্থন করে৷ উদাহরণ স্বরূপ:
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flag_groups = [
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--whole_archive"],
),
flag_group (
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--no_whole_archive"],
),
],
),
],
)
CcToolchainConfigInfo রেফারেন্স
এই বিভাগটি সফলভাবে C++ নিয়মগুলি কনফিগার করার জন্য প্রয়োজনীয় বিল্ড ভেরিয়েবল, বৈশিষ্ট্য এবং অন্যান্য তথ্যের একটি রেফারেন্স প্রদান করে।
CcToolchainConfigInfo বিল্ড ভেরিয়েবল
CcToolchainConfigInfo
বিল্ড ভেরিয়েবলের একটি রেফারেন্স।
পরিবর্তনশীল | কর্ম | বর্ণনা |
source_file | কম্পাইল | কম্পাইল করার জন্য সোর্স ফাইল। |
input_file | ফালা | স্ট্রিপ করার জন্য আর্টিফ্যাক্ট। |
output_file | কম্পাইল | সংকলন আউটপুট। |
output_assembly_file | কম্পাইল | নির্গত সমাবেশ ফাইল. শুধুমাত্র তখনই প্রযোজ্য যখন compile অ্যাকশন অ্যাসেম্বলি টেক্সট নির্গত করে, সাধারণত --save_temps পতাকা ব্যবহার করার সময়। বিষয়বস্তু output_file এর মতই। |
output_preprocess_file | কম্পাইল | প্রি-প্রসেসড আউটপুট। শুধুমাত্র কম্পাইল অ্যাকশনের ক্ষেত্রে প্রযোজ্য যা শুধুমাত্র সোর্স ফাইলগুলিকে প্রিপ্রসেস করে, সাধারণত --save_temps পতাকা ব্যবহার করার সময়। বিষয়বস্তু output_file এর মতই। |
includes | কম্পাইল | ফাইলের ক্রম কম্পাইলারকে অবশ্যই কম্পাইল করা উৎসে নিঃশর্তভাবে অন্তর্ভুক্ত করতে হবে। |
include_paths | কম্পাইল | সিকোয়েন্স ডিরেক্টরি যেখানে কম্পাইলার #include<foo.h> এবং #include "foo.h" ব্যবহার করে শিরোনাম অনুসন্ধান করে। |
quote_include_paths | কম্পাইল | -iquote এর সিকোয়েন্স অন্তর্ভুক্ত - ডিরেক্টরি যেখানে কম্পাইলার #include "foo.h" ব্যবহার করে অন্তর্ভুক্ত হেডারগুলির জন্য অনুসন্ধান করে। |
system_include_paths | কম্পাইল | -isystem এর সিকোয়েন্স অন্তর্ভুক্ত - ডিরেক্টরি যেখানে কম্পাইলার #include <foo.h> ব্যবহার করে অন্তর্ভুক্ত হেডার অনুসন্ধান করে। |
dependency_file | কম্পাইল | কম্পাইলার দ্বারা উত্পন্ন .d নির্ভরতা ফাইল। |
preprocessor_defines | কম্পাইল | defines ক্রম, যেমন --DDEBUG । |
pic | কম্পাইল | অবস্থান-স্বাধীন কোড হিসাবে আউটপুট কম্পাইল করে। |
gcov_gcno_file | কম্পাইল | gcov কভারেজ ফাইল। |
per_object_debug_info_file | কম্পাইল | প্রতি-অবজেক্ট ডিবাগ তথ্য ( .dwp ) ফাইল। |
stripotps | ফালা | stripopts ক্রম। |
legacy_compile_flags | কম্পাইল | compiler_flag , optional_compiler_flag , cxx_flag , এবং optional_cxx_flag cxx_flag এর মতো লিগ্যাসি CROSSTOOL ক্ষেত্র থেকে পতাকার ক্রম। |
user_compile_flags | কম্পাইল | copt নিয়ম বৈশিষ্ট্য বা --copt , --cxxopt , এবং --conlyopt পতাকা থেকে পতাকার ক্রম। |
unfiltered_compile_flags | কম্পাইল | unfiltered_cxx_flag লিগ্যাসি CROSSTOOL ক্ষেত্র বা unfiltered_compile_flags বৈশিষ্ট্য থেকে পতাকার ক্রম। এগুলি nocopts নিয়ম বৈশিষ্ট্য দ্বারা ফিল্টার করা হয় না। |
sysroot | sysroot । | |
runtime_library_search_directories | লিঙ্ক | লিঙ্কার রানটাইম অনুসন্ধান পাথে এন্ট্রি (সাধারণত -rpath পতাকা দিয়ে সেট করা হয়)। |
library_search_directories | লিঙ্ক | লিঙ্কার অনুসন্ধানের পথে এন্ট্রি (সাধারণত -L পতাকা দিয়ে সেট করা হয়)। |
libraries_to_link | লিঙ্ক | লিঙ্কার আহ্বানে ইনপুট হিসাবে লিঙ্ক করার জন্য ফাইলগুলি প্রদান করে পতাকা। |
def_file_path | লিঙ্ক | MSVC সহ উইন্ডোজে ব্যবহৃত def ফাইলের অবস্থান। |
linker_param_file | লিঙ্ক | কমান্ড লাইনের দৈর্ঘ্যের সীমা অতিক্রম করতে বেজেল দ্বারা তৈরি লিঙ্কার প্যারাম ফাইলের অবস্থান। |
output_execpath | লিঙ্ক | লিঙ্কারের আউটপুটের Execpath। |
generate_interface_library | লিঙ্ক | "yes" বা "no" ইন্টারফেস লাইব্রেরি তৈরি করা উচিত কিনা তার উপর নির্ভর করে। |
interface_library_builder_path | লিঙ্ক | ইন্টারফেস লাইব্রেরি বিল্ডার টুলের পথ। |
interface_library_input_path | লিঙ্ক | ইন্টারফেস লাইব্রেরি ifso বিল্ডার টুলের জন্য ইনপুট। |
interface_library_output_path | লিঙ্ক | ifso বিল্ডার টুল ব্যবহার করে ইন্টারফেস লাইব্রেরি তৈরি করার পথ। |
legacy_link_flags | লিঙ্ক | লিগ্যাসি CROSSTOOL ক্ষেত্রগুলি থেকে আসছে লিঙ্কার পতাকা৷ |
user_link_flags | লিঙ্ক | লিঙ্কার পতাকাগুলি --linkopt বা linkopts অ্যাট্রিবিউট থেকে আসছে। |
linkstamp_paths | লিঙ্ক | একটি বিল্ড পরিবর্তনশীল লিঙ্কস্ট্যাম্প পাথ প্রদান করে। |
force_pic | লিঙ্ক | এই ভেরিয়েবলের উপস্থিতি নির্দেশ করে যে PIC/PIE কোড তৈরি করা উচিত (Bazel বিকল্প `--force_pic` পাস করা হয়েছিল)। |
strip_debug_symbols | লিঙ্ক | এই ভেরিয়েবলের উপস্থিতি নির্দেশ করে যে ডিবাগ চিহ্নগুলি ছিনতাই করা উচিত। |
is_cc_test | লিঙ্ক | সত্য যখন বর্তমান অ্যাকশন একটি cc_test লিঙ্কিং অ্যাকশন হয়, অন্যথায় মিথ্যা। |
is_using_fission | কম্পাইল, লিঙ্ক | এই ভেরিয়েবলের উপস্থিতি নির্দেশ করে যে বিদারণ (প্রতি বস্তুর ডিবাগ তথ্য) সক্রিয় করা হয়েছে। ডিবাগ তথ্য .o ফাইলের পরিবর্তে .dwo ফাইলে থাকবে এবং কম্পাইলার এবং লিঙ্কারকে এটি জানতে হবে .o |
fdo_instrument_path | কম্পাইল, লিঙ্ক | ডিরেক্টরির পাথ যা FDO ইন্সট্রুমেন্টেশন প্রোফাইল সঞ্চয় করে। |
fdo_profile_path | কম্পাইল | FDO প্রোফাইলের পথ। |
fdo_prefetch_hints_path | কম্পাইল | ক্যাশে প্রিফেচ প্রোফাইলের পথ। |
csfdo_instrument_path | কম্পাইল, লিঙ্ক | প্রসঙ্গ সংবেদনশীল FDO ইন্সট্রুমেন্টেশন প্রোফাইল সঞ্চয় করে এমন ডিরেক্টরির পথ। |
সুপরিচিত বৈশিষ্ট্য
নিম্নলিখিত বৈশিষ্ট্য এবং তাদের সক্রিয়করণ শর্তাবলী একটি রেফারেন্স.
বৈশিষ্ট্য | ডকুমেন্টেশন |
opt | dbg | fastbuild | কম্পাইলেশন মোডের উপর ভিত্তি করে ডিফল্টরূপে সক্রিয় করা হয়েছে। |
static_linking_mode | dynamic_linking_mode | লিঙ্কিং মোডের উপর ভিত্তি করে ডিফল্টরূপে সক্রিয়। |
per_object_debug_info | যদি supports_fission বৈশিষ্ট্য নির্দিষ্ট করা থাকে এবং সক্রিয় করা হয় এবং বর্তমান সংকলন মোড --fission পতাকায় নির্দিষ্ট করা থাকে তাহলে সক্রিয় করা হবে। |
supports_start_end_lib | যদি সক্রিয় থাকে (এবং বিকল্প --start_end_lib সেট করা থাকে), Bazel স্ট্যাটিক লাইব্রেরির সাথে লিঙ্ক করবে না বরং বস্তুর সাথে সরাসরি লিঙ্ক করতে --start-lib/--end-lib লিঙ্কার বিকল্পগুলি ব্যবহার করবে। এটি বিল্ডের গতি বাড়ায় কারণ বেজেলকে স্ট্যাটিক লাইব্রেরি তৈরি করতে হবে না। |
supports_interface_shared_libraries | যদি সক্ষম করা থাকে (এবং বিকল্প --interface_shared_objects সেট করা থাকে), Bazel সেই লক্ষ্যগুলিকে লিঙ্ক করবে linkstatic সেট করা আছে False ( cc_test s) ইন্টারফেস শেয়ার করা লাইব্রেরির বিরুদ্ধে। এটি ক্রমবর্ধমান পুনরায় লিঙ্কিং দ্রুত করে তোলে। |
supports_dynamic_linker | সক্ষম হলে, C++ নিয়মগুলি জানবে যে টুলচেন ভাগ করা লাইব্রেরি তৈরি করতে পারে। |
static_link_cpp_runtimes | সক্ষম হলে, Bazel স্ট্যাটিক লিঙ্কিং মোডে এবং ডাইনামিক লিঙ্কিং মোডে গতিশীলভাবে C++ রানটাইম লিঙ্ক করবে। cc_toolchain.static_runtime_lib বা cc_toolchain.dynamic_runtime_lib অ্যাট্রিবিউটে (লিঙ্কিং মোডের উপর নির্ভর করে) উল্লেখ করা আর্টিফ্যাক্টগুলি লিঙ্কিং অ্যাকশনে যোগ করা হবে। |
supports_pic | সক্ষম হলে, টুলচেন গতিশীল লাইব্রেরির জন্য PIC বস্তু ব্যবহার করতে জানবে। যখনই PIC সংকলনের প্রয়োজন হয় তখনই `pic` ভেরিয়েবল উপস্থিত থাকে। ডিফল্টরূপে সক্ষম না হলে, এবং `--force_pic` পাস করা হলে, Bazel `supports_pic`-এর অনুরোধ করবে এবং বৈশিষ্ট্যটি সক্ষম আছে কিনা তা যাচাই করবে। যদি বৈশিষ্ট্যটি অনুপস্থিত থাকে, বা সক্ষম করা যায়নি, `--force_pic` ব্যবহার করা যাবে না। |
static_linking_mode | dynamic_linking_mode | লিঙ্কিং মোডের উপর ভিত্তি করে ডিফল্টরূপে সক্রিয়। |
no_legacy_features | উপস্থিত থাকা অবস্থায় C++ কনফিগারেশনে লিগ্যাসি বৈশিষ্ট্য যোগ করা থেকে Bazel-কে বাধা দেয়। নীচের বৈশিষ্ট্যগুলির সম্পূর্ণ তালিকা দেখুন। |
উত্তরাধিকার বৈশিষ্ট্য প্যাচিং যুক্তি
Bazel পিছনের সামঞ্জস্যের জন্য টুলচেইনের বৈশিষ্ট্যগুলিতে নিম্নলিখিত পরিবর্তনগুলি প্রয়োগ করে:
-
legacy_compile_flags
বৈশিষ্ট্যটিকে টুলচেইনের শীর্ষে নিয়ে যায় -
default_compile_flags
বৈশিষ্ট্যটিকে টুলচেইনের শীর্ষে নিয়ে যায় - টুলচেইনের শীর্ষে
dependency_file
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে - টুলচেইনের শীর্ষে
pic
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
per_object_debug_info
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে - টুলচেইনের শীর্ষে
preprocessor_defines
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
includes
শীর্ষে (যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
include_paths
শীর্ষে অন্তর্ভুক্ত_পথ (যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
fdo_instrument
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
fdo_optimize
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
cs_fdo_instrument
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
cs_fdo_optimize
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
fdo_prefetch_hints
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
autofdo
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
build_interface_libraries
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
dynamic_library_linker_tool
শীর্ষে ডাইনামিক_লাইব্রেরি_লিংকার_টুল (যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
shared_flag
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
linkstamps
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
output_execpath_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
runtime_library_search_directories
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
library_search_directories
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে - টুলচেইনের শীর্ষে
archiver_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে - টুলচেইনের শীর্ষে
libraries_to_link
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
force_pic_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
user_link_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
legacy_link_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
static_libgcc
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
fission_support
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
strip_debug_symbols
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে - টুলচেইনের শীর্ষে
coverage
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
llvm_coverage_map_format
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
gcc_coverage_map_format
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে -
fully_static_link
নীচে সম্পূর্ণ_স্ট্যাটিক_লিংক (যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে - টুলচেইনের নীচে
user_compile_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে - টুলচেইনের নীচে
sysroot
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে -
unfiltered_compile_flags
নীচে আনফিল্টারড_কম্পাইল_ফ্ল্যাগ (যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে - টুলচেইনের নীচে
linker_param_file
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে - টুলচেইনের নীচে
compiler_input_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যোগ করে - টুলচেইনের নীচে
compiler_output_flags
(যদি উপস্থিত না থাকে) বৈশিষ্ট্য যুক্ত করে
এটি বৈশিষ্ট্যগুলির একটি দীর্ঘ তালিকা। স্টারলার্কের ক্রসস্টুল হয়ে গেলে তাদের পরিত্রাণ পাওয়ার পরিকল্পনা। কৌতূহলী পাঠকের জন্য CppActionConfigs- এ বাস্তবায়ন দেখুন, এবং উত্পাদন টুলচেইনের জন্য টুলচেনটিকে আরও স্বতন্ত্র করতে no_legacy_features
যোগ করার কথা বিবেচনা করুন।