C++ बिल्ड के इस्तेमाल के सामान्य उदाहरण

यहां आपको 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 {: .external} का इस्तेमाल किया है. MODULE.bazel फ़ाइल में, Google Test पर डिपेंडेंसी जोड़ी जा सकती है. इससे Google Test डाउनलोड हो जाएगा और आपके रिपॉज़िटरी में उपलब्ध हो जाएगा:

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 के लिए दिखाने के लिए, आपको "//test:__pkg__", को visibility एट्रिब्यूट में ./main/BUILD में जोड़ना होगा.

अब टेस्ट चलाने के लिए, 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++ टारगेट, इस नियम पर निर्भर हो सकते हैं.