Yaygın C++ Derleme Kullanım Alanları

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Burada, Bazel ile C++ projeleri oluşturmaya yönelik en yaygın kullanım alanlarından bazılarını bulabilirsiniz. Henüz yapmadıysanız Introduction to Bazel: Build a C++ Project (Bazel'e Giriş: C++ Projesi Oluşturma) adlı eğitime katılarak Bazel ile C++ projeleri oluşturmaya başlayın.

cc_library ve hdrs üstbilgi dosyaları hakkında bilgi edinmek için cc_library başlıklı makaleyi inceleyin.

Bir hedefe birden fazla dosya ekleme

glob ile tek bir hedefe birden fazla dosya ekleyebilirsiniz. Örneğin:

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

Bu hedefle Bazel, bu hedefi içeren BUILD dosyasıyla aynı dizinde bulduğu tüm .cc ve .h dosyalarını (alt dizinler hariç) oluşturur.

Geçişli dahil etme işlemlerini kullanma

Bir dosya üstbilgi içeriyorsa bu dosyayı kaynak olarak kullanan tüm kurallar (yani srcs, hdrs veya textual_hdrs özelliğinde bu dosyanın bulunduğu kurallar) eklenen üstbilginin kitaplık kuralına bağlı olmalıdır. Buna karşılık, yalnızca doğrudan bağımlılıklar bağımlılık olarak belirtilmelidir. Örneğin, sandwich.h'nın bread.h'ı ve bread.h'ın flour.h'ı içerdiğini varsayalım. sandwich.h flour.h (sandviçinde un olmasını kim ister?) içermediği için BUILD dosyası şöyle görünür:

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"],
)

Burada sandwich kitaplığı, bread kitaplığına, bread kitaplığı ise flour kitaplığına bağlıdır.

Dahil etme yolları ekleme

Bazen yolları çalışma alanı köküne dahil edemezsiniz (veya dahil etmek istemezsiniz). Mevcut kitaplıklar, çalışma alanınızdaki yoluyla eşleşmeyen bir include dizinine sahip olabilir. Örneğin, aşağıdaki dizin yapısına sahip olduğunuzu varsayalım:

└── my-project
    ├── legacy
       └── some_lib
           ├── BUILD
           ├── include
              └── some_lib.h
           └── some_lib.cc
    └── MODULE.bazel

Bazel, some_lib.h öğesinin legacy/some_lib/include/some_lib.h olarak eklenmesini bekler ancak some_lib.cc öğesinin "some_lib.h" içerdiğini varsayalım. Bu include yolunun geçerli olması için legacy/some_lib/BUILD, some_lib/include dizininin bir include dizini olduğunu belirtmelidir:

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

Bu, özellikle harici bağımlılıklar için kullanışlıdır. Aksi takdirde, bunların başlık dosyaları / önekiyle birlikte eklenmelidir.

Harici kitaplıkları dahil etme

Google Test'i kullandığınızı varsayalım. {: .external}. Google Test'i indirmek ve deponuzda kullanılabilir hale getirmek için MODULE.bazel dosyasına bağımlılık ekleyebilirsiniz:

bazel_dep(name = "googletest", version = "1.15.2")

C++ testleri yazma ve çalıştırma

Örneğin, aşağıdaki gibi bir test ./test/hello-test.cc oluşturabilirsiniz:

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

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

Ardından, testleriniz için ./test/BUILD dosyası oluşturun:

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

hello-greet özelliğinin hello-test tarafından görünür olması için ./main/BUILD içindeki visibility özelliğine "//test:__pkg__", eklemeniz gerekir.

Artık testi çalıştırmak için bazel test kullanabilirsiniz.

bazel test test:hello-test

Bu işlem aşağıdaki çıkışı üretir:

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.

Önceden derlenmiş kitaplıklara bağımlılık ekleme

Yalnızca derlenmiş bir sürümüne sahip olduğunuz bir kitaplığı (ör. başlıklar ve bir .so dosyası) kullanmak istiyorsanız bunu bir cc_library kuralına sarın:

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

Bu sayede, çalışma alanınızdaki diğer C++ hedefleri bu kurala bağlı olabilir.