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

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

यहां C++ प्रोजेक्ट बनाने के लिए, इस्तेमाल किए जाने वाले कुछ सबसे आम उदाहरण दिए गए हैं पेश है. अगर आपने पहले से ऐसा नहीं किया है, तो C++ का इस्तेमाल करके शुरुआत करें ट्यूटोरियल को पूरा करके, Basel के साथ प्रोजेक्ट करते हैं Basel के बारे में जानकारी: C++ प्रोजेक्ट बनाएं.

cc_library और hdrs हेडर फ़ाइलों के बारे में जानकारी पाने के लिए, देखें cc_library शामिल है.

टारगेट में कई फ़ाइलें शामिल करना

आप एक ही टारगेट में कई फ़ाइलों को शामिल कर सकते हैं ग्लोब. उदाहरण के लिए:

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

इस टारगेट के साथ, Basel को इसमें मिलने वाली सभी .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 लाइब्रेरी पर निर्भर करती है, जो flour लाइब्रेरी में.

शामिल किए गए पाथ जोड़ना

कभी-कभी आप फ़ाइल फ़ोल्डर में पाथ शामिल नहीं कर सकते या नहीं करना चाहते रूट डालें. मौजूदा लाइब्रेरी में पहले से ही एक इन्क्लूड डायरेक्ट्री मौजूद हो सकती है, जिसमें इसके पाथ से मैच करें. उदाहरण के लिए, मान लें कि आपके पास डायरेक्ट्री स्ट्रक्चर:

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

बेज़ल 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 का इस्तेमाल किया जा रहा है. WORKSPACE फ़ाइल में मौजूद, रिपॉज़िटरी फ़ंक्शन में से किसी एक का इस्तेमाल करके Google Test डाउनलोड करें और इसे अपने रिपॉज़िटरी में उपलब्ध कराएं:

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 अन्य सभी 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 से जुड़ी हुई है संग्रह की संरचना के एक प्रॉडक्ट के तौर पर. http_archive को बार बनाया जा सकता है strip_prefix एट्रिब्यूट जोड़कर यह प्रीफ़िक्स जोड़ें:

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