The beans.pot manifest
beans.pot হলো একটা Beans module-এর রুটে বসে থাকা manifest ফাইল। এটা module-এর
নাম রাখে, বলে দেয় module-টা application না library, Git dependency গুলো pin করে,
আর native linker-এর জন্য দরকারি directive পাস করে। এটা parse হয়
compiler/beans/module.b-তে।
Syntax
“Syntax” সেকশনmanifest পুরোটাই লাইন-ভিত্তিক। এটা TOML নয়, JSON-ও নয়। প্রতিটা লাইন একটা
করে directive। খালি লাইন গুলো ধরাই হয় না। আর // দিয়ে শুরু হওয়া লাইন হলো
comment, সেটাও বাদ যায়।
সবচেয়ে ছোট আসল manifest মাত্র এক লাইনের। example project-টা যে beans.pot নিয়ে
আসে, সেটা শুধু এটুকুই:
module shopcompiler-এর নিজের manifest আরো ছোট — শুধু module compiler।
বর্তমান directory-তে ছোট manifest বানাতে
beansc pot init <module-name> চালান। আগে থেকে manifest থাকলে command সেটা
overwrite করে না।
Field গুলো
“Field গুলো” সেকশনmodule <name> (লাগবেই)
“module <name> (লাগবেই)” সেকশনmodule-এর নাম রাখে। ঠিক একটা module লাইন থাকতেই হবে। এই নামটাই হলো
module path: এই রুটটার সাথেই local package আর lock file ঝুলে থাকে।
module shopkind application বা kind library (ইচ্ছা করলে)
“kind application বা kind library (ইচ্ছা করলে)” সেকশনmodule-টা কী বানাচ্ছে সেটা বলে। কিছু না লিখলে ধরে নেয় application।
kind application: module-এ একটাfn main()লাগবে।kind library: module-এmainথাকা যাবে না।
module shopkind applicationএকটা library build কীভাবে একটা .a, একটা .dylib/.so, আর ইচ্ছা করলে একটা C
header বানায় — সেটা দেখুন Building-এ।
require <host/owner/repo> <ref> (যতবার খুশি)
“require <host/owner/repo> <ref> (যতবার খুশি)” সেকশনএকটা করে Git dependency pin করে। path হলো Git host-এর path; ref হলো একটা tag, branch, বা commit-এর মতো কোনো reference।
require github.com/acme/http v1.2একই path দুইটা আলাদা ref-এ pin করলে সেটা error। এর পুরো বিস্তারিত, আর এটা
beans.lock-এ কীভাবে যায় — সব আছে Dependencies আর lock
file-এ।
link <selector> <search|library|framework> "<value>" (যতবার খুশি)
“link <selector> <search|library|framework> "<value>" (যতবার খুশি)” সেকশনC library-র সাথে link করা module-এর জন্য একটা native linker directive পাস করে।
selectorহতে পারেall, একটা OS-এর নাম (যেমনmacos,linux,windows), বা একটা পুরো target triple (যেমনx86_64-unknown-linux-gnu)।- kind এর যেকোনো একটা:
search: একটা library search directory। Search path গুলোbeans.potফাইলের সাপেক্ষে relative।library: link করার একটা library (নাম দিয়ে)।framework: link করার একটা framework (macOS)।
- value হলো quote-এর ভেতর একটা string।
যে order-এ লেখা হবে, linker-এও ঠিক সেই order-এই entry গুলো যাবে।
একটু বড় একটা উদাহরণ
“একটু বড় একটা উদাহরণ” সেকশনmodule shopkind applicationrequire github.com/acme/http v1.2link all search "native/lib"link all library "shop_native"link macos framework "CoreFoundation"link x86_64-unknown-linux-gnu library "platform_helper"এই module-টা একটা application, একটা Git dependency টেনে আনে, আর native/lib-এর
নিচে ship করা একটা native library link করে — তার সাথে একটা macOS framework আর
শুধু Linux-এর জন্য একটা helper।
require কীভাবে beans.lock-এ যায় সেটা দেখুন Dependencies আর lock
file-এ, আর link কীভাবে C interop-এর সাথে খাপ খায় সেটা
দেখুন FFI guide-এ।