यहां आपको Bazel की मदद से C++ प्रोजेक्ट बनाने के कुछ सबसे सामान्य उदाहरण मिलेंगे. अगर आपने अब तक ऐसा नहीं किया है, तो Bazel की मदद से C++ प्रोजेक्ट बनाना शुरू करें. इसके लिए, Bazel के बारे में जानकारी: C++ प्रोजेक्ट बनाना ट्यूटोरियल पूरा करें .
cc_library और hdrs हेडर फ़ाइलों के बारे में जानकारी पाने के लिए, cc_library देखें.
किसी टारगेट में कई फ़ाइलें शामिल करना
glob की मदद से, किसी एक टारगेट में कई फ़ाइलें शामिल की जा सकती हैं glob. उदाहरण के लिए:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
इस टारगेट की मदद से, Bazel उसी डायरेक्ट्री में मौजूद सभी .cc और .h फ़ाइलें बनाएगा जिसमें यह टारगेट शामिल करने वाली BUILD फ़ाइल मौजूद है. हालांकि, इसमें सब-डायरेक्ट्री शामिल नहीं होंगी.
ट्रांज़िटिव इन्क्लूड का इस्तेमाल करना
अगर किसी फ़ाइल में हेडर शामिल है, तो उस फ़ाइल को सोर्स के तौर पर इस्तेमाल करने वाले किसी भी नियम (यानी,
उस फ़ाइल का srcs, hdrs, या textual_hdrs एट्रिब्यूट में होना) को शामिल किए गए हेडर के लाइब्रेरी नियम पर निर्भर होना चाहिए. इसके उलट, सिर्फ़ डायरेक्ट डिपेंडेंसी को डिपेंडेंसी के तौर पर तय किया जाना चाहिए. उदाहरण के लिए, मान लें कि sandwich.h में bread.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 लाइब्रेरी पर निर्भर करती है. वहीं, bread लाइब्रेरी, flour लाइब्रेरी पर निर्भर करती है.
इन्क्लूड पाथ जोड़ना
कभी-कभी, वर्कस्पेस के रूट पर इन्क्लूड पाथ रूट नहीं किए जा सकते या ऐसा नहीं किया जाता. हो सकता है कि मौजूदा लाइब्रेरी में पहले से ही कोई इन्क्लूड डायरेक्ट्री मौजूद हो, जो आपके वर्कस्पेस में उसके पाथ से मेल न खाती हो. उदाहरण के लिए, मान लें कि आपके पास डायरेक्ट्री का यह स्ट्रक्चर है:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── MODULE.bazel
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 Test का इस्तेमाल कर रहे हैं.
Google Test डाउनलोड करने और उसे अपने रिपॉज़िटरी में उपलब्ध कराने के लिए, MODULE.bazel फ़ाइल में उसकी डिपेंडेंसी जोड़ी जा सकती है:
bazel_dep(name = "googletest", version = "1.15.2")
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/googletest/include",
"-Iexternal/gtest/googletest",
],
deps = [
"@googletest//:main",
"//main:hello-greet",
],
)
hello-greet को hello-test के लिए दिखाने के लिए, ./main/BUILD में visibility एट्रिब्यूट में
"//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++ टारगेट, इस नियम पर निर्भर हो सकते हैं.