यहां आपको Bazel की मदद से C++ प्रोजेक्ट बनाने के कुछ सबसे सामान्य उदाहरण मिलेंगे. अगर आपने अब तक ऐसा नहीं किया है, तो Bazel की मदद से C++ प्रोजेक्ट बनाना शुरू करें. इसके लिए, Bazel के बारे में जानकारी: C++ प्रोजेक्ट बनाएं ट्यूटोरियल पूरा करें.
cc_library और hdrs हेडर फ़ाइलों के बारे में जानकारी के लिए, cc_library देखें.
किसी टारगेट में एक से ज़्यादा फ़ाइलें शामिल करना
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 का इस्तेमाल किया जा रहा है
{: .external}.
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++ टारगेट, इस नियम पर निर्भर हो सकते हैं.