সাধারণ C++ বিল্ড ব্যবহারের ক্ষেত্রে

এখানে আপনি Bazel-এর সাহায্যে C++ প্রকল্প নির্মাণের জন্য কিছু সাধারণ ব্যবহারের ক্ষেত্রে পাবেন। আপনি যদি এটি ইতিমধ্যে না করে থাকেন, তাহলে Bazel এর সাথে C++ প্রকল্প তৈরি করা শুরু করুন Bazel-এর ভূমিকা: একটি C++ প্রকল্প তৈরি করুন

cc_library এবং hdrs হেডার ফাইলের তথ্যের জন্য, cc_library দেখুন।

একটি লক্ষ্য একাধিক ফাইল সহ

আপনি গ্লোব সহ একটি একক লক্ষ্যে একাধিক ফাইল অন্তর্ভুক্ত করতে পারেন। উদাহরণ স্বরূপ:

cc_library(
    name = "build-all-the-files",
    srcs = glob(["*.cc"]),
    hdrs = glob(["*.h"]),
)

এই টার্গেটের সাহায্যে, Bazel সমস্ত .cc এবং .h ফাইলগুলি তৈরি করবে যা এটি এই টার্গেট ধারণ করে (সাবডিরেক্টরি ব্যতীত) BUILD ফাইলের মতো একই ডিরেক্টরিতে খুঁজে পাবে।

ট্রানজিটিভ ব্যবহার করা অন্তর্ভুক্ত

যদি একটি ফাইলে একটি শিরোনাম অন্তর্ভুক্ত থাকে, তাহলে সেই ফাইলটি একটি উৎস হিসেবে (অর্থাৎ, srcs , hdrs , বা textual_hdrs অ্যাট্রিবিউটে ফাইলটি থাকা) অন্তর্ভুক্ত হেডারের লাইব্রেরি নিয়মের উপর নির্ভর করবে। বিপরীতভাবে, শুধুমাত্র সরাসরি নির্ভরতা নির্ভরতা হিসাবে নির্দিষ্ট করা প্রয়োজন। উদাহরণ স্বরূপ, ধরুন sandwich.hbread.h এবং bread.h flour.h রয়েছে। sandwich.h flour.h অন্তর্ভুক্ত করে না (কেরা তাদের স্যান্ডউইচে ময়দা চায়?), তাই BUILD ফাইলটি দেখতে এরকম হবে:

cc_library(
    name = "sandwich",
    srcs = ["sandwich.cc"],
    hdrs = ["sandwich.h"],
    deps = [":bread"],
)

cc_library(
    name = "bread",
    srcs = ["bread.cc"],
    hdrs = ["bread.h"],
    deps = [":flour"],
)

cc_library(
    name = "flour",
    srcs = ["flour.cc"],
    hdrs = ["flour.h"],
)

এখানে, sandwich লাইব্রেরি bread লাইব্রেরির উপর নির্ভর করে, যা flour লাইব্রেরির উপর নির্ভর করে।

যোগ করা পাথ অন্তর্ভুক্ত

কখনও কখনও আপনি কার্যক্ষেত্র রুটে পাথ অন্তর্ভুক্ত করতে পারেন না (বা করতে চান না)। বিদ্যমান লাইব্রেরিতে ইতিমধ্যেই একটি অন্তর্ভুক্ত ডিরেক্টরি থাকতে পারে যা আপনার কর্মক্ষেত্রে এর পথের সাথে মেলে না। উদাহরণস্বরূপ, ধরুন আপনার নিম্নলিখিত ডিরেক্টরি কাঠামো রয়েছে:

└── my-project
    ├── legacy
    │   └── some_lib
    │       ├── BUILD
    │       ├── include
    │       │   └── some_lib.h
    │       └── some_lib.cc
    └── WORKSPACE

Bazel আশা করবে some_lib.h কে legacy/some_lib/include/some_lib.h হিসাবে অন্তর্ভুক্ত করা হবে, কিন্তু ধরুন some_lib.cc"some_lib.h" অন্তর্ভুক্ত করা হয়েছে। এটি অন্তর্ভুক্ত করার পথকে বৈধ করতে, legacy/some_lib/BUILD কে নির্দিষ্ট করতে হবে যে some_lib/include ডিরেক্টরি একটি অন্তর্ভুক্ত ডিরেক্টরি:

cc_library(
    name = "some_lib",
    srcs = ["some_lib.cc"],
    hdrs = ["include/some_lib.h"],
    copts = ["-Ilegacy/some_lib/include"],
)

এটি বহিরাগত নির্ভরতার জন্য বিশেষভাবে উপযোগী, কারণ তাদের হেডার ফাইল অন্যথায় একটি / উপসর্গের সাথে অন্তর্ভুক্ত করা আবশ্যক।

বহিরাগত লাইব্রেরি সহ

ধরুন আপনি গুগল টেস্ট ব্যবহার করছেন। আপনি Google টেস্ট ডাউনলোড করতে এবং আপনার সংগ্রহস্থলে উপলব্ধ করতে WORKSPACE ফাইলের একটি সংগ্রহস্থল ফাংশন ব্যবহার করতে পারেন:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "gtest",
    url = "https://github.com/google/googletest/archive/release-1.10.0.zip",
    sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
    build_file = "@//:gtest.BUILD",
)

তারপর gtest.BUILD তৈরি করুন, একটি BUILD ফাইল যা Google টেস্ট কম্পাইল করতে ব্যবহৃত হয়। Google টেস্টের বেশ কিছু "বিশেষ" প্রয়োজনীয়তা রয়েছে যা এর cc_library নিয়মকে আরও জটিল করে তোলে:

  • googletest-release-1.10.0/src/gtest-all.cc #include s googletest-release-1.10.0/src/ এ অন্যান্য সমস্ত ফাইল : ডুপ্লিকেট চিহ্নগুলির জন্য লিঙ্ক ত্রুটি রোধ করতে কম্পাইল থেকে এটি বাদ দিন।

  • এটি googletest-release-1.10.0/include/ ডিরেক্টরি ( "gtest/gtest.h" ) এর সাথে সম্পর্কিত হেডার ফাইলগুলি ব্যবহার করে, তাই আপনাকে অবশ্যই সেই ডিরেক্টরিটি অন্তর্ভুক্ত পাথগুলিতে যুক্ত করতে হবে৷

  • এটি pthread এ লিঙ্ক করতে হবে, তাই এটি একটি linkopt হিসাবে যোগ করুন।

চূড়ান্ত নিয়ম তাই এই মত দেখায়:

cc_library(
    name = "main",
    srcs = glob(
        ["googletest-release-1.10.0/src/*.cc"],
        exclude = ["googletest-release-1.10.0/src/gtest-all.cc"]
    ),
    hdrs = glob([
        "googletest-release-1.10.0/include/**/*.h",
        "googletest-release-1.10.0/src/*.h"
    ]),
    copts = [
        "-Iexternal/gtest/googletest-release-1.10.0/include",
        "-Iexternal/gtest/googletest-release-1.10.0"
    ],
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

এটি কিছুটা অগোছালো: আর্কাইভের কাঠামোর উপজাত হিসাবে googletest-release-1.10.0 এর সাথে প্রিফিক্স করা হয়েছে। আপনি strip_prefix অ্যাট্রিবিউট যোগ করে এই উপসর্গটিকে http_archive স্ট্রিপ করতে পারেন:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "gtest",
    url = "https://github.com/google/googletest/archive/release-1.10.0.zip",
    sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
    build_file = "@//:gtest.BUILD",
    strip_prefix = "googletest-release-1.10.0",
)

তারপর gtest.BUILD দেখতে এরকম হবে:

cc_library(
    name = "main",
    srcs = glob(
        ["src/*.cc"],
        exclude = ["src/gtest-all.cc"]
    ),
    hdrs = glob([
        "include/**/*.h",
        "src/*.h"
    ]),
    copts = ["-Iexternal/gtest/include"],
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

এখন cc_ নিয়ম নির্ভর করতে পারে @gtest//:main উপর।

C++ পরীক্ষা লেখা এবং চালানো

উদাহরণস্বরূপ, আপনি একটি পরীক্ষা ./test/hello-test.cc তৈরি করতে পারেন, যেমন:

#include "gtest/gtest.h"
#include "main/hello-greet.h"

TEST(HelloTest, GetGreet) {
  EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}

তারপর আপনার পরীক্ষার জন্য ./test/BUILD ফাইল তৈরি করুন:

cc_test(
    name = "hello-test",
    srcs = ["hello-test.cc"],
    copts = ["-Iexternal/gtest/include"],
    deps = [
        "@gtest//:main",
        "//main:hello-greet",
    ],
)

hello hello-test test-এ hello-greet দৃশ্যমান করতে, আপনাকে ./main/BUILD-এ visibility বৈশিষ্ট্যে "//test:__ ./main/BUILD "//test:__pkg__", যোগ করতে হবে।

এখন আপনি পরীক্ষা চালানোর জন্য bazel test ব্যবহার করতে পারেন।

bazel test test:hello-test

এটি নিম্নলিখিত আউটপুট উত্পাদন করে:

INFO: Found 1 test target...
Target //test:hello-test up-to-date:
  bazel-bin/test/hello-test
INFO: Elapsed time: 4.497s, Critical Path: 2.53s
//test:hello-test PASSED in 0.3s

Executed 1 out of 1 tests: 1 test passes.

প্রি-কম্পাইল করা লাইব্রেরিতে নির্ভরতা যোগ করা হচ্ছে

আপনি যদি এমন একটি লাইব্রেরি ব্যবহার করতে চান যার আপনার শুধুমাত্র একটি সংকলিত সংস্করণ রয়েছে (উদাহরণস্বরূপ, শিরোনাম এবং একটি .so ফাইল) এটি একটি cc_library নিয়মে মোড়ানো:

cc_library(
    name = "mylib",
    srcs = ["mylib.so"],
    hdrs = ["mylib.h"],
)

এইভাবে, আপনার কর্মক্ষেত্রে অন্যান্য C++ লক্ষ্যগুলি এই নিয়মের উপর নির্ভর করতে পারে।